From 3b98b5f4e12e3da7f4b728fa6f1e47ce95caf492 Mon Sep 17 00:00:00 2001 From: Oldperl <44996956+oldperl@users.noreply.github.com> Date: Thu, 6 Oct 2016 15:57:01 +0000 Subject: [PATCH] init svn after crash, last rev before was 433 --- LIZENZ.txt | 293 + README_.txt | 78 + cms/config.php | 52 + cms/css/basic-style.css | 523 + cms/css/conlite-demo.css | 136 + cms/css/index.php | 4 + cms/css/normalize.css | 530 + cms/data/modules/index.php | 4 + cms/dbfs.php | 66 + cms/error.php | 13 + cms/favicon.ico | Bin 0 -> 29038 bytes cms/front_content.php | 949 + cms/front_crcloginform.inc.php | 153 + cms/images/SimpleGallery/ClosePopup.png | Bin 0 -> 2704 bytes cms/images/SimpleGallery/Loading.gif | Bin 0 -> 1849 bytes cms/images/SimpleGallery/NaviLeft.png | Bin 0 -> 1102 bytes cms/images/SimpleGallery/NaviLeftDisabled.png | Bin 0 -> 1106 bytes cms/images/SimpleGallery/NaviRight.png | Bin 0 -> 1074 bytes .../SimpleGallery/NaviRightDisabled.png | Bin 0 -> 1116 bytes .../SimpleGallery/PopupImageNaviLeft.png | Bin 0 -> 2122 bytes .../SimpleGallery/PopupImageNaviRight.png | Bin 0 -> 2162 bytes cms/images/SimpleGallery/ZoomOverlay.png | Bin 0 -> 2583 bytes cms/images/basic-pic1.jpg | Bin 0 -> 149587 bytes cms/images/basic-pic2.jpg | Bin 0 -> 129022 bytes cms/images/basic-pic3.jpg | Bin 0 -> 129079 bytes cms/images/basic-pic4.jpg | Bin 0 -> 54623 bytes cms/images/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes cms/images/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../ico/apple-touch-icon-114-precomposed.png | Bin 0 -> 9686 bytes .../ico/apple-touch-icon-144-precomposed.png | Bin 0 -> 14485 bytes .../ico/apple-touch-icon-57-precomposed.png | Bin 0 -> 2752 bytes .../ico/apple-touch-icon-72-precomposed.png | Bin 0 -> 5609 bytes cms/images/ico/social_icons_sprite.png | Bin 0 -> 26603 bytes cms/images/index.php | 4 + cms/images/logo-small.png | Bin 0 -> 3455 bytes cms/images/logo.png | Bin 0 -> 10376 bytes .../Modules/Contenido_NavMain_Util.class.php | 85 + .../Modules/Contenido_Sitemap_Util.class.php | 66 + cms/includes/class.concache.php | 531 + cms/includes/class.input.helper.php | 573 + cms/includes/concache.php | 170 + cms/includes/functions.include.php | 40 + cms/includes/functions.navigation.php | 572 + cms/includes/rss.inc.php | 59 + cms/includes/rss_php.php | 160 + cms/includes/spider-it.functions.inc.php | 859 + cms/index.php | 5 + cms/js/flexslider/flexslider.css | 71 + cms/js/flexslider/images/bg_direction_nav.png | Bin 0 -> 1866 bytes cms/js/flexslider/images/loader.gif | Bin 0 -> 673 bytes cms/js/flexslider/jquery.flexslider-min.js | 38 + cms/js/index.php | 4 + cms/js/jquery.cookiesdirective.js | 294 + cms/js/libs/jquery-1.9.0.min.js | 4 + cms/js/libs/modernizr-2.6.2.min.js | 4 + cms/js/main.js | 42 + cms/logs/index.php | 4 + cms/robots.txt | 2 + cms/templates/cl_login_form.html | 9 + cms/templates/cms_filelist_style_default.html | 18 + cms/templates/cms_teaser_style_block.html | 11 + cms/templates/cms_teaser_style_blog.html | 11 + cms/templates/contenido_header.html | 6 + cms/templates/footnotes_1.html | 1 + cms/templates/footnotes_2.html | 1 + cms/templates/header.html | 4 + cms/templates/headline_h1.html | 1 + cms/templates/kontaktformular.html | 55 + cms/templates/login_form_loggedin.html | 5 + cms/templates/logo_bottom.html | 1 + cms/templates/navigation_meta_container.html | 4 + cms/templates/navigation_meta_item.html | 3 + cms/templates/navigation_standard.html | 8 + cms/templates/navigation_standard_li.html | 5 + cms/templates/navigation_standard_ul.html | 3 + cms/templates/newsletter_form.html | 31 + cms/templates/newsletter_handler.html | 1 + cms/templates/rss.html | 5 + cms/templates/rss_template.html | 4 + cms/templates/rss_template_breit.html | 7 + cms/templates/search_input.html | 7 + cms/templates/search_output.html | 13 + cms/templates/simple-gallery.html | 137 + cms/templates/sitemap_standard.html | 7 + cms/templates/sitemap_standard_li.html | 5 + cms/templates/sitemap_standard_ul.html | 3 + cms/templates/subheadline_h2.html | 1 + cms/templates/teaser-standard.html | 7 + cms/templates/teaser_right.html | 7 + cms/templates/text_html.html | 3 + cms/upload/Gallery/IMAGE_296.jpg | Bin 0 -> 251656 bytes cms/upload/Gallery/PICT0004.JPG | Bin 0 -> 135998 bytes cms/upload/Gallery/PICT0025.JPG | Bin 0 -> 160647 bytes cms/upload/Gallery/PICT0082.JPG | Bin 0 -> 160199 bytes cms/upload/Gallery/PICT0188.JPG | Bin 0 -> 149404 bytes cms/upload/Gallery/Terasse26.jpg | Bin 0 -> 176634 bytes conlib/auth.inc | 338 + conlib/ct_file.inc | 107 + conlib/ct_ldap.inc | 118 + conlib/ct_null.inc | 72 + conlib/ct_session.inc | 122 + conlib/ct_shm.inc | 117 + conlib/ct_sql.inc | 204 + conlib/db_mysql.inc | 436 + conlib/db_mysqli.inc | 500 + conlib/db_pdo_mysql.inc | 513 + conlib/db_sql_abstract.inc | 804 + conlib/index.php | 4 + conlib/local.php | 896 + conlib/page.inc | 110 + conlib/perm.inc | 678 + conlib/prepend.php | 69 + conlib/session.inc | 536 + conlite/.directory | 4 + conlite/.htaccess_recommended | 30 + conlite/ajaxmain.php | 230 + conlite/backend_search.php | 781 + conlite/cache/deprecated.txt | 2 + .../Contenido_Category.class.php | 904 + .../Contenido_Category_Articles.class.php | 458 + conlite/classes/Contenido_Category/Sample.php | 120 + .../Contenido_FrontendNavigation.class.php | 284 + ...ontenido_FrontendNavigation_Base.class.php | 157 + ...do_FrontendNavigation_Breadcrumb.class.php | 166 + .../Contenido_FrontendNavigation/Sample.php | 126 + conlite/classes/Debug/Debug_DevNull.class.php | 93 + conlite/classes/Debug/Debug_File.class.php | 128 + conlite/classes/Debug/Debug_Hidden.class.php | 110 + conlite/classes/Debug/Debug_Visible.class.php | 146 + .../classes/Debug/Debug_VisibleAdv.class.php | 291 + .../classes/Debug/DebuggerFactory.class.php | 76 + conlite/classes/Debug/IDebug.php | 42 + conlite/classes/Debug/Sample.php | 91 + conlite/classes/Url/Contenido_Url.class.php | 294 + .../UrlBuilder/Contenido_UrlBuilder.class.php | 98 + .../Contenido_UrlBuilderConfig.class.php | 122 + .../Contenido_UrlBuilderFactory.class.php | 80 + .../Contenido_UrlBuilder_Custom.class.php | 98 + .../Contenido_UrlBuilder_CustomPath.class.php | 131 + ...ontenido_UrlBuilder_Frontcontent.class.php | 132 + .../Contenido_UrlBuilder_MR.class.php | 401 + conlite/classes/UrlBuilder/Sample.php | 65 + .../abstract_classes/class.conuser.php | 238 + conlite/classes/cApi/class.action.php | 109 + conlite/classes/cApi/class.stat.php | 80 + conlite/classes/cApi/class.stat_archive.php | 45 + .../classes/cApi/class.system_property.php | 90 + conlite/classes/cApi/class.upload.meta.php | 100 + conlite/classes/cApi/class.upload.php | 185 + conlite/classes/cHTML5/class.chtml.php | 473 + .../classes/cHTML5/class.chtml5.button.php | 50 + .../cHTML5/class.chtml5.list.element.php | 57 + conlite/classes/cHTML5/class.chtml5.list.php | 115 + conlite/classes/cHTML5/class.chtml5.meta.php | 45 + conlite/classes/class.action.php | 148 + conlite/classes/class.activeusers.php | 302 + conlite/classes/class.ajax.php | 237 + conlite/classes/class.area.php | 124 + conlite/classes/class.art.php | 101 + conlite/classes/class.article.collector.php | 267 + conlite/classes/class.article.php | 747 + conlite/classes/class.artspec.php | 85 + conlite/classes/class.autoload.php | 288 + conlite/classes/class.backend.php | 378 + conlite/classes/class.cat.php | 73 + conlite/classes/class.category.php | 138 + conlite/classes/class.cec.php | 539 + conlite/classes/class.cec_hook.php | 423 + conlite/classes/class.chartable.php | 158 + conlite/classes/class.cl_db_backup.php | 337 + conlite/classes/class.client.php | 167 + conlite/classes/class.cms_date.php | 395 + conlite/classes/class.cms_filelist.php | 1140 + conlite/classes/class.cms_teaser.php | 1058 + conlite/classes/class.communications.php | 111 + conlite/classes/class.conuser.php | 895 + conlite/classes/class.csv.php | 81 + conlite/classes/class.dbfs.php | 435 + conlite/classes/class.excel.php | 89 + conlite/classes/class.form.php | 683 + conlite/classes/class.frontend.groups.php | 249 + conlite/classes/class.frontend.logic.php | 85 + .../classes/class.frontend.permissions.php | 169 + conlite/classes/class.frontend.users.php | 233 + conlite/classes/class.genericdb.php | 2211 ++ conlite/classes/class.group.php | 459 + conlite/classes/class.htmlelements.php | 2027 ++ conlite/classes/class.htmlparser.php | 329 + conlite/classes/class.htmlvalidator.php | 214 + conlite/classes/class.httpinputvalidator.php | 297 + conlite/classes/class.input.helper.php | 215 + conlite/classes/class.inuse.php | 294 + conlite/classes/class.iterator.php | 123 + conlite/classes/class.lang.php | 92 + conlite/classes/class.layout.php | 192 + conlite/classes/class.metaobject.php | 390 + conlite/classes/class.navigation.php | 441 + conlite/classes/class.note.php | 404 + conlite/classes/class.notification.php | 236 + conlite/classes/class.output_compressor.php | 217 + conlite/classes/class.phpmailer.php | 32 + conlite/classes/class.properties.php | 501 + conlite/classes/class.purge.php | 432 + conlite/classes/class.request.password.php | 404 + conlite/classes/class.search.php | 1548 ++ conlite/classes/class.security.php | 503 + conlite/classes/class.smtp.php | 1065 + conlite/classes/class.structure.php | 97 + conlite/classes/class.table.php | 378 + conlite/classes/class.template.php | 29 + conlite/classes/class.templateconfig.php | 325 + conlite/classes/class.todo.php | 165 + conlite/classes/class.treeitem.php | 482 + conlite/classes/class.ui.php | 1595 ++ conlite/classes/class.update.notifier.php | 781 + conlite/classes/class.upload.php | 41 + conlite/classes/class.user.php | 842 + conlite/classes/class.version.php | 655 + conlite/classes/class.versionFile.php | 217 + conlite/classes/class.versionImport.php | 296 + conlite/classes/class.versionLayout.php | 180 + conlite/classes/class.versionModule.php | 233 + conlite/classes/class.wysiwyg_editor.php | 108 + conlite/classes/class.xml.php | 361 + conlite/classes/class.xmlparser.php | 616 + conlite/classes/class.xmltree.php | 511 + conlite/classes/class.xsltprocessor.php | 339 + conlite/classes/con2con/class.dirhandler.php | 369 + conlite/classes/con2con/class.filehandler.php | 502 + conlite/classes/con2con/class.registry.php | 220 + conlite/classes/contenido/class.area.php | 92 + conlite/classes/contenido/class.article.php | 75 + .../contenido/class.articlelanguage.php | 144 + conlite/classes/contenido/class.category.php | 73 + .../contenido/class.categoryarticle.php | 74 + .../contenido/class.categorylanguage.php | 116 + .../classes/contenido/class.categorytree.php | 73 + conlite/classes/contenido/class.client.php | 308 + .../classes/contenido/class.clientslang.php | 206 + conlite/classes/contenido/class.container.php | 100 + .../contenido/class.containerconfig.php | 81 + conlite/classes/contenido/class.content.php | 53 + conlite/classes/contenido/class.file.php | 102 + conlite/classes/contenido/class.framefile.php | 97 + conlite/classes/contenido/class.language.php | 133 + conlite/classes/contenido/class.layout.php | 183 + conlite/classes/contenido/class.metatag.php | 48 + conlite/classes/contenido/class.metatype.php | 64 + conlite/classes/contenido/class.module.php | 1241 + conlite/classes/contenido/class.template.php | 84 + .../contenido/class.templateconfig.php | 121 + conlite/classes/contenido/class.type.php | 50 + conlite/classes/contenido/class.user.php | 264 + .../class.content.type.abstract.php | 21 + .../datatypes/class.datatype.currency.php | 88 + .../datatypes/class.datatype.datetime.php | 576 + .../datatypes/class.datatype.number.php | 108 + conlite/classes/datatypes/class.datatype.php | 70 + conlite/classes/drivers/class.gdb.driver.php | 63 + conlite/classes/drivers/drivers.txt | 8 + .../classes/drivers/mysql/class.gdb.mysql.php | 194 + .../classes/exceptions/exception.conuser.php | 30 + .../class.frontend.navigation.abstract.php | 40 + .../navigation/class.frontend.navigation.php | 27 + conlite/classes/index.php | 4 + .../classes/interfaces/interface.conuser.php | 197 + conlite/classes/log/class.log.php | 393 + conlite/classes/log/class.log.writer.file.php | 67 + conlite/classes/log/class.log.writer.php | 127 + conlite/classes/log/class.modulelog.php | 90 + .../class.clAbstractTemplateParser.php | 35 + .../class.clCounterFunctionParser.php | 188 + .../template/class.clIfFunctionParser.php | 251 + .../class.clStrAPIFunctionsParser.php | 86 + conlite/classes/template/class.template.php | 340 + conlite/classes/tree/class.ctree.php | 69 + conlite/classes/tree/class.ctreeitem.php | 774 + .../widgets/class.views.advancedmenu.php | 52 + .../widgets/class.widgets.actionbutton.php | 280 + .../widgets/class.widgets.actionlist.php | 124 + .../classes/widgets/class.widgets.buttons.php | 392 + .../widgets/class.widgets.calendar.php | 464 + .../widgets/class.widgets.datawidgets.php | 333 + .../widgets/class.widgets.datechooser.php | 208 + .../widgets/class.widgets.datefield.php | 64 + .../widgets/class.widgets.dateselect.php | 226 + .../widgets/class.widgets.foldingrow.php | 194 + .../class.widgets.nominaltextfield.php | 127 + .../classes/widgets/class.widgets.page.php | 564 + .../classes/widgets/class.widgets.pager.php | 342 + .../class.widgets.switchabledatechooser.php | 81 + .../widgets/class.widgets.tableedit.php | 198 + .../widgets/class.widgets.treeview.php | 522 + .../classes/widgets/class.widgets.views.php | 296 + conlite/classes/xml/class.xml.base.php | 371 + conlite/classes/xml/class.xml.reader.php | 165 + conlite/classes/xml/class.xml.writer.php | 137 + conlite/classes/xml/class.xml2array.php | 250 + conlite/cronjobs/advance_workflow.php | 106 + conlite/cronjobs/crontab.txt | 8 + conlite/cronjobs/index.php | 4 + conlite/cronjobs/linkchecker.php | 77 + conlite/cronjobs/move_articles.php | 51 + conlite/cronjobs/move_old_stats.php | 61 + conlite/cronjobs/optimize_database.php | 61 + conlite/cronjobs/run_newsletter_job.php | 64 + conlite/cronjobs/send_reminder.php | 115 + conlite/cronjobs/session_cleanup.php | 48 + conlite/cronjobs/setfrontenduserstate.php | 60 + conlite/external/PHPMailer/LICENSE | 504 + conlite/external/PHPMailer/README | 218 + conlite/external/PHPMailer/aboutus.html | 169 + conlite/external/PHPMailer/changelog.txt | 408 + .../external/PHPMailer/class.phpmailer.php | 2320 ++ conlite/external/PHPMailer/class.pop3.php | 407 + conlite/external/PHPMailer/class.smtp.php | 814 + .../docs/Callback_function_notes.txt | 17 + .../PHPMailer/docs/DomainKeys_notes.txt | 55 + .../docs/Note_for_SMTP_debugging.txt | 23 + .../external/PHPMailer/docs/extending.html | 148 + conlite/external/PHPMailer/docs/faq.html | 67 + .../external/PHPMailer/docs/pop3_article.txt | 39 + conlite/external/PHPMailer/docs/use_gmail.txt | 45 + .../external/PHPMailer/examples/contents.html | 20 + .../PHPMailer/examples/images/phpmailer.gif | Bin 0 -> 4756 bytes .../examples/images/phpmailer_mini.gif | Bin 0 -> 1042 bytes .../external/PHPMailer/examples/index.html | 49 + .../PHPMailer/examples/test_db_smtp_basic.php | 58 + .../PHPMailer/examples/test_mail_advanced.php | 31 + .../PHPMailer/examples/test_mail_basic.php | 43 + .../test_pop_before_smtp_advanced.php | 40 + .../examples/test_pop_before_smtp_basic.php | 49 + .../examples/test_sendmail_advanced.php | 34 + .../examples/test_sendmail_basic.php | 45 + .../PHPMailer/examples/test_smtp_advanced.php | 43 + .../examples/test_smtp_advanced_no_auth.php | 37 + .../PHPMailer/examples/test_smtp_basic.php | 58 + .../examples/test_smtp_basic_no_auth.php | 53 + .../examples/test_smtp_gmail_advanced.php | 43 + .../examples/test_smtp_gmail_basic.php | 59 + .../PHPMailer/language/phpmailer.lang-ar.php | 27 + .../PHPMailer/language/phpmailer.lang-br.php | 26 + .../PHPMailer/language/phpmailer.lang-ca.php | 26 + .../PHPMailer/language/phpmailer.lang-ch.php | 26 + .../PHPMailer/language/phpmailer.lang-cz.php | 25 + .../PHPMailer/language/phpmailer.lang-de.php | 25 + .../PHPMailer/language/phpmailer.lang-dk.php | 26 + .../PHPMailer/language/phpmailer.lang-es.php | 26 + .../PHPMailer/language/phpmailer.lang-et.php | 26 + .../PHPMailer/language/phpmailer.lang-fi.php | 27 + .../PHPMailer/language/phpmailer.lang-fo.php | 27 + .../PHPMailer/language/phpmailer.lang-fr.php | 25 + .../PHPMailer/language/phpmailer.lang-hu.php | 25 + .../PHPMailer/language/phpmailer.lang-it.php | 27 + .../PHPMailer/language/phpmailer.lang-ja.php | 26 + .../PHPMailer/language/phpmailer.lang-nl.php | 25 + .../PHPMailer/language/phpmailer.lang-no.php | 25 + .../PHPMailer/language/phpmailer.lang-pl.php | 25 + .../PHPMailer/language/phpmailer.lang-ro.php | 27 + .../PHPMailer/language/phpmailer.lang-ru.php | 25 + .../PHPMailer/language/phpmailer.lang-se.php | 26 + .../PHPMailer/language/phpmailer.lang-tr.php | 27 + .../PHPMailer/language/phpmailer.lang-zh.php | 26 + .../language/phpmailer.lang-zh_cn.php | 26 + conlite/external/PHPMailer/test/contents.html | 10 + .../external/PHPMailer/test/phpmailerTest.php | 670 + conlite/external/PHPMailer/test/test.png | Bin 0 -> 1280 bytes .../external/PHPMailer/test/test_callback.php | 84 + conlite/external/PHPMailer/test/testemail.php | 48 + .../external/backendedit/front_content.php | 982 + conlite/external/edit_area/autocompletion.js | 491 + .../external/edit_area/class.edit_area.php | 264 + conlite/external/edit_area/edit_area.css | 530 + conlite/external/edit_area/edit_area.js | 527 + .../edit_area/edit_area_compressor.php | 428 + .../edit_area/edit_area_compressor_cl.php | 404 + conlite/external/edit_area/edit_area_full.gz | Bin 0 -> 29377 bytes conlite/external/edit_area/edit_area_full.js | 38 + .../external/edit_area/edit_area_functions.js | 1202 + .../external/edit_area/edit_area_loader.js | 1081 + .../external/edit_area/elements_functions.js | 336 + conlite/external/edit_area/highlight.js | 407 + .../edit_area/images/autocompletion.gif | Bin 0 -> 359 bytes conlite/external/edit_area/images/close.gif | Bin 0 -> 102 bytes .../external/edit_area/images/fullscreen.gif | Bin 0 -> 198 bytes .../external/edit_area/images/go_to_line.gif | Bin 0 -> 1053 bytes conlite/external/edit_area/images/help.gif | Bin 0 -> 295 bytes .../external/edit_area/images/highlight.gif | Bin 0 -> 256 bytes conlite/external/edit_area/images/load.gif | Bin 0 -> 1041 bytes conlite/external/edit_area/images/move.gif | Bin 0 -> 257 bytes .../external/edit_area/images/newdocument.gif | Bin 0 -> 170 bytes conlite/external/edit_area/images/opacity.png | Bin 0 -> 147 bytes .../external/edit_area/images/processing.gif | Bin 0 -> 825 bytes conlite/external/edit_area/images/redo.gif | Bin 0 -> 169 bytes .../edit_area/images/reset_highlight.gif | Bin 0 -> 168 bytes conlite/external/edit_area/images/save.gif | Bin 0 -> 285 bytes conlite/external/edit_area/images/search.gif | Bin 0 -> 191 bytes .../edit_area/images/smooth_selection.gif | Bin 0 -> 174 bytes conlite/external/edit_area/images/spacer.gif | Bin 0 -> 43 bytes .../edit_area/images/statusbar_resize.gif | Bin 0 -> 79 bytes conlite/external/edit_area/images/undo.gif | Bin 0 -> 175 bytes .../external/edit_area/images/word_wrap.gif | Bin 0 -> 951 bytes conlite/external/edit_area/keyboard.js | 145 + conlite/external/edit_area/langs/bg.js | 54 + conlite/external/edit_area/langs/cs.js | 48 + conlite/external/edit_area/langs/de.js | 48 + conlite/external/edit_area/langs/dk.js | 48 + conlite/external/edit_area/langs/en.js | 48 + conlite/external/edit_area/langs/eo.js | 48 + conlite/external/edit_area/langs/es.js | 48 + conlite/external/edit_area/langs/fi.js | 48 + conlite/external/edit_area/langs/fr.js | 48 + conlite/external/edit_area/langs/hr.js | 48 + conlite/external/edit_area/langs/it.js | 48 + conlite/external/edit_area/langs/ja.js | 48 + conlite/external/edit_area/langs/mk.js | 48 + conlite/external/edit_area/langs/nl.js | 48 + conlite/external/edit_area/langs/pl.js | 48 + conlite/external/edit_area/langs/pt.js | 48 + conlite/external/edit_area/langs/ru.js | 48 + conlite/external/edit_area/langs/sk.js | 48 + conlite/external/edit_area/langs/zh.js | 48 + conlite/external/edit_area/license_apache.txt | 7 + conlite/external/edit_area/license_bsd.txt | 10 + conlite/external/edit_area/license_lgpl.txt | 458 + conlite/external/edit_area/manage_area.js | 623 + .../edit_area/plugins/charmap/charmap.js | 90 + .../edit_area/plugins/charmap/css/charmap.css | 64 + .../plugins/charmap/images/charmap.gif | Bin 0 -> 245 bytes .../edit_area/plugins/charmap/jscripts/map.js | 373 + .../edit_area/plugins/charmap/langs/bg.js | 12 + .../edit_area/plugins/charmap/langs/cs.js | 6 + .../edit_area/plugins/charmap/langs/de.js | 6 + .../edit_area/plugins/charmap/langs/dk.js | 6 + .../edit_area/plugins/charmap/langs/en.js | 6 + .../edit_area/plugins/charmap/langs/eo.js | 6 + .../edit_area/plugins/charmap/langs/es.js | 6 + .../edit_area/plugins/charmap/langs/fr.js | 6 + .../edit_area/plugins/charmap/langs/hr.js | 6 + .../edit_area/plugins/charmap/langs/it.js | 6 + .../edit_area/plugins/charmap/langs/ja.js | 6 + .../edit_area/plugins/charmap/langs/mk.js | 6 + .../edit_area/plugins/charmap/langs/nl.js | 6 + .../edit_area/plugins/charmap/langs/pl.js | 6 + .../edit_area/plugins/charmap/langs/pt.js | 6 + .../edit_area/plugins/charmap/langs/ru.js | 6 + .../edit_area/plugins/charmap/langs/sk.js | 6 + .../edit_area/plugins/charmap/langs/zh.js | 6 + .../edit_area/plugins/charmap/popup.html | 24 + .../edit_area/plugins/test/css/test.css | 3 + .../edit_area/plugins/test/images/test.gif | Bin 0 -> 87 bytes .../edit_area/plugins/test/langs/bg.js | 10 + .../edit_area/plugins/test/langs/cs.js | 4 + .../edit_area/plugins/test/langs/de.js | 4 + .../edit_area/plugins/test/langs/dk.js | 4 + .../edit_area/plugins/test/langs/en.js | 4 + .../edit_area/plugins/test/langs/eo.js | 4 + .../edit_area/plugins/test/langs/es.js | 4 + .../edit_area/plugins/test/langs/fr.js | 4 + .../edit_area/plugins/test/langs/hr.js | 4 + .../edit_area/plugins/test/langs/it.js | 4 + .../edit_area/plugins/test/langs/ja.js | 4 + .../edit_area/plugins/test/langs/mk.js | 4 + .../edit_area/plugins/test/langs/nl.js | 4 + .../edit_area/plugins/test/langs/pl.js | 4 + .../edit_area/plugins/test/langs/pt.js | 4 + .../edit_area/plugins/test/langs/ru.js | 4 + .../edit_area/plugins/test/langs/sk.js | 4 + .../edit_area/plugins/test/langs/zh.js | 4 + .../external/edit_area/plugins/test/test.js | 110 + .../external/edit_area/plugins/test/test2.js | 1 + conlite/external/edit_area/reg_syntax.js | 166 + .../external/edit_area/reg_syntax/basic.js | 70 + .../edit_area/reg_syntax/brainfuck.js | 45 + conlite/external/edit_area/reg_syntax/c.js | 63 + .../edit_area/reg_syntax/coldfusion.js | 120 + conlite/external/edit_area/reg_syntax/cpp.js | 66 + conlite/external/edit_area/reg_syntax/css.js | 85 + conlite/external/edit_area/reg_syntax/html.js | 51 + conlite/external/edit_area/reg_syntax/java.js | 57 + conlite/external/edit_area/reg_syntax/js.js | 94 + conlite/external/edit_area/reg_syntax/pas.js | 83 + conlite/external/edit_area/reg_syntax/perl.js | 88 + conlite/external/edit_area/reg_syntax/php.js | 157 + .../external/edit_area/reg_syntax/python.js | 145 + .../edit_area/reg_syntax/robotstxt.js | 25 + conlite/external/edit_area/reg_syntax/ruby.js | 68 + conlite/external/edit_area/reg_syntax/sql.js | 56 + conlite/external/edit_area/reg_syntax/tsql.js | 88 + conlite/external/edit_area/reg_syntax/vb.js | 53 + conlite/external/edit_area/reg_syntax/xml.js | 57 + conlite/external/edit_area/regexp.js | 139 + conlite/external/edit_area/resize_area.js | 73 + conlite/external/edit_area/search_replace.js | 174 + conlite/external/edit_area/template.html | 100 + conlite/external/frontend/cache/index.php | 4 + conlite/external/frontend/config.php | 53 + conlite/external/frontend/css/index.php | 4 + conlite/external/frontend/css/style_tiny.css | 32 + conlite/external/frontend/dbfs.php | 66 + conlite/external/frontend/error.php | 13 + conlite/external/frontend/front_content.php | 996 + .../frontend/front_crcloginform.inc.php | 168 + conlite/external/frontend/images/but_ok.gif | Bin 0 -> 192 bytes conlite/external/frontend/images/index.php | 4 + .../frontend/includes/class.concache.php | 531 + .../frontend/includes/class.input.helper.php | 573 + .../external/frontend/includes/concache.php | 170 + conlite/external/frontend/includes/index.php | 4 + conlite/external/frontend/index.php | 5 + conlite/external/frontend/js/index.php | 4 + conlite/external/frontend/logs/index.php | 4 + conlite/external/frontend/robots.txt | 2 + conlite/external/frontend/templates/index.php | 4 + conlite/external/frontend/upload/test.txt | 1 + conlite/external/index.php | 4 + conlite/external/phpqrcode/CHANGELOG | 38 + conlite/external/phpqrcode/INSTALL | 67 + conlite/external/phpqrcode/LICENSE | 165 + conlite/external/phpqrcode/README | 45 + conlite/external/phpqrcode/VERSION | 2 + .../phpqrcode/bindings/tcpdf/qrcode.php | 2875 +++ conlite/external/phpqrcode/index.php | 94 + conlite/external/phpqrcode/phpqrcode.php | 3312 +++ conlite/external/phpqrcode/qrbitstream.php | 180 + conlite/external/phpqrcode/qrconfig.php | 17 + conlite/external/phpqrcode/qrconst.php | 54 + conlite/external/phpqrcode/qrencode.php | 502 + conlite/external/phpqrcode/qrimage.php | 95 + conlite/external/phpqrcode/qrinput.php | 729 + conlite/external/phpqrcode/qrlib.php | 43 + conlite/external/phpqrcode/qrmask.php | 328 + conlite/external/phpqrcode/qrrscode.php | 210 + conlite/external/phpqrcode/qrspec.php | 592 + conlite/external/phpqrcode/qrsplit.php | 311 + conlite/external/phpqrcode/qrtools.php | 172 + conlite/external/phpqrcode/tools/merge.bat | 2 + conlite/external/phpqrcode/tools/merge.php | 70 + conlite/external/phpqrcode/tools/merge.sh | 2 + .../phpqrcode/tools/merged_config.php | 17 + .../phpqrcode/tools/merged_header.php | 36 + conlite/external/wysiwyg/index.php | 4 + .../tinymce3/TINYMCE_INTEGRATION_HOWTO.txt | 57 + .../external/wysiwyg/tinymce3/changelog.txt | 1575 ++ .../wysiwyg/tinymce3/compressor_changelog.txt | 14 + conlite/external/wysiwyg/tinymce3/config.php | 57 + conlite/external/wysiwyg/tinymce3/editor.php | 114 + .../external/wysiwyg/tinymce3/editorclass.php | 706 + .../tinymce3/jscripts/tiny_mce/langs/de.js | 1 + .../tinymce3/jscripts/tiny_mce/langs/en.js | 1 + .../tinymce3/jscripts/tiny_mce/license.txt | 504 + .../tiny_mce/plugins/advhr/css/advhr.css | 5 + .../tiny_mce/plugins/advhr/editor_plugin.js | 1 + .../plugins/advhr/editor_plugin_src.js | 57 + .../tiny_mce/plugins/advhr/js/rule.js | 43 + .../tiny_mce/plugins/advhr/langs/de_dlg.js | 1 + .../tiny_mce/plugins/advhr/langs/en_dlg.js | 1 + .../jscripts/tiny_mce/plugins/advhr/rule.htm | 58 + .../plugins/advimage/css/advimage.css | 13 + .../plugins/advimage/editor_plugin.js | 1 + .../plugins/advimage/editor_plugin_src.js | 50 + .../tiny_mce/plugins/advimage/image.htm | 235 + .../tiny_mce/plugins/advimage/img/sample.gif | Bin 0 -> 1624 bytes .../tiny_mce/plugins/advimage/js/image.js | 464 + .../tiny_mce/plugins/advimage/langs/de_dlg.js | 1 + .../tiny_mce/plugins/advimage/langs/en_dlg.js | 1 + .../tiny_mce/plugins/advlink/css/advlink.css | 8 + .../tiny_mce/plugins/advlink/editor_plugin.js | 1 + .../plugins/advlink/editor_plugin_src.js | 61 + .../tiny_mce/plugins/advlink/js/advlink.js | 543 + .../tiny_mce/plugins/advlink/langs/de_dlg.js | 1 + .../tiny_mce/plugins/advlink/langs/en_dlg.js | 1 + .../tiny_mce/plugins/advlink/link.htm | 338 + .../tiny_mce/plugins/advlist/editor_plugin.js | 1 + .../plugins/advlist/editor_plugin_src.js | 176 + .../plugins/autolink/editor_plugin.js | 1 + .../plugins/autolink/editor_plugin_src.js | 184 + .../plugins/autoresize/editor_plugin.js | 1 + .../plugins/autoresize/editor_plugin_src.js | 119 + .../plugins/autosave/editor_plugin.js | 1 + .../plugins/autosave/editor_plugin_src.js | 433 + .../tiny_mce/plugins/bbcode/editor_plugin.js | 1 + .../plugins/bbcode/editor_plugin_src.js | 120 + .../plugins/contextmenu/editor_plugin.js | 1 + .../plugins/contextmenu/editor_plugin_src.js | 163 + .../plugins/directionality/editor_plugin.js | 1 + .../directionality/editor_plugin_src.js | 85 + .../plugins/emotions/editor_plugin.js | 1 + .../plugins/emotions/editor_plugin_src.js | 43 + .../tiny_mce/plugins/emotions/emotions.htm | 42 + .../plugins/emotions/img/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emotions/img/smiley-cry.gif | Bin 0 -> 329 bytes .../emotions/img/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emotions/img/smiley-foot-in-mouth.gif | Bin 0 -> 342 bytes .../plugins/emotions/img/smiley-frown.gif | Bin 0 -> 340 bytes .../plugins/emotions/img/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emotions/img/smiley-kiss.gif | Bin 0 -> 338 bytes .../plugins/emotions/img/smiley-laughing.gif | Bin 0 -> 343 bytes .../emotions/img/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emotions/img/smiley-sealed.gif | Bin 0 -> 323 bytes .../plugins/emotions/img/smiley-smile.gif | Bin 0 -> 344 bytes .../plugins/emotions/img/smiley-surprised.gif | Bin 0 -> 338 bytes .../emotions/img/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../plugins/emotions/img/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emotions/img/smiley-wink.gif | Bin 0 -> 350 bytes .../plugins/emotions/img/smiley-yell.gif | Bin 0 -> 336 bytes .../tiny_mce/plugins/emotions/js/emotions.js | 43 + .../tiny_mce/plugins/emotions/langs/de_dlg.js | 1 + .../tiny_mce/plugins/emotions/langs/en_dlg.js | 1 + .../tiny_mce/plugins/example/dialog.htm | 22 + .../tiny_mce/plugins/example/editor_plugin.js | 1 + .../plugins/example/editor_plugin_src.js | 84 + .../tiny_mce/plugins/example/img/example.gif | Bin 0 -> 87 bytes .../tiny_mce/plugins/example/js/dialog.js | 19 + .../tiny_mce/plugins/example/langs/en.js | 3 + .../tiny_mce/plugins/example/langs/en_dlg.js | 3 + .../example_dependency/editor_plugin.js | 1 + .../example_dependency/editor_plugin_src.js | 50 + .../plugins/fullpage/css/fullpage.css | 143 + .../plugins/fullpage/editor_plugin.js | 1 + .../plugins/fullpage/editor_plugin_src.js | 405 + .../tiny_mce/plugins/fullpage/fullpage.htm | 259 + .../tiny_mce/plugins/fullpage/js/fullpage.js | 232 + .../tiny_mce/plugins/fullpage/langs/de_dlg.js | 1 + .../tiny_mce/plugins/fullpage/langs/en_dlg.js | 1 + .../plugins/fullscreen/editor_plugin.js | 1 + .../plugins/fullscreen/editor_plugin_src.js | 234 + .../plugins/fullscreen/fullscreen.htm | 117 + .../tiny_mce/plugins/iespell/editor_plugin.js | 1 + .../plugins/iespell/editor_plugin_src.js | 54 + .../plugins/inlinepopups/editor_plugin.js | 1 + .../plugins/inlinepopups/editor_plugin_src.js | 699 + .../skins/clearlooks2/img/alert.gif | Bin 0 -> 810 bytes .../skins/clearlooks2/img/button.gif | Bin 0 -> 272 bytes .../skins/clearlooks2/img/buttons.gif | Bin 0 -> 1195 bytes .../skins/clearlooks2/img/confirm.gif | Bin 0 -> 907 bytes .../skins/clearlooks2/img/corners.gif | Bin 0 -> 909 bytes .../skins/clearlooks2/img/horizontal.gif | Bin 0 -> 769 bytes .../skins/clearlooks2/img/vertical.gif | Bin 0 -> 84 bytes .../inlinepopups/skins/clearlooks2/window.css | 90 + .../plugins/inlinepopups/template.htm | 387 + .../plugins/insertdatetime/editor_plugin.js | 1 + .../insertdatetime/editor_plugin_src.js | 83 + .../tiny_mce/plugins/layer/editor_plugin.js | 1 + .../plugins/layer/editor_plugin_src.js | 262 + .../plugins/legacyoutput/editor_plugin.js | 1 + .../plugins/legacyoutput/editor_plugin_src.js | 139 + .../tiny_mce/plugins/lists/editor_plugin.js | 1 + .../plugins/lists/editor_plugin_src.js | 955 + .../tiny_mce/plugins/media/css/media.css | 17 + .../tiny_mce/plugins/media/editor_plugin.js | 1 + .../plugins/media/editor_plugin_src.js | 898 + .../tiny_mce/plugins/media/js/embed.js | 73 + .../tiny_mce/plugins/media/js/media.js | 513 + .../tiny_mce/plugins/media/langs/de_dlg.js | 1 + .../tiny_mce/plugins/media/langs/en_dlg.js | 1 + .../jscripts/tiny_mce/plugins/media/media.htm | 922 + .../tiny_mce/plugins/media/moxieplayer.swf | Bin 0 -> 19980 bytes .../plugins/nonbreaking/editor_plugin.js | 1 + .../plugins/nonbreaking/editor_plugin_src.js | 54 + .../plugins/noneditable/editor_plugin.js | 1 + .../plugins/noneditable/editor_plugin_src.js | 537 + .../plugins/pagebreak/editor_plugin.js | 1 + .../plugins/pagebreak/editor_plugin_src.js | 74 + .../tiny_mce/plugins/paste/editor_plugin.js | 1 + .../plugins/paste/editor_plugin_src.js | 887 + .../tiny_mce/plugins/paste/js/pastetext.js | 36 + .../tiny_mce/plugins/paste/js/pasteword.js | 51 + .../tiny_mce/plugins/paste/langs/de_dlg.js | 1 + .../tiny_mce/plugins/paste/langs/en_dlg.js | 1 + .../tiny_mce/plugins/paste/pastetext.htm | 27 + .../tiny_mce/plugins/paste/pasteword.htm | 21 + .../tiny_mce/plugins/preview/editor_plugin.js | 1 + .../plugins/preview/editor_plugin_src.js | 53 + .../tiny_mce/plugins/preview/example.html | 28 + .../plugins/preview/jscripts/embed.js | 73 + .../tiny_mce/plugins/preview/preview.html | 17 + .../tiny_mce/plugins/print/editor_plugin.js | 1 + .../plugins/print/editor_plugin_src.js | 34 + .../tiny_mce/plugins/save/editor_plugin.js | 1 + .../plugins/save/editor_plugin_src.js | 101 + .../searchreplace/css/searchreplace.css | 6 + .../plugins/searchreplace/editor_plugin.js | 1 + .../searchreplace/editor_plugin_src.js | 61 + .../plugins/searchreplace/js/searchreplace.js | 148 + .../plugins/searchreplace/langs/de_dlg.js | 1 + .../plugins/searchreplace/langs/en_dlg.js | 1 + .../plugins/searchreplace/searchreplace.htm | 100 + .../plugins/spellchecker/css/content.css | 1 + .../plugins/spellchecker/editor_plugin.js | 1 + .../plugins/spellchecker/editor_plugin_src.js | 471 + .../plugins/spellchecker/img/wline.gif | Bin 0 -> 46 bytes .../tiny_mce/plugins/style/css/props.css | 14 + .../tiny_mce/plugins/style/editor_plugin.js | 1 + .../plugins/style/editor_plugin_src.js | 71 + .../tiny_mce/plugins/style/js/props.js | 709 + .../tiny_mce/plugins/style/langs/de_dlg.js | 1 + .../tiny_mce/plugins/style/langs/en_dlg.js | 1 + .../jscripts/tiny_mce/plugins/style/props.htm | 845 + .../tiny_mce/plugins/style/readme.txt | 19 + .../plugins/tabfocus/editor_plugin.js | 1 + .../plugins/tabfocus/editor_plugin_src.js | 122 + .../jscripts/tiny_mce/plugins/table/cell.htm | 180 + .../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 | 1456 ++ .../tiny_mce/plugins/table/js/cell.js | 319 + .../tiny_mce/plugins/table/js/merge_cells.js | 27 + .../jscripts/tiny_mce/plugins/table/js/row.js | 254 + .../tiny_mce/plugins/table/js/table.js | 501 + .../tiny_mce/plugins/table/langs/de_dlg.js | 1 + .../tiny_mce/plugins/table/langs/en_dlg.js | 1 + .../tiny_mce/plugins/table/merge_cells.htm | 32 + .../jscripts/tiny_mce/plugins/table/row.htm | 158 + .../jscripts/tiny_mce/plugins/table/table.htm | 188 + .../tiny_mce/plugins/template/blank.htm | 12 + .../plugins/template/css/template.css | 23 + .../plugins/template/editor_plugin.js | 1 + .../plugins/template/editor_plugin_src.js | 159 + .../tiny_mce/plugins/template/js/template.js | 106 + .../tiny_mce/plugins/template/langs/de_dlg.js | 1 + .../tiny_mce/plugins/template/langs/en_dlg.js | 1 + .../tiny_mce/plugins/template/template.htm | 31 + .../plugins/visualblocks/css/visualblocks.css | 21 + .../plugins/visualblocks/editor_plugin.js | 1 + .../plugins/visualblocks/editor_plugin_src.js | 63 + .../plugins/visualchars/editor_plugin.js | 1 + .../plugins/visualchars/editor_plugin_src.js | 83 + .../plugins/wordcount/editor_plugin.js | 1 + .../plugins/wordcount/editor_plugin_src.js | 122 + .../tiny_mce/plugins/xhtmlxtras/abbr.htm | 142 + .../tiny_mce/plugins/xhtmlxtras/acronym.htm | 142 + .../plugins/xhtmlxtras/attributes.htm | 149 + .../tiny_mce/plugins/xhtmlxtras/cite.htm | 142 + .../plugins/xhtmlxtras/css/attributes.css | 11 + .../tiny_mce/plugins/xhtmlxtras/css/popup.css | 9 + .../tiny_mce/plugins/xhtmlxtras/del.htm | 162 + .../plugins/xhtmlxtras/editor_plugin.js | 1 + .../plugins/xhtmlxtras/editor_plugin_src.js | 132 + .../tiny_mce/plugins/xhtmlxtras/ins.htm | 162 + .../tiny_mce/plugins/xhtmlxtras/js/abbr.js | 28 + .../tiny_mce/plugins/xhtmlxtras/js/acronym.js | 28 + .../plugins/xhtmlxtras/js/attributes.js | 111 + .../tiny_mce/plugins/xhtmlxtras/js/cite.js | 28 + .../tiny_mce/plugins/xhtmlxtras/js/del.js | 53 + .../plugins/xhtmlxtras/js/element_common.js | 229 + .../tiny_mce/plugins/xhtmlxtras/js/ins.js | 53 + .../plugins/xhtmlxtras/langs/de_dlg.js | 1 + .../plugins/xhtmlxtras/langs/en_dlg.js | 1 + .../tiny_mce/themes/advanced/about.htm | 52 + .../tiny_mce/themes/advanced/anchor.htm | 26 + .../tiny_mce/themes/advanced/charmap.htm | 55 + .../tiny_mce/themes/advanced/color_picker.htm | 70 + .../themes/advanced/editor_template.js | 1 + .../themes/advanced/editor_template_src.js | 1490 ++ .../tiny_mce/themes/advanced/image.htm | 80 + .../themes/advanced/img/colorpicker.jpg | Bin 0 -> 2584 bytes .../tiny_mce/themes/advanced/img/flash.gif | Bin 0 -> 239 bytes .../tiny_mce/themes/advanced/img/icons.gif | Bin 0 -> 11982 bytes .../tiny_mce/themes/advanced/img/iframe.gif | Bin 0 -> 600 bytes .../themes/advanced/img/pagebreak.gif | Bin 0 -> 325 bytes .../themes/advanced/img/quicktime.gif | Bin 0 -> 301 bytes .../themes/advanced/img/realmedia.gif | Bin 0 -> 439 bytes .../themes/advanced/img/shockwave.gif | Bin 0 -> 384 bytes .../tiny_mce/themes/advanced/img/trans.gif | Bin 0 -> 43 bytes .../tiny_mce/themes/advanced/img/video.gif | Bin 0 -> 597 bytes .../themes/advanced/img/windowsmedia.gif | Bin 0 -> 415 bytes .../tiny_mce/themes/advanced/js/about.js | 73 + .../tiny_mce/themes/advanced/js/anchor.js | 56 + .../tiny_mce/themes/advanced/js/charmap.js | 363 + .../themes/advanced/js/color_picker.js | 345 + .../tiny_mce/themes/advanced/js/image.js | 253 + .../tiny_mce/themes/advanced/js/link.js | 159 + .../themes/advanced/js/source_editor.js | 78 + .../tiny_mce/themes/advanced/langs/de.js | 1 + .../tiny_mce/themes/advanced/langs/de_dlg.js | 1 + .../tiny_mce/themes/advanced/langs/en.js | 1 + .../tiny_mce/themes/advanced/langs/en_dlg.js | 1 + .../tiny_mce/themes/advanced/link.htm | 57 + .../tiny_mce/themes/advanced/shortcuts.htm | 47 + .../themes/advanced/skins/default/content.css | 50 + .../themes/advanced/skins/default/dialog.css | 118 + .../advanced/skins/default/img/buttons.png | Bin 0 -> 3133 bytes .../advanced/skins/default/img/items.gif | Bin 0 -> 64 bytes .../advanced/skins/default/img/menu_arrow.gif | Bin 0 -> 68 bytes .../advanced/skins/default/img/menu_check.gif | Bin 0 -> 70 bytes .../advanced/skins/default/img/progress.gif | Bin 0 -> 1787 bytes .../advanced/skins/default/img/tabs.gif | Bin 0 -> 1322 bytes .../themes/advanced/skins/default/ui.css | 219 + .../advanced/skins/highcontrast/content.css | 24 + .../advanced/skins/highcontrast/dialog.css | 106 + .../themes/advanced/skins/highcontrast/ui.css | 106 + .../themes/advanced/skins/o2k7/content.css | 48 + .../themes/advanced/skins/o2k7/dialog.css | 118 + .../advanced/skins/o2k7/img/button_bg.png | Bin 0 -> 2766 bytes .../skins/o2k7/img/button_bg_black.png | Bin 0 -> 651 bytes .../skins/o2k7/img/button_bg_silver.png | Bin 0 -> 2084 bytes .../themes/advanced/skins/o2k7/ui.css | 222 + .../themes/advanced/skins/o2k7/ui_black.css | 8 + .../themes/advanced/skins/o2k7/ui_silver.css | 5 + .../themes/advanced/source_editor.htm | 25 + .../tiny_mce/themes/simple/editor_template.js | 1 + .../themes/simple/editor_template_src.js | 84 + .../tiny_mce/themes/simple/img/icons.gif | Bin 0 -> 806 bytes .../tiny_mce/themes/simple/langs/de.js | 1 + .../tiny_mce/themes/simple/langs/en.js | 1 + .../themes/simple/skins/default/content.css | 25 + .../themes/simple/skins/default/ui.css | 32 + .../themes/simple/skins/o2k7/content.css | 17 + .../simple/skins/o2k7/img/button_bg.png | Bin 0 -> 5102 bytes .../tiny_mce/themes/simple/skins/o2k7/ui.css | 35 + .../tinymce3/jscripts/tiny_mce/tiny_mce.js | 1 + .../jscripts/tiny_mce/tiny_mce_popup.js | 5 + .../jscripts/tiny_mce/tiny_mce_src.js | 19127 ++++++++++++++++ .../tiny_mce/utils/editable_selects.js | 70 + .../jscripts/tiny_mce/utils/form_utils.js | 210 + .../jscripts/tiny_mce/utils/mctabs.js | 162 + .../jscripts/tiny_mce/utils/validate.js | 252 + conlite/external/wysiwyg/tinymce3/list.php | 228 + conlite/external/wysiwyg/tinymce3/readme | 2 + conlite/external/wysiwyg/tinymce3/readme.txt | 2 + .../wysiwyg/tinymce3/tiny_mce_gzip.js | 185 + .../wysiwyg/tinymce3/tiny_mce_gzip.php | 206 + .../wysiwyg/tinymce3/tinymce.tpl.html | 116 + conlite/favicon.ico | Bin 0 -> 29038 bytes conlite/frameset.php | 132 + conlite/frameset_left.php | 77 + conlite/frameset_right.php | 75 + conlite/header.php | 128 + conlite/images/actions/clear_right.gif | Bin 0 -> 158 bytes conlite/images/arrow.gif | Bin 0 -> 105 bytes conlite/images/arrow_tipballoon.gif | Bin 0 -> 181 bytes conlite/images/article.gif | Bin 0 -> 82 bytes conlite/images/article_locked.gif | Bin 0 -> 190 bytes conlite/images/article_unlocked.gif | Bin 0 -> 173 bytes conlite/images/artikel_spez_akt.gif | Bin 0 -> 171 bytes conlite/images/artikel_spez_inakt.gif | Bin 0 -> 148 bytes conlite/images/avail_clients.gif | Bin 0 -> 90 bytes conlite/images/back.gif | Bin 0 -> 251 bytes conlite/images/background.jpg | Bin 0 -> 724 bytes conlite/images/bg_dark.gif | Bin 0 -> 59 bytes conlite/images/bg_high.gif | Bin 0 -> 52 bytes conlite/images/bg_light.gif | Bin 0 -> 193 bytes conlite/images/bg_sub.gif | Bin 0 -> 59 bytes conlite/images/bg_trans.gif | Bin 0 -> 59 bytes conlite/images/but_art_conf2.gif | Bin 0 -> 76 bytes conlite/images/but_art_new.gif | Bin 0 -> 74 bytes conlite/images/but_back.gif | Bin 0 -> 131 bytes conlite/images/but_cancel.gif | Bin 0 -> 104 bytes conlite/images/but_cancel_off.gif | Bin 0 -> 104 bytes conlite/images/but_cat_conf.gif | Bin 0 -> 82 bytes conlite/images/but_cat_conf2.gif | Bin 0 -> 82 bytes conlite/images/but_copy.gif | Bin 0 -> 86 bytes conlite/images/but_delete.gif | Bin 0 -> 195 bytes conlite/images/but_downloadlist.gif | Bin 0 -> 85 bytes conlite/images/but_edit.gif | Bin 0 -> 76 bytes conlite/images/but_edithead.gif | Bin 0 -> 138 bytes conlite/images/but_edithtml.gif | Bin 0 -> 138 bytes conlite/images/but_editimage.gif | Bin 0 -> 155 bytes conlite/images/but_editlink.gif | Bin 0 -> 208 bytes conlite/images/but_editpdf.gif | Bin 0 -> 318 bytes conlite/images/but_editswf.gif | Bin 0 -> 337 bytes conlite/images/but_edittext.gif | Bin 0 -> 138 bytes conlite/images/but_editzip.gif | Bin 0 -> 250 bytes conlite/images/but_help.gif | Bin 0 -> 79 bytes conlite/images/but_invert_selection.gif | Bin 0 -> 90 bytes conlite/images/but_lastnode.gif | Bin 0 -> 69 bytes conlite/images/but_logout.gif | Bin 0 -> 238 bytes conlite/images/but_minus.gif | Bin 0 -> 70 bytes conlite/images/but_move_subtree.gif | Bin 0 -> 138 bytes conlite/images/but_move_subtree_main.gif | Bin 0 -> 114 bytes conlite/images/but_move_subtree_target.gif | Bin 0 -> 114 bytes conlite/images/but_news.gif | Bin 0 -> 98 bytes conlite/images/but_ok.gif | Bin 0 -> 192 bytes conlite/images/but_ok_off.gif | Bin 0 -> 138 bytes conlite/images/but_online.gif | Bin 0 -> 138 bytes conlite/images/but_online_no.gif | Bin 0 -> 138 bytes conlite/images/but_plus.gif | Bin 0 -> 75 bytes conlite/images/but_preview.gif | Bin 0 -> 167 bytes conlite/images/but_properties.gif | Bin 0 -> 76 bytes conlite/images/but_refresh.gif | Bin 0 -> 211 bytes conlite/images/but_rename.gif | Bin 0 -> 84 bytes conlite/images/but_rss.gif | Bin 0 -> 156 bytes conlite/images/but_setreminder.gif | Bin 0 -> 142 bytes conlite/images/but_speichern.gif | Bin 0 -> 192 bytes conlite/images/but_sync_art.gif | Bin 0 -> 82 bytes conlite/images/but_sync_art_off.gif | Bin 0 -> 82 bytes conlite/images/but_sync_cat.gif | Bin 0 -> 86 bytes conlite/images/but_sync_cat_off.gif | Bin 0 -> 86 bytes conlite/images/but_time_1.gif | Bin 0 -> 152 bytes conlite/images/but_time_2.gif | Bin 0 -> 153 bytes conlite/images/but_todo.gif | Bin 0 -> 138 bytes conlite/images/but_todo_off.gif | Bin 0 -> 138 bytes conlite/images/but_warn.gif | Bin 0 -> 91 bytes conlite/images/calendar.gif | Bin 0 -> 90 bytes conlite/images/cl-logo.gif | Bin 0 -> 6085 bytes conlite/images/close_all.gif | Bin 0 -> 49 bytes conlite/images/collapsed.gif | Bin 0 -> 108 bytes conlite/images/configure.gif | Bin 0 -> 82 bytes conlite/images/conlogo.gif | Bin 0 -> 3909 bytes conlite/images/contact.gif | Bin 0 -> 111 bytes conlite/images/dash.gif | Bin 0 -> 43 bytes conlite/images/db_backup_start.png | Bin 0 -> 11789 bytes conlite/images/db_backup_start_off.png | Bin 0 -> 8698 bytes conlite/images/delete.gif | Bin 0 -> 195 bytes conlite/images/delete_inact.gif | Bin 0 -> 195 bytes conlite/images/delete_inact_g.gif | Bin 0 -> 195 bytes conlite/images/delete_inact_h.gif | Bin 0 -> 195 bytes conlite/images/delete_over.gif | Bin 0 -> 195 bytes conlite/images/editieren.gif | Bin 0 -> 138 bytes conlite/images/exclamation.gif | Bin 0 -> 91 bytes conlite/images/filetypes/css.gif | Bin 0 -> 78 bytes conlite/images/filetypes/design.gif | Bin 0 -> 137 bytes conlite/images/filetypes/excel.gif | Bin 0 -> 77 bytes conlite/images/filetypes/gif.gif | Bin 0 -> 79 bytes conlite/images/filetypes/html.gif | Bin 0 -> 81 bytes conlite/images/filetypes/javascript.gif | Bin 0 -> 73 bytes conlite/images/filetypes/jpg.gif | Bin 0 -> 81 bytes conlite/images/filetypes/js.gif | Bin 0 -> 73 bytes conlite/images/filetypes/movie.gif | Bin 0 -> 159 bytes conlite/images/filetypes/odf.gif | Bin 0 -> 81 bytes conlite/images/filetypes/pdf.gif | Bin 0 -> 82 bytes conlite/images/filetypes/php.gif | Bin 0 -> 82 bytes conlite/images/filetypes/png.gif | Bin 0 -> 82 bytes conlite/images/filetypes/ppt.gif | Bin 0 -> 82 bytes conlite/images/filetypes/sound.gif | Bin 0 -> 132 bytes conlite/images/filetypes/swf.gif | Bin 0 -> 80 bytes conlite/images/filetypes/txt.gif | Bin 0 -> 78 bytes conlite/images/filetypes/unknown.gif | Bin 0 -> 79 bytes conlite/images/filetypes/vcf.gif | Bin 0 -> 77 bytes conlite/images/filetypes/word.gif | Bin 0 -> 80 bytes conlite/images/filetypes/zip.gif | Bin 0 -> 79 bytes conlite/images/filler_bg.gif | Bin 0 -> 80 bytes conlite/images/folder.gif | Bin 0 -> 64 bytes conlite/images/folder_delock.gif | Bin 0 -> 85 bytes conlite/images/folder_delocked.gif | Bin 0 -> 85 bytes conlite/images/folder_duplicate.gif | Bin 0 -> 86 bytes conlite/images/folder_duplicate_off.gif | Bin 0 -> 86 bytes conlite/images/folder_lock.gif | Bin 0 -> 87 bytes conlite/images/folder_locked.gif | Bin 0 -> 87 bytes conlite/images/folder_move.gif | Bin 0 -> 138 bytes conlite/images/folder_movedown.gif | Bin 0 -> 126 bytes conlite/images/folder_movedown_inact.gif | Bin 0 -> 126 bytes conlite/images/folder_moveup.gif | Bin 0 -> 126 bytes conlite/images/folder_moveup_inact.gif | Bin 0 -> 126 bytes conlite/images/folder_new.gif | Bin 0 -> 74 bytes conlite/images/folder_off.gif | Bin 0 -> 64 bytes conlite/images/folder_off_error.gif | Bin 0 -> 64 bytes conlite/images/folder_off_error_locked.gif | Bin 0 -> 87 bytes conlite/images/folder_off_locked.gif | Bin 0 -> 87 bytes conlite/images/folder_on.gif | Bin 0 -> 64 bytes conlite/images/folder_on_error.gif | Bin 0 -> 64 bytes conlite/images/folder_on_error_locked.gif | Bin 0 -> 87 bytes conlite/images/folder_on_locked.gif | Bin 0 -> 87 bytes conlite/images/frame_handle_li.gif | Bin 0 -> 125 bytes conlite/images/frame_handle_re.gif | Bin 0 -> 124 bytes conlite/images/grid_collapse.gif | Bin 0 -> 70 bytes conlite/images/grid_expand.gif | Bin 0 -> 75 bytes conlite/images/grid_folder.gif | Bin 0 -> 64 bytes conlite/images/grid_linedown.gif | Bin 0 -> 73 bytes conlite/images/grid_linedownright.gif | Bin 0 -> 70 bytes conlite/images/grid_linedownrightend.gif | Bin 0 -> 65 bytes conlite/images/groups.gif | Bin 0 -> 119 bytes conlite/images/groups_o.gif | Bin 0 -> 119 bytes conlite/images/icon_fatalerror.gif | Bin 0 -> 201 bytes conlite/images/icon_warning.gif | Bin 0 -> 91 bytes conlite/images/importieren.gif | Bin 0 -> 192 bytes conlite/images/index.php | 4 + conlite/images/info.gif | Bin 0 -> 90 bytes conlite/images/isstart0.gif | Bin 0 -> 82 bytes conlite/images/isstart0m.gif | Bin 0 -> 101 bytes conlite/images/isstart0mr.gif | Bin 0 -> 159 bytes conlite/images/isstart0r.gif | Bin 0 -> 142 bytes conlite/images/isstart1.gif | Bin 0 -> 82 bytes conlite/images/isstart1m.gif | Bin 0 -> 101 bytes conlite/images/isstart1mr.gif | Bin 0 -> 161 bytes conlite/images/isstart1r.gif | Bin 0 -> 140 bytes conlite/images/lock_closed.gif | Bin 0 -> 89 bytes conlite/images/lock_open.gif | Bin 0 -> 85 bytes conlite/images/my_contenido.gif | Bin 0 -> 154 bytes conlite/images/newsletter.gif | Bin 0 -> 90 bytes conlite/images/newsletter_16.gif | Bin 0 -> 90 bytes conlite/images/newsletter_dispatch_16.gif | Bin 0 -> 82 bytes conlite/images/newsletter_dispatch_16_off.gif | Bin 0 -> 82 bytes conlite/images/newsletter_dispatch_off.gif | Bin 0 -> 82 bytes conlite/images/newsletter_dispatch_on.gif | Bin 0 -> 82 bytes conlite/images/newsletter_off.gif | Bin 0 -> 90 bytes conlite/images/newsletter_on.gif | Bin 0 -> 90 bytes .../images/newsletter_recipientgroups_off.gif | Bin 0 -> 122 bytes .../images/newsletter_recipientgroups_on.gif | Bin 0 -> 122 bytes conlite/images/newsletter_recipients_off.gif | Bin 0 -> 111 bytes conlite/images/newsletter_recipients_on.gif | Bin 0 -> 111 bytes conlite/images/newsletter_sendtest_16.gif | Bin 0 -> 85 bytes conlite/images/newsletter_sendtest_16_off.gif | Bin 0 -> 85 bytes conlite/images/offline.gif | Bin 0 -> 93 bytes conlite/images/offline_off.gif | Bin 0 -> 93 bytes conlite/images/online.gif | Bin 0 -> 90 bytes conlite/images/online_off.gif | Bin 0 -> 90 bytes conlite/images/open_all.gif | Bin 0 -> 53 bytes conlite/images/ordner_oben.gif | Bin 0 -> 126 bytes conlite/images/paging/first.gif | Bin 0 -> 109 bytes conlite/images/paging/last.gif | Bin 0 -> 109 bytes conlite/images/paging/next.gif | Bin 0 -> 117 bytes conlite/images/paging/previous.gif | Bin 0 -> 119 bytes conlite/images/pfeil_links.gif | Bin 0 -> 81 bytes conlite/images/pfeil_runter.gif | Bin 0 -> 82 bytes conlite/images/print.gif | Bin 0 -> 85 bytes conlite/images/reminder/prio_high.gif | Bin 0 -> 82 bytes conlite/images/reminder/prio_low.gif | Bin 0 -> 85 bytes conlite/images/reminder/prio_medium.gif | Bin 0 -> 85 bytes conlite/images/reminder/prio_veryhigh.gif | Bin 0 -> 82 bytes conlite/images/reminder/progress.gif | Bin 0 -> 69 bytes conlite/images/reminder/status_deferred.gif | Bin 0 -> 172 bytes conlite/images/reminder/status_done.gif | Bin 0 -> 173 bytes conlite/images/reminder/status_inprogress.gif | Bin 0 -> 169 bytes conlite/images/reminder/status_new.gif | Bin 0 -> 74 bytes conlite/images/reminder/status_waiting.gif | Bin 0 -> 170 bytes conlite/images/save.gif | Bin 0 -> 296 bytes conlite/images/social/facebook.gif | Bin 0 -> 1090 bytes conlite/images/sort_down.gif | Bin 0 -> 103 bytes conlite/images/sort_up.gif | Bin 0 -> 103 bytes conlite/images/space.gif | Bin 0 -> 807 bytes conlite/images/spacer.gif | Bin 0 -> 43 bytes conlite/images/submit.gif | Bin 0 -> 131 bytes conlite/images/submit_hover.gif | Bin 0 -> 131 bytes conlite/images/sync.png | Bin 0 -> 852 bytes conlite/images/template_properties.gif | Bin 0 -> 82 bytes conlite/images/template_properties_off.gif | Bin 0 -> 82 bytes conlite/images/toggle_frame_left.gif | Bin 0 -> 136 bytes conlite/images/toggle_frame_right.gif | Bin 0 -> 135 bytes conlite/images/top.gif | Bin 0 -> 860 bytes conlite/images/user_online.gif | Bin 0 -> 97 bytes conlite/images/users.gif | Bin 0 -> 97 bytes conlite/images/users_o.gif | Bin 0 -> 97 bytes conlite/images/vert-neu.gif | Bin 0 -> 2327 bytes conlite/images/vert.gif | Bin 0 -> 75 bytes .../images/widgets/foldingrow/collapsed.gif | Bin 0 -> 108 bytes .../images/widgets/foldingrow/expanded.gif | Bin 0 -> 111 bytes conlite/images/workflow_step_delete.gif | Bin 0 -> 195 bytes conlite/includes/ajax/include.ajax.con.php | 80 + .../includes/api/functions.api.general.php | 243 + .../includes/api/functions.frontend.list.php | 252 + conlite/includes/cfg_language_de.inc.php | 409 + conlite/includes/functions.api.category.php | 106 + conlite/includes/functions.api.images.php | 690 + conlite/includes/functions.api.php | 39 + conlite/includes/functions.api.string.php | 398 + conlite/includes/functions.con.php | 2247 ++ conlite/includes/functions.con2.php | 772 + conlite/includes/functions.database.php | 459 + .../functions.domxml-php4-to-php5.php | 445 + conlite/includes/functions.encoding.php | 95 + conlite/includes/functions.file.php | 369 + conlite/includes/functions.forms.php | 98 + conlite/includes/functions.general.php | 2205 ++ conlite/includes/functions.i18n.php | 376 + .../includes/functions.includePluginConf.php | 172 + conlite/includes/functions.lang.php | 637 + conlite/includes/functions.lay.php | 133 + conlite/includes/functions.mod.php | 214 + conlite/includes/functions.pathresolver.php | 405 + conlite/includes/functions.php54.php | 149 + conlite/includes/functions.rights.php | 339 + conlite/includes/functions.stat.php | 1137 + conlite/includes/functions.str.php | 1465 ++ conlite/includes/functions.system.php | 657 + conlite/includes/functions.tpl.php | 830 + conlite/includes/functions.upl.php | 973 + conlite/includes/globals_off.inc.php | 120 + conlite/includes/grouprights.inc.php | 337 + conlite/includes/grouprights_area.inc.php | 202 + conlite/includes/grouprights_con.inc.php | 249 + conlite/includes/grouprights_lay.inc.php | 191 + conlite/includes/grouprights_members.inc.php | 232 + conlite/includes/grouprights_mod.inc.php | 169 + conlite/includes/grouprights_str.inc.php | 227 + conlite/includes/grouprights_tpl.inc.php | 170 + conlite/includes/include.CMS_EASYIMG.php | 163 + conlite/includes/include.CMS_HEAD.php | 99 + conlite/includes/include.CMS_HTML.php | 109 + conlite/includes/include.CMS_HTMLHEAD.php | 111 + conlite/includes/include.CMS_HTMLTEXT.php | 97 + conlite/includes/include.CMS_IMG.php | 289 + conlite/includes/include.CMS_LINK.php | 393 + conlite/includes/include.CMS_QRCODE.php | 89 + conlite/includes/include.CMS_SIMPLELINK.php | 173 + conlite/includes/include.CMS_SWF.php | 115 + conlite/includes/include.CMS_TEXT.php | 90 + conlite/includes/include.backendedit.php | 136 + conlite/includes/include.blank.php | 37 + conlite/includes/include.client_artspec.php | 180 + conlite/includes/include.client_edit.php | 354 + conlite/includes/include.client_left_top.php | 59 + conlite/includes/include.client_menu.php | 104 + conlite/includes/include.clientsettings.php | 216 + conlite/includes/include.con_art_overview.php | 1021 + conlite/includes/include.con_edit_form.php | 768 + conlite/includes/include.con_editcontent.php | 624 + conlite/includes/include.con_left_top.php | 512 + conlite/includes/include.con_str_overview.php | 770 + conlite/includes/include.con_subnav.php | 128 + conlite/includes/include.debug.php | 122 + conlite/includes/include.default_subnav.php | 207 + conlite/includes/include.files_subnav.php | 124 + .../include.frontend.group.subnav.php | 87 + .../includes/include.frontend.group_edit.php | 301 + .../includes/include.frontend.group_menu.php | 105 + .../include.frontend.group_rights.php | 139 + .../includes/include.frontend.left_top.php | 482 + .../includes/include.frontend.user_edit.php | 252 + .../includes/include.frontend.user_menu.php | 373 + .../includes/include.grouprights_create.php | 181 + .../includes/include.grouprights_details.php | 171 + .../includes/include.grouprights_external.php | 59 + .../includes/include.grouprights_left_top.php | 94 + conlite/includes/include.grouprights_menu.php | 212 + .../includes/include.grouprights_overview.php | 231 + .../includes/include.grouprights_subnav.php | 145 + .../includes/include.html_tpl_edit_form.php | 228 + .../include.html_tpl_files_overview.php | 162 + conlite/includes/include.html_tpl_history.php | 192 + .../includes/include.html_tpl_left_top.php | 58 + conlite/includes/include.info.php | 44 + conlite/includes/include.js_edit_form.php | 190 + .../includes/include.js_files_overview.php | 161 + conlite/includes/include.js_history.php | 183 + conlite/includes/include.js_left_top.php | 57 + conlite/includes/include.lang_edit.php | 274 + conlite/includes/include.lang_left_top.php | 89 + conlite/includes/include.lang_overview.php | 130 + conlite/includes/include.lay_edit_form.php | 260 + conlite/includes/include.lay_history.php | 146 + conlite/includes/include.lay_new.php | 44 + conlite/includes/include.lay_overview.php | 121 + conlite/includes/include.lay_preview.php | 39 + conlite/includes/include.left_top_blank.php | 37 + conlite/includes/include.logs.php | 324 + conlite/includes/include.mod_edit_form.php | 491 + conlite/includes/include.mod_history.php | 159 + conlite/includes/include.mod_new.php | 216 + conlite/includes/include.mod_overview.php | 338 + conlite/includes/include.mod_package.php | 492 + conlite/includes/include.mod_sync.php | 69 + conlite/includes/include.mod_translate.php | 203 + .../include.mod_translate_stringlist.php | 86 + .../include.mycontenido.tasks.edit.php | 150 + .../includes/include.mycontenido.tasks.php | 428 + .../include.mycontenido_lastarticles.php | 320 + .../includes/include.mycontenido_settings.php | 148 + conlite/includes/include.note.display.php | 51 + conlite/includes/include.note.popup.php | 100 + conlite/includes/include.pretplcfg_edit.php | 106 + .../includes/include.pretplcfg_edit_form.php | 160 + conlite/includes/include.rights_create.php | 316 + conlite/includes/include.rights_external.php | 58 + conlite/includes/include.rights_left_top.php | 199 + conlite/includes/include.rights_menu.php | 250 + conlite/includes/include.rights_overview.php | 467 + conlite/includes/include.stat_left_top.php | 36 + conlite/includes/include.stat_menu.php | 98 + conlite/includes/include.stat_overview.php | 147 + conlite/includes/include.str_overview.php | 1002 + conlite/includes/include.str_subnav.php | 108 + conlite/includes/include.style_edit_form.php | 211 + .../includes/include.style_files_overview.php | 161 + conlite/includes/include.style_history.php | 188 + conlite/includes/include.style_left_top.php | 57 + conlite/includes/include.subnav.php | 83 + conlite/includes/include.symbolhelp.php | 37 + .../includes/include.system_configuration.php | 196 + conlite/includes/include.system_db_backup.php | 409 + conlite/includes/include.system_purge.php | 226 + conlite/includes/include.system_sysvalues.php | 139 + conlite/includes/include.systemsettings.php | 200 + conlite/includes/include.todo.popup.php | 136 + conlite/includes/include.tpl_edit_form.php | 254 + conlite/includes/include.tpl_new.php | 44 + conlite/includes/include.tpl_overview.php | 131 + conlite/includes/include.tpl_visualedit.php | 233 + conlite/includes/include.tplcfg_edit.php | 210 + conlite/includes/include.tplcfg_edit_form.php | 487 + conlite/includes/include.upl_artlist.php | 185 + .../includes/include.upl_dirs_overview.php | 594 + conlite/includes/include.upl_edit.php | 318 + .../includes/include.upl_files_overview.php | 931 + conlite/includes/include.upl_files_upload.php | 70 + conlite/includes/include.upl_left_top.php | 163 + .../includes/include.upl_search_results.php | 632 + conlite/includes/include.upl_subnav.php | 117 + conlite/includes/index.php | 4 + conlite/includes/main.login.php | 291 + conlite/includes/old.config.misc.php | 302 + conlite/includes/pseudo-cron.inc.php | 447 + conlite/includes/rights.inc.php | 374 + conlite/includes/rights_area.inc.php | 195 + conlite/includes/rights_con.inc.php | 234 + conlite/includes/rights_lay.inc.php | 165 + conlite/includes/rights_mod.inc.php | 163 + conlite/includes/rights_str.inc.php | 228 + conlite/includes/rights_tpl.inc.php | 166 + conlite/includes/startup.php | 224 + conlite/index.php | 145 + conlite/locale/conlite.pot | 5239 +++++ conlite/locale/de_DE/LC_MESSAGES/conlite.mo | Bin 0 -> 79652 bytes conlite/locale/de_DE/LC_MESSAGES/conlite.po | 6605 ++++++ conlite/locale/en_US/LC_MESSAGES/conlite.mo | Bin 0 -> 548 bytes conlite/locale/en_US/LC_MESSAGES/conlite.po | 5162 +++++ conlite/locale/potfiles.txt | 585 + conlite/logout.php | 57 + conlite/logs/deprecated.txt | 0 conlite/logs/index.php | 4 + conlite/main.loginform.php | 211 + conlite/main.php | 293 + .../classes/class.metatag.creator.html5.php | 480 + .../createmetatags/conf/MetaExtension.php | 314 + .../include.chain.content.createmetatags.php | 298 + .../includes/keyword_density.php | 220 + .../includes/keyword_density_php52.php | 221 + .../includes/class.ceccreatefacebookmeta.php | 48 + .../plugins/chains/includes/config.plugin.php | 48 + .../include.chain.content.set_clear_cache.php | 98 + .../include.chain.frontend.cat_access.php | 74 + ...clude.chain.frontend.cat_backendaccess.php | 72 + .../include.chain.frontend.createbasehref.php | 70 + ...clude.chain.frontend.output_compressor.php | 699 + .../chains/includes/old.config.plugin.php | 44 + .../classes/class.content_allocation.php | 404 + .../class.content_allocation_article.php | 117 + .../class.content_allocation_complexlist.php | 113 + .../class.content_allocation_selectbox.php | 99 + .../classes/class.content_allocation_tree.php | 562 + .../class.content_allocation_treeview.php | 234 + .../content_allocation/images/arrow.gif | Bin 0 -> 56 bytes .../images/call_contentallocation.gif | Bin 0 -> 90 bytes .../content_allocation/images/normal.gif | Bin 0 -> 112 bytes .../includes/config.autoloader.php | 26 + .../includes/config.plugin.php | 65 + .../includes/functions.chains.php | 67 + .../include.contentallocation_article.php | 130 + .../includes/include.left_bottom.php | 0 .../includes/include.left_top.php | 39 + .../includes/include.right_bottom.php | 165 + .../locale/content_allocation.pot | 109 + .../de_DE/LC_MESSAGES/content_allocation.mo | Bin 0 -> 2081 bytes .../de_DE/LC_MESSAGES/content_allocation.po | 112 + .../content_allocation/locale/potfiles.txt | 15 + .../content_allocation/scripts/complexlist.js | 133 + .../content_allocation/style/complexlist.css | 105 + .../templates/template.tree_article.html | 17 + .../templates/template.tree_complexlist.html | 76 + .../templates/template.tree_structure.html | 13 + .../xml/content_allocation.xml | 12 + .../content_allocation/xml/lang_de_DE.xml | 11 + .../content_allocation/xml/lang_en_EN.xml | 11 + .../content_allocation/xml/lang_en_US.xml | 11 + .../frontendlogic/category/category.php | 82 + .../frontendlogic/category/docs/conlogo.gif | Bin 0 -> 5334 bytes .../docs/frontend.protectedcategories.html | 104 + .../LC_MESSAGES/frontendlogic_category.mo | Bin 0 -> 647 bytes .../LC_MESSAGES/frontendlogic_category.po | 25 + .../frontendlogic/includes/config.plugin.php | 31 + .../frontendusers/includes/config.plugin.php | 7 + .../frontendusers/valid_from/valid_from.php | 66 + .../frontendusers/valid_to/valid_to.php | 62 + conlite/plugins/index.php | 4 + .../linkchecker/includes/config.plugin.php | 47 + .../includes/include.checkperms.php | 89 + .../includes/include.linkchecker.php | 413 + .../includes/include.linkchecker_tests.php | 310 + .../include.linkchecker_whitelist.php | 85 + .../locale/de_DE/LC_MESSAGES/linkchecker.mo | Bin 0 -> 2139 bytes .../locale/de_DE/LC_MESSAGES/linkchecker.po | 122 + .../linkchecker/locale/linkchecker.pot | 135 + .../plugins/linkchecker/locale/potfiles.txt | 12 + .../template.linkchecker_noerrors.html | 36 + .../standard/template.linkchecker_test.html | 202 + .../template.linkchecker_test_errors.html | 7 + .../template.linkchecker_test_errors_cat.html | 7 + .../template.linkchecker_test_nothing.html | 3 + .../template.linkchecker_whitelist.html | 51 + .../template.linkchecker_whitelist_urls.html | 5 + .../plugins/linkchecker/xml/lang_de_DE.xml | 14 + .../plugins/linkchecker/xml/lang_en_EN.xml | 14 + .../plugins/linkchecker/xml/lang_en_US.xml | 14 + .../mod_rewrite/classes/class.modrewrite.php | 1025 + .../classes/class.modrewritebase.php | 99 + .../classes/class.modrewritecontroller.php | 634 + .../classes/class.modrewritedebugger.php | 74 + .../classes/class.modrewritetest.php | 325 + .../classes/class.modrewriteurlstack.php | 343 + .../classes/class.modrewriteurlutil.php | 342 + .../class.modrewrite_content_controller.php | 407 + ...ss.modrewrite_contentexpert_controller.php | 137 + ...lass.modrewrite_contenttest_controller.php | 161 + .../class.modrewrite_controller_abstract.php | 148 + .../external/aToolTip/css/atooltip.css | 43 + .../external/aToolTip/css/style.css | 174 + .../mod_rewrite/external/aToolTip/demos.html | 81 + .../external/aToolTip/images/bg.png | Bin 0 -> 1218 bytes .../external/aToolTip/images/infoBtn.gif | Bin 0 -> 90 bytes .../external/aToolTip/js/atooltip.jquery.js | 118 + .../aToolTip/js/atooltip.min.jquery.js | 2 + .../external/aToolTip/js/jquery.min.js | 19 + .../files/htaccess_restrictive.txt | 71 + .../mod_rewrite/files/htaccess_simple.txt | 69 + .../includes/config.mod_rewrite_default.php | 128 + .../mod_rewrite/includes/config.plugin.php | 178 + .../includes/front_content_controller.php | 115 + .../includes/functions.mod_rewrite.php | 967 + .../includes/include.mod_rewrite_content.php | 324 + .../include.mod_rewrite_contentexpert.php | 169 + .../include.mod_rewrite_contenttest.php | 108 + .../locale/de_DE/LC_MESSAGES/mod_rewrite.mo | Bin 0 -> 29426 bytes .../locale/de_DE/LC_MESSAGES/mod_rewrite.po | 951 + .../mod_rewrite/locale/mod_rewrite.pot | 740 + .../plugins/mod_rewrite/locale/potfiles.txt | 22 + conlite/plugins/mod_rewrite/readme.txt | 294 + .../mod_rewrite/scripts/mod_rewrite.js | 87 + conlite/plugins/mod_rewrite/styles/styles.css | 100 + .../mod_rewrite/templates/content.html | 366 + .../mod_rewrite/templates/contentexpert.html | 153 + .../mod_rewrite/templates/contenttest.html | 64 + .../plugins/mod_rewrite/xml/lang_de_DE.xml | 14 + .../plugins/mod_rewrite/xml/lang_en_US.xml | 14 + conlite/plugins/newsletter/check.plugin.xml | 73 + .../classes/class.newsletter.groups.php | 329 + .../classes/class.newsletter.jobs.php | 504 + .../classes/class.newsletter.logs.php | 265 + .../newsletter/classes/class.newsletter.php | 1026 + .../classes/class.newsletter.recipients.php | 289 + .../newsletter/includes/config.autoloader.php | 32 + .../newsletter/includes/config.plugin.php | 20 + .../includes/include.newsletter_edit.php | 582 + .../include.newsletter_edit_message.php | 276 + .../include.newsletter_jobs_details.php | 398 + .../includes/include.newsletter_jobs_menu.php | 344 + .../include.newsletter_jobs_subnav.php | 67 + .../includes/include.newsletter_left_top.php | 960 + .../includes/include.newsletter_menu.php | 380 + .../includes/include.newsletter_subnav.php | 65 + .../include.recipients.group.subnav.php | 74 + .../include.recipients.group_edit.php | 586 + .../include.recipients.group_menu.php | 240 + .../includes/include.recipients_edit.php | 250 + .../includes/include.recipients_import.php | 377 + .../includes/include.recipients_menu.php | 301 + .../repository/custom/FrontendNavigation.php | 796 + .../workflow/classes/class.workflow.php | 187 + .../classes/class.workflowactions.php | 132 + .../classes/class.workflowallocation.php | 242 + .../classes/class.workflowartallocation.php | 361 + .../workflow/classes/class.workflowitems.php | 329 + .../workflow/classes/class.workflowtasks.php | 106 + .../classes/class.workflowusersequence.php | 278 + .../workflow/cronjobs/advance_workflow.php | 114 + .../workflow/images/no_verschieben.gif | Bin 0 -> 121 bytes .../workflow/images/nu_verschieben.gif | Bin 0 -> 121 bytes conlite/plugins/workflow/images/workflow.gif | Bin 0 -> 96 bytes .../plugins/workflow/images/workflow_alt.gif | Bin 0 -> 96 bytes .../workflow/images/workflow_email_noti.gif | Bin 0 -> 90 bytes .../workflow/images/workflow_erstellen.gif | Bin 0 -> 74 bytes .../workflow/images/workflow_escal_noti.gif | Bin 0 -> 84 bytes .../plugins/workflow/images/workflow_step.gif | Bin 0 -> 61 bytes .../workflow/images/workflow_step_delete.gif | Bin 0 -> 195 bytes .../images/workflow_step_ist_raus.gif | Bin 0 -> 61 bytes .../workflow/images/workflow_step_new.gif | Bin 0 -> 74 bytes .../plugins/workflow/images/workflow_user.gif | Bin 0 -> 113 bytes .../workflow/includes/config.plugin.php | 453 + .../workflow/includes/functions.workflow.php | 552 + .../includes/include.workflow_edit.php | 109 + .../includes/include.workflow_left_top.php | 48 + .../includes/include.workflow_list.php | 129 + .../includes/include.workflow_steps.php | 405 + .../includes/include.workflow_subnav.php | 113 + .../includes/include.workflow_tasks.php | 274 + .../locale/de_DE/LC_MESSAGES/workflow.mo | Bin 0 -> 6472 bytes .../locale/de_DE/LC_MESSAGES/workflow.po | 453 + conlite/plugins/workflow/locale/potfiles.txt | 18 + conlite/plugins/workflow/locale/workflow.pot | 398 + conlite/plugins/workflow/plugin_workflow.xml | 17 + .../templates/template.workflow_steps.html | 13 + .../templates/template.workflow_tasks.html | 157 + conlite/plugins/workflow/xml/lang_de_DE.xml | 17 + conlite/plugins/workflow/xml/lang_en_EN.xml | 17 + conlite/plugins/workflow/xml/lang_en_US.xml | 17 + conlite/scripts/HTMLObj.js.php | 401 + conlite/scripts/addImageTags.js | 61 + conlite/scripts/articleObject.js.php | 475 + conlite/scripts/browserCheck.js | 33 + conlite/scripts/cfoldingrow.js | 38 + conlite/scripts/cmsDate.js | 177 + conlite/scripts/cmsFileList.js | 426 + conlite/scripts/cmsTeaser.js | 268 + conlite/scripts/conFrameResize.js | 352 + conlite/scripts/con_tiny.js | 367 + conlite/scripts/contenidoConfig.js | 305 + conlite/scripts/contextMenu.js | 112 + conlite/scripts/expandCollapse.js | 94 + conlite/scripts/general.js | 68 + conlite/scripts/group_association.js | 144 + conlite/scripts/header.js | 452 + conlite/scripts/help.js.php | 79 + conlite/scripts/iZoom.js.php | 80 + conlite/scripts/index.php | 4 + conlite/scripts/infoBox.js | 20 + .../i18n/jquery.ui.colorpicker-de.js | 27 + .../i18n/jquery.ui.colorpicker-el.js | 28 + .../i18n/jquery.ui.colorpicker-en-GB.js | 27 + .../i18n/jquery.ui.colorpicker-en-US.js | 27 + .../i18n/jquery.ui.colorpicker-en.js | 27 + .../i18n/jquery.ui.colorpicker-fr.js | 27 + .../i18n/jquery.ui.colorpicker-nl.js | 27 + .../i18n/jquery.ui.colorpicker-pt-BR.js | 27 + .../i18n/jquery.ui.colorpicker-ru.js | 27 + .../colorpicker/images/128/bar-alpha.png | Bin 0 -> 1564 bytes .../jquery/colorpicker/images/128/bar.png | Bin 0 -> 1076 bytes .../jquery/colorpicker/images/128/map.png | Bin 0 -> 37070 bytes .../jquery/colorpicker/images/bar-alpha.png | Bin 0 -> 2195 bytes .../jquery/colorpicker/images/bar-opacity.png | Bin 0 -> 134 bytes .../jquery/colorpicker/images/bar-pointer.png | Bin 0 -> 198 bytes .../scripts/jquery/colorpicker/images/bar.png | Bin 0 -> 382 bytes .../jquery/colorpicker/images/map-opacity.png | Bin 0 -> 139 bytes .../jquery/colorpicker/images/map-pointer.png | Bin 0 -> 344 bytes .../scripts/jquery/colorpicker/images/map.png | Bin 0 -> 78245 bytes .../colorpicker/images/preview-opacity.png | Bin 0 -> 135 bytes .../colorpicker/images/ui-colorpicker.png | Bin 0 -> 494 bytes .../jquery/colorpicker/jquery.colorpicker.css | 227 + .../jquery/colorpicker/jquery.colorpicker.js | 3004 +++ .../jquery.ui.colorpicker-cmyk-parser.js | 13 + ...y.ui.colorpicker-cmyk-percentage-parser.js | 13 + .../parts/jquery.ui.colorpicker-memory.js | 75 + .../parts/jquery.ui.colorpicker-rgbslider.js | 81 + .../jquery.ui.colorpicker-swatchesswitcher.js | 28 + .../swatches/jquery.ui.colorpicker-crayola.js | 125 + .../swatches/jquery.ui.colorpicker-pantone.js | 942 + .../jquery.ui.colorpicker-ral-classic.js | 218 + .../swatches/jquery.ui.colorpicker-x11.js | 150 + .../jquery/jquery-migrate-1.2.1.min.js | 2 + conlite/scripts/jquery/jquery-ui.js | 13 + conlite/scripts/jquery/jquery-ui.old.js | 756 + conlite/scripts/jquery/jquery.js | 5 + conlite/scripts/jquery/jquery.old.js | 154 + .../scripts/jscalendar/calendar-contenido.css | 232 + conlite/scripts/jscalendar/calendar-setup.js | 200 + conlite/scripts/jscalendar/calendar.js | 1882 ++ .../scripts/jscalendar/lang/calendar-af.js | 39 + .../scripts/jscalendar/lang/calendar-al.js | 100 + .../scripts/jscalendar/lang/calendar-bg.js | 124 + .../jscalendar/lang/calendar-big5-utf8.js | 123 + .../scripts/jscalendar/lang/calendar-big5.js | 123 + .../scripts/jscalendar/lang/calendar-br.js | 108 + .../scripts/jscalendar/lang/calendar-ca.js | 123 + .../jscalendar/lang/calendar-cs-utf8.js | 65 + .../jscalendar/lang/calendar-cs-win.js | 65 + .../scripts/jscalendar/lang/calendar-da.js | 123 + .../scripts/jscalendar/lang/calendar-de.js | 124 + .../scripts/jscalendar/lang/calendar-du.js | 45 + .../scripts/jscalendar/lang/calendar-el.js | 89 + .../scripts/jscalendar/lang/calendar-en.js | 127 + .../scripts/jscalendar/lang/calendar-es.js | 129 + .../scripts/jscalendar/lang/calendar-fi.js | 98 + .../scripts/jscalendar/lang/calendar-fr.js | 125 + .../jscalendar/lang/calendar-he-utf8.js | 123 + .../scripts/jscalendar/lang/calendar-hu.js | 124 + .../scripts/jscalendar/lang/calendar-it.js | 124 + .../scripts/jscalendar/lang/calendar-jp.js | 45 + .../jscalendar/lang/calendar-ko-utf8.js | 120 + .../scripts/jscalendar/lang/calendar-ko.js | 120 + .../jscalendar/lang/calendar-lt-utf8.js | 114 + .../scripts/jscalendar/lang/calendar-lt.js | 114 + .../scripts/jscalendar/lang/calendar-lv.js | 123 + .../scripts/jscalendar/lang/calendar-nl.js | 73 + .../scripts/jscalendar/lang/calendar-no.js | 114 + .../jscalendar/lang/calendar-pl-utf8.js | 93 + .../scripts/jscalendar/lang/calendar-pl.js | 56 + .../scripts/jscalendar/lang/calendar-pt.js | 123 + .../scripts/jscalendar/lang/calendar-ro.js | 66 + .../scripts/jscalendar/lang/calendar-ru.js | 123 + .../jscalendar/lang/calendar-ru_win_.js | 123 + .../scripts/jscalendar/lang/calendar-si.js | 94 + .../scripts/jscalendar/lang/calendar-sk.js | 99 + .../scripts/jscalendar/lang/calendar-sp.js | 110 + .../scripts/jscalendar/lang/calendar-sv.js | 93 + .../scripts/jscalendar/lang/calendar-tr.js | 58 + .../scripts/jscalendar/lang/calendar-zh.js | 119 + conlite/scripts/jscalendar/lang/cn_utf8.js | 123 + conlite/scripts/jscalendar/menuarrow.gif | Bin 0 -> 68 bytes conlite/scripts/jscalendar/menuarrow2.gif | Bin 0 -> 49 bytes conlite/scripts/langref.php | 34 + conlite/scripts/md5.js | 382 + conlite/scripts/messageBox.js.php | 393 + conlite/scripts/parameterCollector.js | 41 + conlite/scripts/rights.js.php | 318 + conlite/scripts/rowMark.js | 428 + conlite/scripts/setPager.js | 30 + conlite/scripts/str_overview.js | 398 + conlite/scripts/subnav.js | 89 + conlite/scripts/tip_balloon.js | 166 + conlite/scripts/tip_balloon/b.gif | Bin 0 -> 44 bytes conlite/scripts/tip_balloon/background.gif | Bin 0 -> 43 bytes conlite/scripts/tip_balloon/l.gif | Bin 0 -> 44 bytes conlite/scripts/tip_balloon/lb.gif | Bin 0 -> 56 bytes conlite/scripts/tip_balloon/lt.gif | Bin 0 -> 56 bytes conlite/scripts/tip_balloon/r.gif | Bin 0 -> 44 bytes conlite/scripts/tip_balloon/rb.gif | Bin 0 -> 56 bytes conlite/scripts/tip_balloon/rt.gif | Bin 0 -> 56 bytes conlite/scripts/tip_balloon/stemb.gif | Bin 0 -> 123 bytes conlite/scripts/tip_balloon/stemt.gif | Bin 0 -> 187 bytes conlite/scripts/tip_balloon/t.gif | Bin 0 -> 44 bytes conlite/scripts/wz_tooltip.js | 1143 + conlite/styles/cms_filelist.css | 487 + conlite/styles/cms_teaser.css | 143 + conlite/styles/conlite.css | 66 + conlite/styles/contenido.css | 1113 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../styles/images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../styles/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../styles/images/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../styles/images/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../styles/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes conlite/styles/index.php | 4 + conlite/styles/inuse.css | 33 + conlite/styles/jquery-ui.css | 1225 + conlite/styles/str_overview.css | 188 + conlite/styles/tip_balloon.css | 6 + conlite/subnav.php | 61 + conlite/temp/.keep | 0 conlite/temp/deprecated.txt | 2 + conlite/templates/index.php | 4 + conlite/templates/standard/filler.html | 9 + conlite/templates/standard/frameset.html | 20 + .../templates/standard/frameset_content.html | 54 + .../standard/frameset_content_left.html | 23 + .../standard/frameset_content_right.html | 23 + .../standard/frameset_menuless_content.html | 25 + conlite/templates/standard/generic_list.html | 25 + conlite/templates/standard/header.html | 78 + .../standard/html5/template.generic_page.html | 19 + conlite/templates/standard/index.php | 4 + conlite/templates/standard/submenu.html | 5 + .../standard/template.admin_frontend.html | 196 + .../template.backend_search_results.html | 151 + .../templates/standard/template.blank.html | 15 + .../standard/template.client_edit.html | 36 + .../standard/template.client_left_top.html | 30 + .../standard/template.client_menu.html | 60 + .../standard/template.client_subnav.html | 37 + .../template.cms_filelist_dirlistitem.html | 15 + .../standard/template.cms_filelist_edit.html | 135 + ...plate.cms_filelist_metadata_limititem.html | 8 + .../standard/template.cms_teaser_edit.html | 114 + .../standard/template.con_art_overview.html | 196 + .../standard/template.con_edit_form.html | 227 + .../standard/template.con_left_top.html | 325 + .../standard/template.con_str_overview.html | 182 + .../template.con_str_overview.list.html | 7 + .../standard/template.con_subnav.html | 45 + .../standard/template.con_subnav_noleft.html | 36 + conlite/templates/standard/template.deco.html | 16 + .../standard/template.default_subnav.html | 58 + .../standard/template.file_subnav.html | 42 + .../standard/template.files_overview.html | 35 + .../standard/template.generic_form.html | 4 + .../standard/template.generic_left_top.html | 31 + .../standard/template.generic_list.html | 7 + .../standard/template.generic_list_row.html | 1 + .../standard/template.generic_menu.html | 12 + .../standard/template.generic_page.html | 21 + .../standard/template.generic_table_form.html | 16 + .../standard/template.grouprights_create.html | 38 + .../template.grouprights_details.html | 39 + .../template.grouprights_left_top.html | 42 + .../template.grouprights_memberlist.html | 30 + .../template.grouprights_memberselect.html | 81 + .../standard/template.grouprights_menu.html | 53 + .../template.grouprights_overview.html | 43 + .../standard/template.html_tpl_left_top.html | 28 + conlite/templates/standard/template.info.html | 210 + .../standard/template.inuse_lay_mod.html | 15 + .../standard/template.inuse_tpl.html | 20 + .../standard/template.js_left_top.html | 27 + .../standard/template.lang_edit.html | 32 + .../standard/template.lang_left_top.html | 67 + .../standard/template.lang_overview.html | 63 + .../standard/template.lay_edit_form.html | 60 + .../standard/template.lay_overview.html | 81 + .../templates/standard/template.left_top.html | 26 + .../standard/template.left_top_blank.html | 20 + .../templates/standard/template.log_main.html | 70 + .../templates/standard/template.log_menu.html | 26 + .../standard/template.mod_edit_form.html | 62 + .../standard/template.mod_left_top.html | 120 + .../template.mycontenido_lastarticles.html | 84 + .../template.mycontenido_settings.html | 36 + .../standard/template.mycontenido_start.html | 25 + .../standard/template.mycontenido_subnav.html | 52 + .../standard/template.newsletter_edit.html | 31 + .../template.newsletter_left_top.html | 462 + .../standard/template.newsletter_menu.html | 53 + .../standard/template.recipient_edit.html | 35 + .../standard/template.recipient_left_top.html | 54 + .../standard/template.recipient_menu.html | 113 + .../standard/template.request_password.html | 26 + .../standard/template.right_top_blank.html | 21 + .../standard/template.rights_create.html | 38 + .../standard/template.rights_details.html | 40 + .../standard/template.rights_inc.html | 49 + .../standard/template.rights_left_top.html | 128 + .../standard/template.rights_menu.html | 47 + .../standard/template.rights_overview.html | 59 + .../templates/standard/template.select.html | 7 + .../standard/template.stat_left_top.html | 23 + .../standard/template.stat_menu.html | 35 + .../standard/template.stat_overview.html | 178 + .../standard/template.stat_subnav.html | 32 + .../templates/standard/template.stat_top.html | 54 + .../standard/template.str_overview.html | 304 + .../standard/template.style_left_top.html | 28 + .../templates/standard/template.subnav.html | 34 + .../standard/template.subnav_blank.html | 29 + .../standard/template.subnav_noleft.html | 32 + .../standard/template.symbolhelp.html | 1928 ++ .../standard/template.system_purge.html | 344 + .../standard/template.system_subnav.html | 36 + .../standard/template.system_variables.html | 77 + .../standard/template.tpl_edit_form.html | 98 + .../standard/template.tpl_overview.html | 77 + .../standard/template.tplcfg_edit_form.html | 65 + .../standard/template.upl_dirs_overview.html | 88 + .../standard/template.upl_files_overview.html | 100 + .../standard/template.upl_left_top.html | 45 + .../templates/standard/template.welcome.html | 65 + .../standard/template.welcome_update.html | 29 + conlite/templates/standard/white.html | 8 + .../widgets/template.widgets.left_top.html | 3 + conlite/tools/create_autoloader_cfg.php | 125 + .../mpClassMapFileCreator.php | 135 + .../mpClassMapFileCreatorContenido.php | 115 + .../mpClassTypeFinder.php | 400 + conlite/tools/phpcompatinfo.php | 69 + conlite/xml/conrepo.xsd | 27 + conlite/xml/index.php | 4 + conlite/xml/lang_de_DE.xml | 130 + conlite/xml/lang_en_US.xml | 130 + conlite/xml/lang_fr_FR.xml | 115 + data/.directory | 4 + data/backup/index.php | 4 + data/cache/index.php | 4 + data/config/production/cfg_sql.inc.php | 104 + data/config/production/config.autoloader.php | 330 + data/config/production/config.chains.php | 807 + data/config/production/config.colors.php | 42 + data/config/production/config.http_check.php | 91 + data/config/production/config.misc.php | 315 + data/config/production/config.path.php | 73 + data/config/production/config.templates.php | 170 + data/config/production/index.php | 4 + data/logs/index.php | 4 + data/temp/index.php | 4 + docs/techref/backend/backend.autoloader.html | 213 + .../techref/backend/backend.customizing.1.gif | Bin 0 -> 3358 bytes docs/techref/backend/backend.customizing.html | 537 + docs/techref/backend/backend.localconfig.html | 60 + docs/techref/backend/backend.plugauth.html | 85 + docs/techref/backend/conlogo.gif | Bin 0 -> 1325 bytes docs/techref/frontend/conlogo.gif | Bin 0 -> 5334 bytes .../frontend/frontend.customizing.html | 120 + .../frontend/frontend.permissions.html | 118 + .../frontend.protectedcategories.html | 104 + docs/techref/frontend/frontend.session.html | 118 + docs/techref/modules/conlogo.gif | Bin 0 -> 5334 bytes docs/techref/modules/module.login.html | 148 + docs/techref/modules/output-gen.jpg | Bin 0 -> 14270 bytes docs/techref/modules/writing.modules.html | 172 + .../plugins/Contenido Extension Chainer.pdf | Bin 0 -> 57226 bytes docs/techref/plugins/conlogo.gif | Bin 0 -> 5334 bytes docs/techref/plugins/plugin.config.html | 119 + docs/translators/translating.doc | Bin 0 -> 46080 bytes pear/Cache/Cache.php | 357 + pear/Cache/Container.php | 455 + pear/Cache/Container/file.php | 388 + pear/Cache/Error.php | 51 + pear/Cache/Lite.php | 835 + pear/Cache/Output.php | 215 + pear/File/Archive.php | 1434 ++ pear/File/Archive/Predicate.php | 57 + pear/File/Archive/Predicate/And.php | 87 + pear/File/Archive/Predicate/Current.php | 52 + pear/File/Archive/Predicate/Custom.php | 88 + pear/File/Archive/Predicate/Duplicate.php | 116 + pear/File/Archive/Predicate/Ereg.php | 59 + pear/File/Archive/Predicate/Eregi.php | 61 + pear/File/Archive/Predicate/Extension.php | 71 + pear/File/Archive/Predicate/False.php | 47 + pear/File/Archive/Predicate/Index.php | 62 + pear/File/Archive/Predicate/MIME.php | 75 + pear/File/Archive/Predicate/MaxDepth.php | 63 + pear/File/Archive/Predicate/MinSize.php | 59 + pear/File/Archive/Predicate/MinTime.php | 63 + pear/File/Archive/Predicate/Not.php | 55 + pear/File/Archive/Predicate/Or.php | 85 + pear/File/Archive/Predicate/True.php | 45 + pear/File/Archive/Reader.php | 427 + pear/File/Archive/Reader/Ar.php | 387 + pear/File/Archive/Reader/Archive.php | 98 + pear/File/Archive/Reader/Bzip2.php | 254 + pear/File/Archive/Reader/Cache.php | 262 + pear/File/Archive/Reader/ChangeName.php | 136 + .../Reader/ChangeName/AddDirectory.php | 89 + .../Archive/Reader/ChangeName/Callback.php | 52 + .../Archive/Reader/ChangeName/Directory.php | 100 + pear/File/Archive/Reader/Concat.php | 195 + pear/File/Archive/Reader/Directory.php | 309 + pear/File/Archive/Reader/File.php | 296 + pear/File/Archive/Reader/Filter.php | 90 + pear/File/Archive/Reader/Gzip.php | 276 + pear/File/Archive/Reader/Memory.php | 227 + pear/File/Archive/Reader/MimeList.php | 939 + pear/File/Archive/Reader/Multi.php | 95 + pear/File/Archive/Reader/Relay.php | 134 + pear/File/Archive/Reader/Select.php | 63 + pear/File/Archive/Reader/Tar.php | 412 + pear/File/Archive/Reader/Uncompress.php | 317 + pear/File/Archive/Reader/Zip.php | 482 + pear/File/Archive/Writer.php | 119 + pear/File/Archive/Writer/AddBaseName.php | 102 + pear/File/Archive/Writer/Ar.php | 209 + pear/File/Archive/Writer/Archive.php | 129 + pear/File/Archive/Writer/Bzip2.php | 147 + pear/File/Archive/Writer/Files.php | 259 + pear/File/Archive/Writer/Gzip.php | 139 + pear/File/Archive/Writer/Mail.php | 204 + pear/File/Archive/Writer/Memory.php | 127 + pear/File/Archive/Writer/MemoryArchive.php | 213 + pear/File/Archive/Writer/Multi.php | 130 + pear/File/Archive/Writer/Output.php | 93 + pear/File/Archive/Writer/Tar.php | 244 + pear/File/Archive/Writer/UniqueAppender.php | 143 + pear/File/Archive/Writer/Zip.php | 260 + pear/File/Iterator.php | 197 + pear/File/Iterator/Factory.php | 155 + pear/HTML/Common.php | 419 + pear/HTML/Common2.php | 569 + pear/Log.php | 631 + pear/Log/composite.php | 196 + pear/Log/console.php | 190 + pear/Log/display.php | 108 + pear/Log/error_log.php | 104 + pear/Log/file.php | 286 + pear/Log/mail.php | 222 + pear/Log/mcal.php | 171 + pear/Log/null.php | 68 + pear/Log/observer.php | 126 + pear/Log/sql.php | 210 + pear/Log/sqlite.php | 238 + pear/Log/syslog.php | 160 + pear/Log/win.php | 249 + pear/MIME/Type.php | 523 + pear/MIME/Type/Extension.php | 298 + pear/MIME/Type/Parameter.php | 163 + pear/Net/IDNA.php | 100 + pear/Net/IDNA/php4.php | 2961 +++ pear/Net/IDNA/php5.php | 3226 +++ pear/Net/UserAgent/Detect.php | 907 + pear/OLE/OLE.php | 410 + pear/OLE/PPS.php | 219 + pear/OLE/PPS/File.php | 114 + pear/OLE/PPS/Root.php | 519 + pear/OS/Guess.php | 265 + pear/PEAR.php | 968 + pear/PEAR/Autoloader.php | 186 + pear/PEAR/Builder.php | 391 + pear/PEAR/Command.php | 322 + pear/PEAR/Command/Auth.php | 155 + pear/PEAR/Command/Build.php | 89 + pear/PEAR/Command/Common.php | 249 + pear/PEAR/Command/Config.php | 225 + pear/PEAR/Command/Install.php | 416 + pear/PEAR/Command/Mirror.php | 99 + pear/PEAR/Command/Package.php | 679 + pear/PEAR/Command/Registry.php | 351 + pear/PEAR/Command/Remote.php | 409 + pear/PEAR/Common.php | 1688 ++ pear/PEAR/Config.php | 1166 + pear/PEAR/Dependency.php | 386 + pear/PEAR/Frontend/CLI.php | 495 + pear/PEAR/Installer.php | 925 + pear/PEAR/Packager.php | 176 + pear/PEAR/Registry.php | 527 + pear/PEAR/Remote.php | 391 + pear/README.contenido | 4 + pear/Spreadsheet/Excel/Writer.php | 104 + pear/Spreadsheet/Excel/Writer/BIFFwriter.php | 241 + pear/Spreadsheet/Excel/Writer/Format.php | 1035 + pear/Spreadsheet/Excel/Writer/Parser.php | 1760 ++ pear/Spreadsheet/Excel/Writer/Validator.php | 225 + pear/Spreadsheet/Excel/Writer/Workbook.php | 1544 ++ pear/Spreadsheet/Excel/Writer/Worksheet.php | 3522 +++ pear/System.php | 449 + pear/XML/Parser.php | 356 + pear/XML/Parser2.php | 671 + pear/XML/Parser2/Simple.php | 301 + pear/XML/RPC.php | 1853 ++ pear/XML/RPC/Dump.php | 187 + pear/XML/RPC/Server.php | 612 + pear/XML/RSS.php | 348 + pear/XML/Serializer.php | 1255 + pear/XML/Tree.php | 559 + pear/XML/Tree/Node.php | 587 + pear/XML/Unserializer.php | 983 + pear/package.dtd | 110 + pear/package.xml | 80 + pear/scripts/pear.bat | 69 + pear/scripts/pear.sh | 28 + pear/scripts/pearcmd.php | 298 + pear/template.spec | 64 + setup/data/base.txt | 17 + setup/data/base/base_actions1.sql | 178 + setup/data/base/base_area1.sql | 101 + setup/data/base/base_chartable1.sql | 202 + setup/data/base/base_chartable2.sql | 201 + setup/data/base/base_chartable3.sql | 201 + setup/data/base/base_chartable4.sql | 201 + setup/data/base/base_chartable5.sql | 201 + setup/data/base/base_chartable6.sql | 201 + setup/data/base/base_chartable7.sql | 122 + setup/data/base/base_files1.sql | 213 + setup/data/base/base_framefiles1.sql | 180 + setup/data/base/base_framefiles2.sql | 30 + setup/data/base/base_meta_type1.sql | 9 + setup/data/base/base_misc1.sql | 1 + setup/data/base/base_nav_main1.sql | 6 + setup/data/base/base_nav_sub1.sql | 83 + setup/data/base/base_type1.sql | 23 + setup/data/client.txt | 1 + setup/data/client/client1.sql | 8 + setup/data/client/client1_nocontent.sql | 6 + setup/data/client_no_content.txt | 1 + setup/data/examples.txt | 0 setup/data/indexes.sql | 91 + setup/data/plugin_content_allocation.txt | 1 + setup/data/plugin_mod_rewrite.txt | 1 + setup/data/plugin_newsletter.txt | 1 + .../plugins/plugins_content_allocation.sql | 2 + setup/data/plugins/plugins_mod_rewrite.sql | 22 + setup/data/plugins/plugins_newsletter.sql | 1 + setup/data/standard.txt | 3 + setup/data/standard/standard_modules1.sql | 25 + .../standard_modules_translations1.sql | 201 + .../standard_modules_translations2.sql | 72 + setup/data/sysadmin.txt | 1 + setup/data/sysadmin/sysadmin1.sql | 1 + setup/data/tables.txt | 514 + setup/data/tables_pi.txt | 44 + setup/dbupdate.php | 262 + setup/images/cl-logo.gif | Bin 0 -> 4047 bytes setup/images/controls/arrow_closed.png | Bin 0 -> 335 bytes setup/images/controls/arrow_open.png | Bin 0 -> 342 bytes setup/images/controls/back.gif | Bin 0 -> 131 bytes setup/images/controls/pbend.gif | Bin 0 -> 135 bytes setup/images/controls/up_over.png | Bin 0 -> 617 bytes setup/images/icons/error.png | Bin 0 -> 367 bytes setup/images/icons/info.png | Bin 0 -> 251 bytes setup/images/icons/warning.png | Bin 0 -> 298 bytes setup/images/spacer.gif | Bin 0 -> 43 bytes setup/index.php | 195 + setup/lib/class.setupcontrols.php | 281 + setup/lib/class.setupmask.php | 139 + setup/lib/class.template.php | 283 + setup/lib/defines.php | 61 + setup/lib/functions.environment.php | 142 + setup/lib/functions.filesystem.php | 371 + setup/lib/functions.libraries.php | 104 + setup/lib/functions.mysql.php | 302 + setup/lib/functions.phpinfo.php | 207 + setup/lib/functions.safe_mode.php | 69 + setup/lib/functions.setup.php | 64 + setup/lib/functions.sql.php | 232 + setup/lib/functions.system.php | 323 + setup/lib/release.php | 258 + setup/lib/release.xml | 101 + setup/lib/startup.php | 121 + setup/locale/de_DE/LC_MESSAGES/setup.mo | Bin 0 -> 36023 bytes setup/locale/de_DE/LC_MESSAGES/setup.po | 847 + setup/locale/potfiles.txt | 57 + setup/locale/setup.pot | 946 + setup/makeconfig.php | 100 + setup/script/pluginInfo.js | 80 + setup/steps/forms/additionalplugins.php | 87 + setup/steps/forms/clientadjust.php | 126 + setup/steps/forms/clientmode.php | 73 + setup/steps/forms/configmode.php | 100 + setup/steps/forms/installer.php | 70 + setup/steps/forms/pathinfo.php | 71 + setup/steps/forms/setupresults.php | 101 + setup/steps/forms/setupsummary.php | 119 + setup/steps/forms/systemdata.php | 192 + setup/steps/forms/systemtest.php | 578 + setup/steps/languagechooser.php | 66 + setup/steps/migration/domigration.php | 38 + setup/steps/migration/step1.php | 38 + setup/steps/migration/step2.php | 38 + setup/steps/migration/step3.php | 40 + setup/steps/migration/step4.php | 39 + setup/steps/migration/step5.php | 38 + setup/steps/migration/step6.php | 38 + setup/steps/migration/step7.php | 38 + setup/steps/migration/step8.php | 38 + setup/steps/notinstallable.php | 55 + setup/steps/setup/doinstall.php | 38 + setup/steps/setup/step1.php | 39 + setup/steps/setup/step2.php | 40 + setup/steps/setup/step3.php | 40 + setup/steps/setup/step4.php | 39 + setup/steps/setup/step5.php | 39 + setup/steps/setup/step6.php | 38 + setup/steps/setup/step7.php | 44 + setup/steps/setup/step8.php | 39 + setup/steps/setuptype.php | 92 + setup/steps/upgrade/doupgrade.php | 38 + setup/steps/upgrade/step1.php | 39 + setup/steps/upgrade/step2.php | 39 + setup/steps/upgrade/step3.php | 40 + setup/steps/upgrade/step4.php | 39 + setup/steps/upgrade/step5.php | 38 + setup/steps/upgrade/step6.php | 38 + setup/steps/upgrade/step7.php | 39 + setup/style/setup.css | 247 + setup/templates/cfoldablerow.tpl | 4 + setup/templates/config.php.tpl | 173 + setup/templates/crow.tpl | 4 + setup/templates/languagechooser.tpl | 8 + setup/templates/notinstallable.tpl | 14 + setup/templates/setup.tpl | 111 + .../setup/forms/additionalplugins.tpl | 25 + setup/templates/setup/forms/clientmode.tpl | 16 + setup/templates/setup/forms/configmode.tpl | 20 + .../setup/forms/configmodewopass.tpl | 20 + setup/templates/setup/forms/databasedata.tpl | 31 + setup/templates/setup/forms/installer.tpl | 32 + setup/templates/setup/forms/pathinfo.tpl | 13 + setup/templates/setup/forms/setupresults.tpl | 17 + .../setup/forms/setupresultsfail.tpl | 10 + setup/templates/setup/forms/setupsummary.tpl | 12 + setup/templates/setup/forms/systemdata.tpl | 31 + setup/templates/setup/forms/systemtest.tpl | 18 + setup/templates/setuptype.tpl | 33 + 1956 files changed, 343580 insertions(+) create mode 100644 LIZENZ.txt create mode 100644 README_.txt create mode 100644 cms/config.php create mode 100644 cms/css/basic-style.css create mode 100644 cms/css/conlite-demo.css create mode 100644 cms/css/index.php create mode 100644 cms/css/normalize.css create mode 100644 cms/data/modules/index.php create mode 100644 cms/dbfs.php create mode 100644 cms/error.php create mode 100644 cms/favicon.ico create mode 100644 cms/front_content.php create mode 100644 cms/front_crcloginform.inc.php create mode 100644 cms/images/SimpleGallery/ClosePopup.png create mode 100644 cms/images/SimpleGallery/Loading.gif create mode 100644 cms/images/SimpleGallery/NaviLeft.png create mode 100644 cms/images/SimpleGallery/NaviLeftDisabled.png create mode 100644 cms/images/SimpleGallery/NaviRight.png create mode 100644 cms/images/SimpleGallery/NaviRightDisabled.png create mode 100644 cms/images/SimpleGallery/PopupImageNaviLeft.png create mode 100644 cms/images/SimpleGallery/PopupImageNaviRight.png create mode 100644 cms/images/SimpleGallery/ZoomOverlay.png create mode 100644 cms/images/basic-pic1.jpg create mode 100644 cms/images/basic-pic2.jpg create mode 100644 cms/images/basic-pic3.jpg create mode 100644 cms/images/basic-pic4.jpg create mode 100644 cms/images/glyphicons-halflings-white.png create mode 100644 cms/images/glyphicons-halflings.png create mode 100644 cms/images/ico/apple-touch-icon-114-precomposed.png create mode 100644 cms/images/ico/apple-touch-icon-144-precomposed.png create mode 100644 cms/images/ico/apple-touch-icon-57-precomposed.png create mode 100644 cms/images/ico/apple-touch-icon-72-precomposed.png create mode 100644 cms/images/ico/social_icons_sprite.png create mode 100644 cms/images/index.php create mode 100644 cms/images/logo-small.png create mode 100644 cms/images/logo.png create mode 100644 cms/includes/Util/Modules/Contenido_NavMain_Util.class.php create mode 100644 cms/includes/Util/Modules/Contenido_Sitemap_Util.class.php create mode 100644 cms/includes/class.concache.php create mode 100644 cms/includes/class.input.helper.php create mode 100644 cms/includes/concache.php create mode 100644 cms/includes/functions.include.php create mode 100644 cms/includes/functions.navigation.php create mode 100644 cms/includes/rss.inc.php create mode 100644 cms/includes/rss_php.php create mode 100644 cms/includes/spider-it.functions.inc.php create mode 100644 cms/index.php create mode 100644 cms/js/flexslider/flexslider.css create mode 100644 cms/js/flexslider/images/bg_direction_nav.png create mode 100644 cms/js/flexslider/images/loader.gif create mode 100644 cms/js/flexslider/jquery.flexslider-min.js create mode 100644 cms/js/index.php create mode 100644 cms/js/jquery.cookiesdirective.js create mode 100644 cms/js/libs/jquery-1.9.0.min.js create mode 100644 cms/js/libs/modernizr-2.6.2.min.js create mode 100644 cms/js/main.js create mode 100644 cms/logs/index.php create mode 100644 cms/robots.txt create mode 100644 cms/templates/cl_login_form.html create mode 100644 cms/templates/cms_filelist_style_default.html create mode 100644 cms/templates/cms_teaser_style_block.html create mode 100644 cms/templates/cms_teaser_style_blog.html create mode 100644 cms/templates/contenido_header.html create mode 100644 cms/templates/footnotes_1.html create mode 100644 cms/templates/footnotes_2.html create mode 100644 cms/templates/header.html create mode 100644 cms/templates/headline_h1.html create mode 100644 cms/templates/kontaktformular.html create mode 100644 cms/templates/login_form_loggedin.html create mode 100644 cms/templates/logo_bottom.html create mode 100644 cms/templates/navigation_meta_container.html create mode 100644 cms/templates/navigation_meta_item.html create mode 100644 cms/templates/navigation_standard.html create mode 100644 cms/templates/navigation_standard_li.html create mode 100644 cms/templates/navigation_standard_ul.html create mode 100644 cms/templates/newsletter_form.html create mode 100644 cms/templates/newsletter_handler.html create mode 100644 cms/templates/rss.html create mode 100644 cms/templates/rss_template.html create mode 100644 cms/templates/rss_template_breit.html create mode 100644 cms/templates/search_input.html create mode 100644 cms/templates/search_output.html create mode 100644 cms/templates/simple-gallery.html create mode 100644 cms/templates/sitemap_standard.html create mode 100644 cms/templates/sitemap_standard_li.html create mode 100644 cms/templates/sitemap_standard_ul.html create mode 100644 cms/templates/subheadline_h2.html create mode 100644 cms/templates/teaser-standard.html create mode 100644 cms/templates/teaser_right.html create mode 100644 cms/templates/text_html.html create mode 100644 cms/upload/Gallery/IMAGE_296.jpg create mode 100644 cms/upload/Gallery/PICT0004.JPG create mode 100644 cms/upload/Gallery/PICT0025.JPG create mode 100644 cms/upload/Gallery/PICT0082.JPG create mode 100644 cms/upload/Gallery/PICT0188.JPG create mode 100644 cms/upload/Gallery/Terasse26.jpg create mode 100644 conlib/auth.inc create mode 100644 conlib/ct_file.inc create mode 100644 conlib/ct_ldap.inc create mode 100644 conlib/ct_null.inc create mode 100644 conlib/ct_session.inc create mode 100644 conlib/ct_shm.inc create mode 100644 conlib/ct_sql.inc create mode 100644 conlib/db_mysql.inc create mode 100644 conlib/db_mysqli.inc create mode 100644 conlib/db_pdo_mysql.inc create mode 100644 conlib/db_sql_abstract.inc create mode 100644 conlib/index.php create mode 100644 conlib/local.php create mode 100644 conlib/page.inc create mode 100644 conlib/perm.inc create mode 100644 conlib/prepend.php create mode 100644 conlib/session.inc create mode 100644 conlite/.directory create mode 100644 conlite/.htaccess_recommended create mode 100644 conlite/ajaxmain.php create mode 100644 conlite/backend_search.php create mode 100644 conlite/cache/deprecated.txt create mode 100644 conlite/classes/Contenido_Category/Contenido_Category.class.php create mode 100644 conlite/classes/Contenido_Category/Contenido_Category_Articles.class.php create mode 100644 conlite/classes/Contenido_Category/Sample.php create mode 100644 conlite/classes/Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php create mode 100644 conlite/classes/Contenido_FrontendNavigation/Contenido_FrontendNavigation_Base.class.php create mode 100644 conlite/classes/Contenido_FrontendNavigation/Contenido_FrontendNavigation_Breadcrumb.class.php create mode 100644 conlite/classes/Contenido_FrontendNavigation/Sample.php create mode 100644 conlite/classes/Debug/Debug_DevNull.class.php create mode 100644 conlite/classes/Debug/Debug_File.class.php create mode 100644 conlite/classes/Debug/Debug_Hidden.class.php create mode 100644 conlite/classes/Debug/Debug_Visible.class.php create mode 100644 conlite/classes/Debug/Debug_VisibleAdv.class.php create mode 100644 conlite/classes/Debug/DebuggerFactory.class.php create mode 100644 conlite/classes/Debug/IDebug.php create mode 100644 conlite/classes/Debug/Sample.php create mode 100644 conlite/classes/Url/Contenido_Url.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilder.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilderConfig.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilderFactory.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilder_Custom.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilder_CustomPath.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilder_Frontcontent.class.php create mode 100644 conlite/classes/UrlBuilder/Contenido_UrlBuilder_MR.class.php create mode 100644 conlite/classes/UrlBuilder/Sample.php create mode 100644 conlite/classes/abstract_classes/class.conuser.php create mode 100644 conlite/classes/cApi/class.action.php create mode 100644 conlite/classes/cApi/class.stat.php create mode 100644 conlite/classes/cApi/class.stat_archive.php create mode 100644 conlite/classes/cApi/class.system_property.php create mode 100644 conlite/classes/cApi/class.upload.meta.php create mode 100644 conlite/classes/cApi/class.upload.php create mode 100644 conlite/classes/cHTML5/class.chtml.php create mode 100644 conlite/classes/cHTML5/class.chtml5.button.php create mode 100644 conlite/classes/cHTML5/class.chtml5.list.element.php create mode 100644 conlite/classes/cHTML5/class.chtml5.list.php create mode 100644 conlite/classes/cHTML5/class.chtml5.meta.php create mode 100644 conlite/classes/class.action.php create mode 100644 conlite/classes/class.activeusers.php create mode 100644 conlite/classes/class.ajax.php create mode 100644 conlite/classes/class.area.php create mode 100644 conlite/classes/class.art.php create mode 100644 conlite/classes/class.article.collector.php create mode 100644 conlite/classes/class.article.php create mode 100644 conlite/classes/class.artspec.php create mode 100644 conlite/classes/class.autoload.php create mode 100644 conlite/classes/class.backend.php create mode 100644 conlite/classes/class.cat.php create mode 100644 conlite/classes/class.category.php create mode 100644 conlite/classes/class.cec.php create mode 100644 conlite/classes/class.cec_hook.php create mode 100644 conlite/classes/class.chartable.php create mode 100644 conlite/classes/class.cl_db_backup.php create mode 100644 conlite/classes/class.client.php create mode 100644 conlite/classes/class.cms_date.php create mode 100644 conlite/classes/class.cms_filelist.php create mode 100644 conlite/classes/class.cms_teaser.php create mode 100644 conlite/classes/class.communications.php create mode 100644 conlite/classes/class.conuser.php create mode 100644 conlite/classes/class.csv.php create mode 100644 conlite/classes/class.dbfs.php create mode 100644 conlite/classes/class.excel.php create mode 100644 conlite/classes/class.form.php create mode 100644 conlite/classes/class.frontend.groups.php create mode 100644 conlite/classes/class.frontend.logic.php create mode 100644 conlite/classes/class.frontend.permissions.php create mode 100644 conlite/classes/class.frontend.users.php create mode 100644 conlite/classes/class.genericdb.php create mode 100644 conlite/classes/class.group.php create mode 100644 conlite/classes/class.htmlelements.php create mode 100644 conlite/classes/class.htmlparser.php create mode 100644 conlite/classes/class.htmlvalidator.php create mode 100644 conlite/classes/class.httpinputvalidator.php create mode 100644 conlite/classes/class.input.helper.php create mode 100644 conlite/classes/class.inuse.php create mode 100644 conlite/classes/class.iterator.php create mode 100644 conlite/classes/class.lang.php create mode 100644 conlite/classes/class.layout.php create mode 100644 conlite/classes/class.metaobject.php create mode 100644 conlite/classes/class.navigation.php create mode 100644 conlite/classes/class.note.php create mode 100644 conlite/classes/class.notification.php create mode 100644 conlite/classes/class.output_compressor.php create mode 100644 conlite/classes/class.phpmailer.php create mode 100644 conlite/classes/class.properties.php create mode 100644 conlite/classes/class.purge.php create mode 100644 conlite/classes/class.request.password.php create mode 100644 conlite/classes/class.search.php create mode 100644 conlite/classes/class.security.php create mode 100644 conlite/classes/class.smtp.php create mode 100644 conlite/classes/class.structure.php create mode 100644 conlite/classes/class.table.php create mode 100644 conlite/classes/class.template.php create mode 100644 conlite/classes/class.templateconfig.php create mode 100644 conlite/classes/class.todo.php create mode 100644 conlite/classes/class.treeitem.php create mode 100644 conlite/classes/class.ui.php create mode 100644 conlite/classes/class.update.notifier.php create mode 100644 conlite/classes/class.upload.php create mode 100644 conlite/classes/class.user.php create mode 100644 conlite/classes/class.version.php create mode 100644 conlite/classes/class.versionFile.php create mode 100644 conlite/classes/class.versionImport.php create mode 100644 conlite/classes/class.versionLayout.php create mode 100644 conlite/classes/class.versionModule.php create mode 100644 conlite/classes/class.wysiwyg_editor.php create mode 100644 conlite/classes/class.xml.php create mode 100644 conlite/classes/class.xmlparser.php create mode 100644 conlite/classes/class.xmltree.php create mode 100644 conlite/classes/class.xsltprocessor.php create mode 100644 conlite/classes/con2con/class.dirhandler.php create mode 100644 conlite/classes/con2con/class.filehandler.php create mode 100644 conlite/classes/con2con/class.registry.php create mode 100644 conlite/classes/contenido/class.area.php create mode 100644 conlite/classes/contenido/class.article.php create mode 100644 conlite/classes/contenido/class.articlelanguage.php create mode 100644 conlite/classes/contenido/class.category.php create mode 100644 conlite/classes/contenido/class.categoryarticle.php create mode 100644 conlite/classes/contenido/class.categorylanguage.php create mode 100644 conlite/classes/contenido/class.categorytree.php create mode 100644 conlite/classes/contenido/class.client.php create mode 100644 conlite/classes/contenido/class.clientslang.php create mode 100644 conlite/classes/contenido/class.container.php create mode 100644 conlite/classes/contenido/class.containerconfig.php create mode 100644 conlite/classes/contenido/class.content.php create mode 100644 conlite/classes/contenido/class.file.php create mode 100644 conlite/classes/contenido/class.framefile.php create mode 100644 conlite/classes/contenido/class.language.php create mode 100644 conlite/classes/contenido/class.layout.php create mode 100644 conlite/classes/contenido/class.metatag.php create mode 100644 conlite/classes/contenido/class.metatype.php create mode 100644 conlite/classes/contenido/class.module.php create mode 100644 conlite/classes/contenido/class.template.php create mode 100644 conlite/classes/contenido/class.templateconfig.php create mode 100644 conlite/classes/contenido/class.type.php create mode 100644 conlite/classes/contenido/class.user.php create mode 100644 conlite/classes/content_types/class.content.type.abstract.php create mode 100644 conlite/classes/datatypes/class.datatype.currency.php create mode 100644 conlite/classes/datatypes/class.datatype.datetime.php create mode 100644 conlite/classes/datatypes/class.datatype.number.php create mode 100644 conlite/classes/datatypes/class.datatype.php create mode 100644 conlite/classes/drivers/class.gdb.driver.php create mode 100644 conlite/classes/drivers/drivers.txt create mode 100644 conlite/classes/drivers/mysql/class.gdb.mysql.php create mode 100644 conlite/classes/exceptions/exception.conuser.php create mode 100644 conlite/classes/frontend/navigation/class.frontend.navigation.abstract.php create mode 100644 conlite/classes/frontend/navigation/class.frontend.navigation.php create mode 100644 conlite/classes/index.php create mode 100644 conlite/classes/interfaces/interface.conuser.php create mode 100644 conlite/classes/log/class.log.php create mode 100644 conlite/classes/log/class.log.writer.file.php create mode 100644 conlite/classes/log/class.log.writer.php create mode 100644 conlite/classes/log/class.modulelog.php create mode 100644 conlite/classes/template/class.clAbstractTemplateParser.php create mode 100644 conlite/classes/template/class.clCounterFunctionParser.php create mode 100644 conlite/classes/template/class.clIfFunctionParser.php create mode 100644 conlite/classes/template/class.clStrAPIFunctionsParser.php create mode 100644 conlite/classes/template/class.template.php create mode 100644 conlite/classes/tree/class.ctree.php create mode 100644 conlite/classes/tree/class.ctreeitem.php create mode 100644 conlite/classes/widgets/class.views.advancedmenu.php create mode 100644 conlite/classes/widgets/class.widgets.actionbutton.php create mode 100644 conlite/classes/widgets/class.widgets.actionlist.php create mode 100644 conlite/classes/widgets/class.widgets.buttons.php create mode 100644 conlite/classes/widgets/class.widgets.calendar.php create mode 100644 conlite/classes/widgets/class.widgets.datawidgets.php create mode 100644 conlite/classes/widgets/class.widgets.datechooser.php create mode 100644 conlite/classes/widgets/class.widgets.datefield.php create mode 100644 conlite/classes/widgets/class.widgets.dateselect.php create mode 100644 conlite/classes/widgets/class.widgets.foldingrow.php create mode 100644 conlite/classes/widgets/class.widgets.nominaltextfield.php create mode 100644 conlite/classes/widgets/class.widgets.page.php create mode 100644 conlite/classes/widgets/class.widgets.pager.php create mode 100644 conlite/classes/widgets/class.widgets.switchabledatechooser.php create mode 100644 conlite/classes/widgets/class.widgets.tableedit.php create mode 100644 conlite/classes/widgets/class.widgets.treeview.php create mode 100644 conlite/classes/widgets/class.widgets.views.php create mode 100644 conlite/classes/xml/class.xml.base.php create mode 100644 conlite/classes/xml/class.xml.reader.php create mode 100644 conlite/classes/xml/class.xml.writer.php create mode 100644 conlite/classes/xml/class.xml2array.php create mode 100644 conlite/cronjobs/advance_workflow.php create mode 100644 conlite/cronjobs/crontab.txt create mode 100644 conlite/cronjobs/index.php create mode 100644 conlite/cronjobs/linkchecker.php create mode 100644 conlite/cronjobs/move_articles.php create mode 100644 conlite/cronjobs/move_old_stats.php create mode 100644 conlite/cronjobs/optimize_database.php create mode 100644 conlite/cronjobs/run_newsletter_job.php create mode 100644 conlite/cronjobs/send_reminder.php create mode 100644 conlite/cronjobs/session_cleanup.php create mode 100644 conlite/cronjobs/setfrontenduserstate.php create mode 100644 conlite/external/PHPMailer/LICENSE create mode 100644 conlite/external/PHPMailer/README create mode 100644 conlite/external/PHPMailer/aboutus.html create mode 100644 conlite/external/PHPMailer/changelog.txt create mode 100644 conlite/external/PHPMailer/class.phpmailer.php create mode 100644 conlite/external/PHPMailer/class.pop3.php create mode 100644 conlite/external/PHPMailer/class.smtp.php create mode 100644 conlite/external/PHPMailer/docs/Callback_function_notes.txt create mode 100644 conlite/external/PHPMailer/docs/DomainKeys_notes.txt create mode 100644 conlite/external/PHPMailer/docs/Note_for_SMTP_debugging.txt create mode 100644 conlite/external/PHPMailer/docs/extending.html create mode 100644 conlite/external/PHPMailer/docs/faq.html create mode 100644 conlite/external/PHPMailer/docs/pop3_article.txt create mode 100644 conlite/external/PHPMailer/docs/use_gmail.txt create mode 100644 conlite/external/PHPMailer/examples/contents.html create mode 100644 conlite/external/PHPMailer/examples/images/phpmailer.gif create mode 100644 conlite/external/PHPMailer/examples/images/phpmailer_mini.gif create mode 100644 conlite/external/PHPMailer/examples/index.html create mode 100644 conlite/external/PHPMailer/examples/test_db_smtp_basic.php create mode 100644 conlite/external/PHPMailer/examples/test_mail_advanced.php create mode 100644 conlite/external/PHPMailer/examples/test_mail_basic.php create mode 100644 conlite/external/PHPMailer/examples/test_pop_before_smtp_advanced.php create mode 100644 conlite/external/PHPMailer/examples/test_pop_before_smtp_basic.php create mode 100644 conlite/external/PHPMailer/examples/test_sendmail_advanced.php create mode 100644 conlite/external/PHPMailer/examples/test_sendmail_basic.php create mode 100644 conlite/external/PHPMailer/examples/test_smtp_advanced.php create mode 100644 conlite/external/PHPMailer/examples/test_smtp_advanced_no_auth.php create mode 100644 conlite/external/PHPMailer/examples/test_smtp_basic.php create mode 100644 conlite/external/PHPMailer/examples/test_smtp_basic_no_auth.php create mode 100644 conlite/external/PHPMailer/examples/test_smtp_gmail_advanced.php create mode 100644 conlite/external/PHPMailer/examples/test_smtp_gmail_basic.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-ar.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-br.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-ca.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-ch.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-cz.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-de.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-dk.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-es.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-et.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-fi.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-fo.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-fr.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-hu.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-it.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-ja.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-nl.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-no.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-pl.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-ro.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-ru.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-se.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-tr.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-zh.php create mode 100644 conlite/external/PHPMailer/language/phpmailer.lang-zh_cn.php create mode 100644 conlite/external/PHPMailer/test/contents.html create mode 100644 conlite/external/PHPMailer/test/phpmailerTest.php create mode 100644 conlite/external/PHPMailer/test/test.png create mode 100644 conlite/external/PHPMailer/test/test_callback.php create mode 100644 conlite/external/PHPMailer/test/testemail.php create mode 100644 conlite/external/backendedit/front_content.php create mode 100644 conlite/external/edit_area/autocompletion.js create mode 100644 conlite/external/edit_area/class.edit_area.php create mode 100644 conlite/external/edit_area/edit_area.css create mode 100644 conlite/external/edit_area/edit_area.js create mode 100644 conlite/external/edit_area/edit_area_compressor.php create mode 100644 conlite/external/edit_area/edit_area_compressor_cl.php create mode 100644 conlite/external/edit_area/edit_area_full.gz create mode 100644 conlite/external/edit_area/edit_area_full.js create mode 100644 conlite/external/edit_area/edit_area_functions.js create mode 100644 conlite/external/edit_area/edit_area_loader.js create mode 100644 conlite/external/edit_area/elements_functions.js create mode 100644 conlite/external/edit_area/highlight.js create mode 100644 conlite/external/edit_area/images/autocompletion.gif create mode 100644 conlite/external/edit_area/images/close.gif create mode 100644 conlite/external/edit_area/images/fullscreen.gif create mode 100644 conlite/external/edit_area/images/go_to_line.gif create mode 100644 conlite/external/edit_area/images/help.gif create mode 100644 conlite/external/edit_area/images/highlight.gif create mode 100644 conlite/external/edit_area/images/load.gif create mode 100644 conlite/external/edit_area/images/move.gif create mode 100644 conlite/external/edit_area/images/newdocument.gif create mode 100644 conlite/external/edit_area/images/opacity.png create mode 100644 conlite/external/edit_area/images/processing.gif create mode 100644 conlite/external/edit_area/images/redo.gif create mode 100644 conlite/external/edit_area/images/reset_highlight.gif create mode 100644 conlite/external/edit_area/images/save.gif create mode 100644 conlite/external/edit_area/images/search.gif create mode 100644 conlite/external/edit_area/images/smooth_selection.gif create mode 100644 conlite/external/edit_area/images/spacer.gif create mode 100644 conlite/external/edit_area/images/statusbar_resize.gif create mode 100644 conlite/external/edit_area/images/undo.gif create mode 100644 conlite/external/edit_area/images/word_wrap.gif create mode 100644 conlite/external/edit_area/keyboard.js create mode 100644 conlite/external/edit_area/langs/bg.js create mode 100644 conlite/external/edit_area/langs/cs.js create mode 100644 conlite/external/edit_area/langs/de.js create mode 100644 conlite/external/edit_area/langs/dk.js create mode 100644 conlite/external/edit_area/langs/en.js create mode 100644 conlite/external/edit_area/langs/eo.js create mode 100644 conlite/external/edit_area/langs/es.js create mode 100644 conlite/external/edit_area/langs/fi.js create mode 100644 conlite/external/edit_area/langs/fr.js create mode 100644 conlite/external/edit_area/langs/hr.js create mode 100644 conlite/external/edit_area/langs/it.js create mode 100644 conlite/external/edit_area/langs/ja.js create mode 100644 conlite/external/edit_area/langs/mk.js create mode 100644 conlite/external/edit_area/langs/nl.js create mode 100644 conlite/external/edit_area/langs/pl.js create mode 100644 conlite/external/edit_area/langs/pt.js create mode 100644 conlite/external/edit_area/langs/ru.js create mode 100644 conlite/external/edit_area/langs/sk.js create mode 100644 conlite/external/edit_area/langs/zh.js create mode 100644 conlite/external/edit_area/license_apache.txt create mode 100644 conlite/external/edit_area/license_bsd.txt create mode 100644 conlite/external/edit_area/license_lgpl.txt create mode 100644 conlite/external/edit_area/manage_area.js create mode 100644 conlite/external/edit_area/plugins/charmap/charmap.js create mode 100644 conlite/external/edit_area/plugins/charmap/css/charmap.css create mode 100644 conlite/external/edit_area/plugins/charmap/images/charmap.gif create mode 100644 conlite/external/edit_area/plugins/charmap/jscripts/map.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/bg.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/cs.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/de.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/dk.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/en.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/eo.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/es.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/fr.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/hr.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/it.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/ja.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/mk.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/nl.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/pl.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/pt.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/ru.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/sk.js create mode 100644 conlite/external/edit_area/plugins/charmap/langs/zh.js create mode 100644 conlite/external/edit_area/plugins/charmap/popup.html create mode 100644 conlite/external/edit_area/plugins/test/css/test.css create mode 100644 conlite/external/edit_area/plugins/test/images/test.gif create mode 100644 conlite/external/edit_area/plugins/test/langs/bg.js create mode 100644 conlite/external/edit_area/plugins/test/langs/cs.js create mode 100644 conlite/external/edit_area/plugins/test/langs/de.js create mode 100644 conlite/external/edit_area/plugins/test/langs/dk.js create mode 100644 conlite/external/edit_area/plugins/test/langs/en.js create mode 100644 conlite/external/edit_area/plugins/test/langs/eo.js create mode 100644 conlite/external/edit_area/plugins/test/langs/es.js create mode 100644 conlite/external/edit_area/plugins/test/langs/fr.js create mode 100644 conlite/external/edit_area/plugins/test/langs/hr.js create mode 100644 conlite/external/edit_area/plugins/test/langs/it.js create mode 100644 conlite/external/edit_area/plugins/test/langs/ja.js create mode 100644 conlite/external/edit_area/plugins/test/langs/mk.js create mode 100644 conlite/external/edit_area/plugins/test/langs/nl.js create mode 100644 conlite/external/edit_area/plugins/test/langs/pl.js create mode 100644 conlite/external/edit_area/plugins/test/langs/pt.js create mode 100644 conlite/external/edit_area/plugins/test/langs/ru.js create mode 100644 conlite/external/edit_area/plugins/test/langs/sk.js create mode 100644 conlite/external/edit_area/plugins/test/langs/zh.js create mode 100644 conlite/external/edit_area/plugins/test/test.js create mode 100644 conlite/external/edit_area/plugins/test/test2.js create mode 100644 conlite/external/edit_area/reg_syntax.js create mode 100644 conlite/external/edit_area/reg_syntax/basic.js create mode 100644 conlite/external/edit_area/reg_syntax/brainfuck.js create mode 100644 conlite/external/edit_area/reg_syntax/c.js create mode 100644 conlite/external/edit_area/reg_syntax/coldfusion.js create mode 100644 conlite/external/edit_area/reg_syntax/cpp.js create mode 100644 conlite/external/edit_area/reg_syntax/css.js create mode 100644 conlite/external/edit_area/reg_syntax/html.js create mode 100644 conlite/external/edit_area/reg_syntax/java.js create mode 100644 conlite/external/edit_area/reg_syntax/js.js create mode 100644 conlite/external/edit_area/reg_syntax/pas.js create mode 100644 conlite/external/edit_area/reg_syntax/perl.js create mode 100644 conlite/external/edit_area/reg_syntax/php.js create mode 100644 conlite/external/edit_area/reg_syntax/python.js create mode 100644 conlite/external/edit_area/reg_syntax/robotstxt.js create mode 100644 conlite/external/edit_area/reg_syntax/ruby.js create mode 100644 conlite/external/edit_area/reg_syntax/sql.js create mode 100644 conlite/external/edit_area/reg_syntax/tsql.js create mode 100644 conlite/external/edit_area/reg_syntax/vb.js create mode 100644 conlite/external/edit_area/reg_syntax/xml.js create mode 100644 conlite/external/edit_area/regexp.js create mode 100644 conlite/external/edit_area/resize_area.js create mode 100644 conlite/external/edit_area/search_replace.js create mode 100644 conlite/external/edit_area/template.html create mode 100644 conlite/external/frontend/cache/index.php create mode 100644 conlite/external/frontend/config.php create mode 100644 conlite/external/frontend/css/index.php create mode 100644 conlite/external/frontend/css/style_tiny.css create mode 100644 conlite/external/frontend/dbfs.php create mode 100644 conlite/external/frontend/error.php create mode 100644 conlite/external/frontend/front_content.php create mode 100644 conlite/external/frontend/front_crcloginform.inc.php create mode 100644 conlite/external/frontend/images/but_ok.gif create mode 100644 conlite/external/frontend/images/index.php create mode 100644 conlite/external/frontend/includes/class.concache.php create mode 100644 conlite/external/frontend/includes/class.input.helper.php create mode 100644 conlite/external/frontend/includes/concache.php create mode 100644 conlite/external/frontend/includes/index.php create mode 100644 conlite/external/frontend/index.php create mode 100644 conlite/external/frontend/js/index.php create mode 100644 conlite/external/frontend/logs/index.php create mode 100644 conlite/external/frontend/robots.txt create mode 100644 conlite/external/frontend/templates/index.php create mode 100644 conlite/external/frontend/upload/test.txt create mode 100644 conlite/external/index.php create mode 100644 conlite/external/phpqrcode/CHANGELOG create mode 100644 conlite/external/phpqrcode/INSTALL create mode 100644 conlite/external/phpqrcode/LICENSE create mode 100644 conlite/external/phpqrcode/README create mode 100644 conlite/external/phpqrcode/VERSION create mode 100644 conlite/external/phpqrcode/bindings/tcpdf/qrcode.php create mode 100644 conlite/external/phpqrcode/index.php create mode 100644 conlite/external/phpqrcode/phpqrcode.php create mode 100644 conlite/external/phpqrcode/qrbitstream.php create mode 100644 conlite/external/phpqrcode/qrconfig.php create mode 100644 conlite/external/phpqrcode/qrconst.php create mode 100644 conlite/external/phpqrcode/qrencode.php create mode 100644 conlite/external/phpqrcode/qrimage.php create mode 100644 conlite/external/phpqrcode/qrinput.php create mode 100644 conlite/external/phpqrcode/qrlib.php create mode 100644 conlite/external/phpqrcode/qrmask.php create mode 100644 conlite/external/phpqrcode/qrrscode.php create mode 100644 conlite/external/phpqrcode/qrspec.php create mode 100644 conlite/external/phpqrcode/qrsplit.php create mode 100644 conlite/external/phpqrcode/qrtools.php create mode 100644 conlite/external/phpqrcode/tools/merge.bat create mode 100644 conlite/external/phpqrcode/tools/merge.php create mode 100755 conlite/external/phpqrcode/tools/merge.sh create mode 100644 conlite/external/phpqrcode/tools/merged_config.php create mode 100644 conlite/external/phpqrcode/tools/merged_header.php create mode 100644 conlite/external/wysiwyg/index.php create mode 100644 conlite/external/wysiwyg/tinymce3/TINYMCE_INTEGRATION_HOWTO.txt create mode 100644 conlite/external/wysiwyg/tinymce3/changelog.txt create mode 100644 conlite/external/wysiwyg/tinymce3/compressor_changelog.txt create mode 100644 conlite/external/wysiwyg/tinymce3/config.php create mode 100644 conlite/external/wysiwyg/tinymce3/editor.php create mode 100644 conlite/external/wysiwyg/tinymce3/editorclass.php create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/langs/de.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/langs/en.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/license.txt create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/css/advhr.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/js/rule.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advhr/rule.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/css/advimage.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/image.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/img/sample.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/js/image.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/css/advlink.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/js/advlink.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlink/link.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlist/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/autolink/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/autosave/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/directionality/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/emotions.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/js/emotions.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/dialog.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/img/example.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/js/dialog.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/langs/en.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/fullpage.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/iespell/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/inlinepopups/template.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/layer/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/lists/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/css/media.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/js/embed.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/js/media.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/media.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/media/moxieplayer.swf create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/js/pastetext.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/js/pasteword.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pastetext.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pasteword.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/example.html create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/jscripts/embed.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/preview.html create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/css/content.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/css/props.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/js/props.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/props.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/readme.txt create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/cell.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/cell.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/row.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/table.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/cell.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/merge_cells.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/row.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/table.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/merge_cells.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/row.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/table.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/blank.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/css/template.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/js/template.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/template.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/about.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/anchor.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/charmap.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/color_picker.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/image.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/flash.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/icons.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/iframe.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/quicktime.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/realmedia.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/shockwave.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/trans.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/video.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/about.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/anchor.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/charmap.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/color_picker.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/image.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/link.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/source_editor.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/link.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/shortcuts.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/content.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/ui.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/source_editor.htm create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/img/icons.gif create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/de.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/en.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/content.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/ui.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce_popup.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce_src.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/utils/editable_selects.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/utils/form_utils.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/utils/mctabs.js create mode 100644 conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/utils/validate.js create mode 100644 conlite/external/wysiwyg/tinymce3/list.php create mode 100644 conlite/external/wysiwyg/tinymce3/readme create mode 100644 conlite/external/wysiwyg/tinymce3/readme.txt create mode 100644 conlite/external/wysiwyg/tinymce3/tiny_mce_gzip.js create mode 100644 conlite/external/wysiwyg/tinymce3/tiny_mce_gzip.php create mode 100644 conlite/external/wysiwyg/tinymce3/tinymce.tpl.html create mode 100644 conlite/favicon.ico create mode 100644 conlite/frameset.php create mode 100644 conlite/frameset_left.php create mode 100644 conlite/frameset_right.php create mode 100644 conlite/header.php create mode 100644 conlite/images/actions/clear_right.gif create mode 100644 conlite/images/arrow.gif create mode 100644 conlite/images/arrow_tipballoon.gif create mode 100644 conlite/images/article.gif create mode 100644 conlite/images/article_locked.gif create mode 100644 conlite/images/article_unlocked.gif create mode 100644 conlite/images/artikel_spez_akt.gif create mode 100644 conlite/images/artikel_spez_inakt.gif create mode 100644 conlite/images/avail_clients.gif create mode 100644 conlite/images/back.gif create mode 100644 conlite/images/background.jpg create mode 100644 conlite/images/bg_dark.gif create mode 100644 conlite/images/bg_high.gif create mode 100644 conlite/images/bg_light.gif create mode 100644 conlite/images/bg_sub.gif create mode 100644 conlite/images/bg_trans.gif create mode 100644 conlite/images/but_art_conf2.gif create mode 100644 conlite/images/but_art_new.gif create mode 100644 conlite/images/but_back.gif create mode 100644 conlite/images/but_cancel.gif create mode 100644 conlite/images/but_cancel_off.gif create mode 100644 conlite/images/but_cat_conf.gif create mode 100644 conlite/images/but_cat_conf2.gif create mode 100644 conlite/images/but_copy.gif create mode 100644 conlite/images/but_delete.gif create mode 100644 conlite/images/but_downloadlist.gif create mode 100644 conlite/images/but_edit.gif create mode 100644 conlite/images/but_edithead.gif create mode 100644 conlite/images/but_edithtml.gif create mode 100644 conlite/images/but_editimage.gif create mode 100644 conlite/images/but_editlink.gif create mode 100644 conlite/images/but_editpdf.gif create mode 100644 conlite/images/but_editswf.gif create mode 100644 conlite/images/but_edittext.gif create mode 100644 conlite/images/but_editzip.gif create mode 100644 conlite/images/but_help.gif create mode 100644 conlite/images/but_invert_selection.gif create mode 100644 conlite/images/but_lastnode.gif create mode 100644 conlite/images/but_logout.gif create mode 100644 conlite/images/but_minus.gif create mode 100644 conlite/images/but_move_subtree.gif create mode 100644 conlite/images/but_move_subtree_main.gif create mode 100644 conlite/images/but_move_subtree_target.gif create mode 100644 conlite/images/but_news.gif create mode 100644 conlite/images/but_ok.gif create mode 100644 conlite/images/but_ok_off.gif create mode 100644 conlite/images/but_online.gif create mode 100644 conlite/images/but_online_no.gif create mode 100644 conlite/images/but_plus.gif create mode 100644 conlite/images/but_preview.gif create mode 100644 conlite/images/but_properties.gif create mode 100644 conlite/images/but_refresh.gif create mode 100644 conlite/images/but_rename.gif create mode 100644 conlite/images/but_rss.gif create mode 100644 conlite/images/but_setreminder.gif create mode 100644 conlite/images/but_speichern.gif create mode 100644 conlite/images/but_sync_art.gif create mode 100644 conlite/images/but_sync_art_off.gif create mode 100644 conlite/images/but_sync_cat.gif create mode 100644 conlite/images/but_sync_cat_off.gif create mode 100644 conlite/images/but_time_1.gif create mode 100644 conlite/images/but_time_2.gif create mode 100644 conlite/images/but_todo.gif create mode 100644 conlite/images/but_todo_off.gif create mode 100644 conlite/images/but_warn.gif create mode 100644 conlite/images/calendar.gif create mode 100644 conlite/images/cl-logo.gif create mode 100644 conlite/images/close_all.gif create mode 100644 conlite/images/collapsed.gif create mode 100644 conlite/images/configure.gif create mode 100644 conlite/images/conlogo.gif create mode 100644 conlite/images/contact.gif create mode 100644 conlite/images/dash.gif create mode 100644 conlite/images/db_backup_start.png create mode 100644 conlite/images/db_backup_start_off.png create mode 100644 conlite/images/delete.gif create mode 100644 conlite/images/delete_inact.gif create mode 100644 conlite/images/delete_inact_g.gif create mode 100644 conlite/images/delete_inact_h.gif create mode 100644 conlite/images/delete_over.gif create mode 100644 conlite/images/editieren.gif create mode 100644 conlite/images/exclamation.gif create mode 100644 conlite/images/filetypes/css.gif create mode 100644 conlite/images/filetypes/design.gif create mode 100644 conlite/images/filetypes/excel.gif create mode 100644 conlite/images/filetypes/gif.gif create mode 100644 conlite/images/filetypes/html.gif create mode 100644 conlite/images/filetypes/javascript.gif create mode 100644 conlite/images/filetypes/jpg.gif create mode 100644 conlite/images/filetypes/js.gif create mode 100644 conlite/images/filetypes/movie.gif create mode 100644 conlite/images/filetypes/odf.gif create mode 100644 conlite/images/filetypes/pdf.gif create mode 100644 conlite/images/filetypes/php.gif create mode 100644 conlite/images/filetypes/png.gif create mode 100644 conlite/images/filetypes/ppt.gif create mode 100644 conlite/images/filetypes/sound.gif create mode 100644 conlite/images/filetypes/swf.gif create mode 100644 conlite/images/filetypes/txt.gif create mode 100644 conlite/images/filetypes/unknown.gif create mode 100644 conlite/images/filetypes/vcf.gif create mode 100644 conlite/images/filetypes/word.gif create mode 100644 conlite/images/filetypes/zip.gif create mode 100644 conlite/images/filler_bg.gif create mode 100644 conlite/images/folder.gif create mode 100644 conlite/images/folder_delock.gif create mode 100644 conlite/images/folder_delocked.gif create mode 100644 conlite/images/folder_duplicate.gif create mode 100644 conlite/images/folder_duplicate_off.gif create mode 100644 conlite/images/folder_lock.gif create mode 100644 conlite/images/folder_locked.gif create mode 100644 conlite/images/folder_move.gif create mode 100644 conlite/images/folder_movedown.gif create mode 100644 conlite/images/folder_movedown_inact.gif create mode 100644 conlite/images/folder_moveup.gif create mode 100644 conlite/images/folder_moveup_inact.gif create mode 100644 conlite/images/folder_new.gif create mode 100644 conlite/images/folder_off.gif create mode 100644 conlite/images/folder_off_error.gif create mode 100644 conlite/images/folder_off_error_locked.gif create mode 100644 conlite/images/folder_off_locked.gif create mode 100644 conlite/images/folder_on.gif create mode 100644 conlite/images/folder_on_error.gif create mode 100644 conlite/images/folder_on_error_locked.gif create mode 100644 conlite/images/folder_on_locked.gif create mode 100644 conlite/images/frame_handle_li.gif create mode 100644 conlite/images/frame_handle_re.gif create mode 100644 conlite/images/grid_collapse.gif create mode 100644 conlite/images/grid_expand.gif create mode 100644 conlite/images/grid_folder.gif create mode 100644 conlite/images/grid_linedown.gif create mode 100644 conlite/images/grid_linedownright.gif create mode 100644 conlite/images/grid_linedownrightend.gif create mode 100644 conlite/images/groups.gif create mode 100644 conlite/images/groups_o.gif create mode 100644 conlite/images/icon_fatalerror.gif create mode 100644 conlite/images/icon_warning.gif create mode 100644 conlite/images/importieren.gif create mode 100644 conlite/images/index.php create mode 100644 conlite/images/info.gif create mode 100644 conlite/images/isstart0.gif create mode 100644 conlite/images/isstart0m.gif create mode 100644 conlite/images/isstart0mr.gif create mode 100644 conlite/images/isstart0r.gif create mode 100644 conlite/images/isstart1.gif create mode 100644 conlite/images/isstart1m.gif create mode 100644 conlite/images/isstart1mr.gif create mode 100644 conlite/images/isstart1r.gif create mode 100644 conlite/images/lock_closed.gif create mode 100644 conlite/images/lock_open.gif create mode 100644 conlite/images/my_contenido.gif create mode 100644 conlite/images/newsletter.gif create mode 100644 conlite/images/newsletter_16.gif create mode 100644 conlite/images/newsletter_dispatch_16.gif create mode 100644 conlite/images/newsletter_dispatch_16_off.gif create mode 100644 conlite/images/newsletter_dispatch_off.gif create mode 100644 conlite/images/newsletter_dispatch_on.gif create mode 100644 conlite/images/newsletter_off.gif create mode 100644 conlite/images/newsletter_on.gif create mode 100644 conlite/images/newsletter_recipientgroups_off.gif create mode 100644 conlite/images/newsletter_recipientgroups_on.gif create mode 100644 conlite/images/newsletter_recipients_off.gif create mode 100644 conlite/images/newsletter_recipients_on.gif create mode 100644 conlite/images/newsletter_sendtest_16.gif create mode 100644 conlite/images/newsletter_sendtest_16_off.gif create mode 100644 conlite/images/offline.gif create mode 100644 conlite/images/offline_off.gif create mode 100644 conlite/images/online.gif create mode 100644 conlite/images/online_off.gif create mode 100644 conlite/images/open_all.gif create mode 100644 conlite/images/ordner_oben.gif create mode 100644 conlite/images/paging/first.gif create mode 100644 conlite/images/paging/last.gif create mode 100644 conlite/images/paging/next.gif create mode 100644 conlite/images/paging/previous.gif create mode 100644 conlite/images/pfeil_links.gif create mode 100644 conlite/images/pfeil_runter.gif create mode 100644 conlite/images/print.gif create mode 100644 conlite/images/reminder/prio_high.gif create mode 100644 conlite/images/reminder/prio_low.gif create mode 100644 conlite/images/reminder/prio_medium.gif create mode 100644 conlite/images/reminder/prio_veryhigh.gif create mode 100644 conlite/images/reminder/progress.gif create mode 100644 conlite/images/reminder/status_deferred.gif create mode 100644 conlite/images/reminder/status_done.gif create mode 100644 conlite/images/reminder/status_inprogress.gif create mode 100644 conlite/images/reminder/status_new.gif create mode 100644 conlite/images/reminder/status_waiting.gif create mode 100644 conlite/images/save.gif create mode 100644 conlite/images/social/facebook.gif create mode 100644 conlite/images/sort_down.gif create mode 100644 conlite/images/sort_up.gif create mode 100644 conlite/images/space.gif create mode 100644 conlite/images/spacer.gif create mode 100644 conlite/images/submit.gif create mode 100644 conlite/images/submit_hover.gif create mode 100644 conlite/images/sync.png create mode 100644 conlite/images/template_properties.gif create mode 100644 conlite/images/template_properties_off.gif create mode 100644 conlite/images/toggle_frame_left.gif create mode 100644 conlite/images/toggle_frame_right.gif create mode 100644 conlite/images/top.gif create mode 100644 conlite/images/user_online.gif create mode 100644 conlite/images/users.gif create mode 100644 conlite/images/users_o.gif create mode 100644 conlite/images/vert-neu.gif create mode 100644 conlite/images/vert.gif create mode 100644 conlite/images/widgets/foldingrow/collapsed.gif create mode 100644 conlite/images/widgets/foldingrow/expanded.gif create mode 100644 conlite/images/workflow_step_delete.gif create mode 100644 conlite/includes/ajax/include.ajax.con.php create mode 100644 conlite/includes/api/functions.api.general.php create mode 100644 conlite/includes/api/functions.frontend.list.php create mode 100644 conlite/includes/cfg_language_de.inc.php create mode 100644 conlite/includes/functions.api.category.php create mode 100644 conlite/includes/functions.api.images.php create mode 100644 conlite/includes/functions.api.php create mode 100644 conlite/includes/functions.api.string.php create mode 100644 conlite/includes/functions.con.php create mode 100644 conlite/includes/functions.con2.php create mode 100644 conlite/includes/functions.database.php create mode 100644 conlite/includes/functions.domxml-php4-to-php5.php create mode 100644 conlite/includes/functions.encoding.php create mode 100644 conlite/includes/functions.file.php create mode 100644 conlite/includes/functions.forms.php create mode 100644 conlite/includes/functions.general.php create mode 100644 conlite/includes/functions.i18n.php create mode 100644 conlite/includes/functions.includePluginConf.php create mode 100644 conlite/includes/functions.lang.php create mode 100644 conlite/includes/functions.lay.php create mode 100644 conlite/includes/functions.mod.php create mode 100644 conlite/includes/functions.pathresolver.php create mode 100644 conlite/includes/functions.php54.php create mode 100644 conlite/includes/functions.rights.php create mode 100644 conlite/includes/functions.stat.php create mode 100644 conlite/includes/functions.str.php create mode 100644 conlite/includes/functions.system.php create mode 100644 conlite/includes/functions.tpl.php create mode 100644 conlite/includes/functions.upl.php create mode 100644 conlite/includes/globals_off.inc.php create mode 100644 conlite/includes/grouprights.inc.php create mode 100644 conlite/includes/grouprights_area.inc.php create mode 100644 conlite/includes/grouprights_con.inc.php create mode 100644 conlite/includes/grouprights_lay.inc.php create mode 100644 conlite/includes/grouprights_members.inc.php create mode 100644 conlite/includes/grouprights_mod.inc.php create mode 100644 conlite/includes/grouprights_str.inc.php create mode 100644 conlite/includes/grouprights_tpl.inc.php create mode 100644 conlite/includes/include.CMS_EASYIMG.php create mode 100644 conlite/includes/include.CMS_HEAD.php create mode 100644 conlite/includes/include.CMS_HTML.php create mode 100644 conlite/includes/include.CMS_HTMLHEAD.php create mode 100644 conlite/includes/include.CMS_HTMLTEXT.php create mode 100644 conlite/includes/include.CMS_IMG.php create mode 100644 conlite/includes/include.CMS_LINK.php create mode 100644 conlite/includes/include.CMS_QRCODE.php create mode 100644 conlite/includes/include.CMS_SIMPLELINK.php create mode 100644 conlite/includes/include.CMS_SWF.php create mode 100644 conlite/includes/include.CMS_TEXT.php create mode 100644 conlite/includes/include.backendedit.php create mode 100644 conlite/includes/include.blank.php create mode 100644 conlite/includes/include.client_artspec.php create mode 100644 conlite/includes/include.client_edit.php create mode 100644 conlite/includes/include.client_left_top.php create mode 100644 conlite/includes/include.client_menu.php create mode 100644 conlite/includes/include.clientsettings.php create mode 100644 conlite/includes/include.con_art_overview.php create mode 100644 conlite/includes/include.con_edit_form.php create mode 100644 conlite/includes/include.con_editcontent.php create mode 100644 conlite/includes/include.con_left_top.php create mode 100644 conlite/includes/include.con_str_overview.php create mode 100644 conlite/includes/include.con_subnav.php create mode 100644 conlite/includes/include.debug.php create mode 100644 conlite/includes/include.default_subnav.php create mode 100644 conlite/includes/include.files_subnav.php create mode 100644 conlite/includes/include.frontend.group.subnav.php create mode 100644 conlite/includes/include.frontend.group_edit.php create mode 100644 conlite/includes/include.frontend.group_menu.php create mode 100644 conlite/includes/include.frontend.group_rights.php create mode 100644 conlite/includes/include.frontend.left_top.php create mode 100644 conlite/includes/include.frontend.user_edit.php create mode 100644 conlite/includes/include.frontend.user_menu.php create mode 100644 conlite/includes/include.grouprights_create.php create mode 100644 conlite/includes/include.grouprights_details.php create mode 100644 conlite/includes/include.grouprights_external.php create mode 100644 conlite/includes/include.grouprights_left_top.php create mode 100644 conlite/includes/include.grouprights_menu.php create mode 100644 conlite/includes/include.grouprights_overview.php create mode 100644 conlite/includes/include.grouprights_subnav.php create mode 100644 conlite/includes/include.html_tpl_edit_form.php create mode 100644 conlite/includes/include.html_tpl_files_overview.php create mode 100644 conlite/includes/include.html_tpl_history.php create mode 100644 conlite/includes/include.html_tpl_left_top.php create mode 100644 conlite/includes/include.info.php create mode 100644 conlite/includes/include.js_edit_form.php create mode 100644 conlite/includes/include.js_files_overview.php create mode 100644 conlite/includes/include.js_history.php create mode 100644 conlite/includes/include.js_left_top.php create mode 100644 conlite/includes/include.lang_edit.php create mode 100644 conlite/includes/include.lang_left_top.php create mode 100644 conlite/includes/include.lang_overview.php create mode 100644 conlite/includes/include.lay_edit_form.php create mode 100644 conlite/includes/include.lay_history.php create mode 100644 conlite/includes/include.lay_new.php create mode 100644 conlite/includes/include.lay_overview.php create mode 100644 conlite/includes/include.lay_preview.php create mode 100644 conlite/includes/include.left_top_blank.php create mode 100644 conlite/includes/include.logs.php create mode 100644 conlite/includes/include.mod_edit_form.php create mode 100644 conlite/includes/include.mod_history.php create mode 100644 conlite/includes/include.mod_new.php create mode 100644 conlite/includes/include.mod_overview.php create mode 100644 conlite/includes/include.mod_package.php create mode 100644 conlite/includes/include.mod_sync.php create mode 100644 conlite/includes/include.mod_translate.php create mode 100644 conlite/includes/include.mod_translate_stringlist.php create mode 100644 conlite/includes/include.mycontenido.tasks.edit.php create mode 100644 conlite/includes/include.mycontenido.tasks.php create mode 100644 conlite/includes/include.mycontenido_lastarticles.php create mode 100644 conlite/includes/include.mycontenido_settings.php create mode 100644 conlite/includes/include.note.display.php create mode 100644 conlite/includes/include.note.popup.php create mode 100644 conlite/includes/include.pretplcfg_edit.php create mode 100644 conlite/includes/include.pretplcfg_edit_form.php create mode 100644 conlite/includes/include.rights_create.php create mode 100644 conlite/includes/include.rights_external.php create mode 100644 conlite/includes/include.rights_left_top.php create mode 100644 conlite/includes/include.rights_menu.php create mode 100644 conlite/includes/include.rights_overview.php create mode 100644 conlite/includes/include.stat_left_top.php create mode 100644 conlite/includes/include.stat_menu.php create mode 100644 conlite/includes/include.stat_overview.php create mode 100644 conlite/includes/include.str_overview.php create mode 100644 conlite/includes/include.str_subnav.php create mode 100644 conlite/includes/include.style_edit_form.php create mode 100644 conlite/includes/include.style_files_overview.php create mode 100644 conlite/includes/include.style_history.php create mode 100644 conlite/includes/include.style_left_top.php create mode 100644 conlite/includes/include.subnav.php create mode 100644 conlite/includes/include.symbolhelp.php create mode 100644 conlite/includes/include.system_configuration.php create mode 100644 conlite/includes/include.system_db_backup.php create mode 100644 conlite/includes/include.system_purge.php create mode 100644 conlite/includes/include.system_sysvalues.php create mode 100644 conlite/includes/include.systemsettings.php create mode 100644 conlite/includes/include.todo.popup.php create mode 100644 conlite/includes/include.tpl_edit_form.php create mode 100644 conlite/includes/include.tpl_new.php create mode 100644 conlite/includes/include.tpl_overview.php create mode 100644 conlite/includes/include.tpl_visualedit.php create mode 100644 conlite/includes/include.tplcfg_edit.php create mode 100644 conlite/includes/include.tplcfg_edit_form.php create mode 100644 conlite/includes/include.upl_artlist.php create mode 100644 conlite/includes/include.upl_dirs_overview.php create mode 100644 conlite/includes/include.upl_edit.php create mode 100644 conlite/includes/include.upl_files_overview.php create mode 100644 conlite/includes/include.upl_files_upload.php create mode 100644 conlite/includes/include.upl_left_top.php create mode 100644 conlite/includes/include.upl_search_results.php create mode 100644 conlite/includes/include.upl_subnav.php create mode 100644 conlite/includes/index.php create mode 100644 conlite/includes/main.login.php create mode 100755 conlite/includes/old.config.misc.php create mode 100644 conlite/includes/pseudo-cron.inc.php create mode 100644 conlite/includes/rights.inc.php create mode 100644 conlite/includes/rights_area.inc.php create mode 100644 conlite/includes/rights_con.inc.php create mode 100644 conlite/includes/rights_lay.inc.php create mode 100644 conlite/includes/rights_mod.inc.php create mode 100644 conlite/includes/rights_str.inc.php create mode 100644 conlite/includes/rights_tpl.inc.php create mode 100644 conlite/includes/startup.php create mode 100644 conlite/index.php create mode 100644 conlite/locale/conlite.pot create mode 100644 conlite/locale/de_DE/LC_MESSAGES/conlite.mo create mode 100644 conlite/locale/de_DE/LC_MESSAGES/conlite.po create mode 100644 conlite/locale/en_US/LC_MESSAGES/conlite.mo create mode 100644 conlite/locale/en_US/LC_MESSAGES/conlite.po create mode 100644 conlite/locale/potfiles.txt create mode 100644 conlite/logout.php create mode 100644 conlite/logs/deprecated.txt create mode 100644 conlite/logs/index.php create mode 100644 conlite/main.loginform.php create mode 100644 conlite/main.php create mode 100644 conlite/plugins/chains/createmetatags/classes/class.metatag.creator.html5.php create mode 100644 conlite/plugins/chains/createmetatags/conf/MetaExtension.php create mode 100644 conlite/plugins/chains/createmetatags/include.chain.content.createmetatags.php create mode 100644 conlite/plugins/chains/createmetatags/includes/keyword_density.php create mode 100644 conlite/plugins/chains/createmetatags/includes/keyword_density_php52.php create mode 100644 conlite/plugins/chains/includes/class.ceccreatefacebookmeta.php create mode 100644 conlite/plugins/chains/includes/config.plugin.php create mode 100644 conlite/plugins/chains/includes/include.chain.content.set_clear_cache.php create mode 100644 conlite/plugins/chains/includes/include.chain.frontend.cat_access.php create mode 100644 conlite/plugins/chains/includes/include.chain.frontend.cat_backendaccess.php create mode 100644 conlite/plugins/chains/includes/include.chain.frontend.createbasehref.php create mode 100644 conlite/plugins/chains/includes/include.chain.frontend.output_compressor.php create mode 100755 conlite/plugins/chains/includes/old.config.plugin.php create mode 100644 conlite/plugins/content_allocation/classes/class.content_allocation.php create mode 100644 conlite/plugins/content_allocation/classes/class.content_allocation_article.php create mode 100644 conlite/plugins/content_allocation/classes/class.content_allocation_complexlist.php create mode 100644 conlite/plugins/content_allocation/classes/class.content_allocation_selectbox.php create mode 100644 conlite/plugins/content_allocation/classes/class.content_allocation_tree.php create mode 100644 conlite/plugins/content_allocation/classes/class.content_allocation_treeview.php create mode 100644 conlite/plugins/content_allocation/images/arrow.gif create mode 100644 conlite/plugins/content_allocation/images/call_contentallocation.gif create mode 100644 conlite/plugins/content_allocation/images/normal.gif create mode 100644 conlite/plugins/content_allocation/includes/config.autoloader.php create mode 100644 conlite/plugins/content_allocation/includes/config.plugin.php create mode 100644 conlite/plugins/content_allocation/includes/functions.chains.php create mode 100644 conlite/plugins/content_allocation/includes/include.contentallocation_article.php create mode 100644 conlite/plugins/content_allocation/includes/include.left_bottom.php create mode 100644 conlite/plugins/content_allocation/includes/include.left_top.php create mode 100644 conlite/plugins/content_allocation/includes/include.right_bottom.php create mode 100644 conlite/plugins/content_allocation/locale/content_allocation.pot create mode 100644 conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.mo create mode 100644 conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.po create mode 100644 conlite/plugins/content_allocation/locale/potfiles.txt create mode 100644 conlite/plugins/content_allocation/scripts/complexlist.js create mode 100644 conlite/plugins/content_allocation/style/complexlist.css create mode 100644 conlite/plugins/content_allocation/templates/template.tree_article.html create mode 100644 conlite/plugins/content_allocation/templates/template.tree_complexlist.html create mode 100644 conlite/plugins/content_allocation/templates/template.tree_structure.html create mode 100644 conlite/plugins/content_allocation/xml/content_allocation.xml create mode 100644 conlite/plugins/content_allocation/xml/lang_de_DE.xml create mode 100644 conlite/plugins/content_allocation/xml/lang_en_EN.xml create mode 100644 conlite/plugins/content_allocation/xml/lang_en_US.xml create mode 100644 conlite/plugins/frontendlogic/category/category.php create mode 100644 conlite/plugins/frontendlogic/category/docs/conlogo.gif create mode 100644 conlite/plugins/frontendlogic/category/docs/frontend.protectedcategories.html create mode 100644 conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.mo create mode 100644 conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.po create mode 100644 conlite/plugins/frontendlogic/includes/config.plugin.php create mode 100644 conlite/plugins/frontendusers/includes/config.plugin.php create mode 100644 conlite/plugins/frontendusers/valid_from/valid_from.php create mode 100644 conlite/plugins/frontendusers/valid_to/valid_to.php create mode 100644 conlite/plugins/index.php create mode 100644 conlite/plugins/linkchecker/includes/config.plugin.php create mode 100644 conlite/plugins/linkchecker/includes/include.checkperms.php create mode 100644 conlite/plugins/linkchecker/includes/include.linkchecker.php create mode 100644 conlite/plugins/linkchecker/includes/include.linkchecker_tests.php create mode 100644 conlite/plugins/linkchecker/includes/include.linkchecker_whitelist.php create mode 100644 conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.mo create mode 100644 conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.po create mode 100644 conlite/plugins/linkchecker/locale/linkchecker.pot create mode 100644 conlite/plugins/linkchecker/locale/potfiles.txt create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_noerrors.html create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_test.html create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors.html create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors_cat.html create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_nothing.html create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist.html create mode 100644 conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist_urls.html create mode 100644 conlite/plugins/linkchecker/xml/lang_de_DE.xml create mode 100644 conlite/plugins/linkchecker/xml/lang_en_EN.xml create mode 100644 conlite/plugins/linkchecker/xml/lang_en_US.xml create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewrite.php create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewritebase.php create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewritecontroller.php create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewritedebugger.php create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewritetest.php create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewriteurlstack.php create mode 100644 conlite/plugins/mod_rewrite/classes/class.modrewriteurlutil.php create mode 100644 conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_content_controller.php create mode 100644 conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contentexpert_controller.php create mode 100644 conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contenttest_controller.php create mode 100644 conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_controller_abstract.php create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/css/atooltip.css create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/css/style.css create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/demos.html create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/images/bg.png create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/images/infoBtn.gif create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.jquery.js create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.min.jquery.js create mode 100644 conlite/plugins/mod_rewrite/external/aToolTip/js/jquery.min.js create mode 100644 conlite/plugins/mod_rewrite/files/htaccess_restrictive.txt create mode 100644 conlite/plugins/mod_rewrite/files/htaccess_simple.txt create mode 100644 conlite/plugins/mod_rewrite/includes/config.mod_rewrite_default.php create mode 100644 conlite/plugins/mod_rewrite/includes/config.plugin.php create mode 100644 conlite/plugins/mod_rewrite/includes/front_content_controller.php create mode 100644 conlite/plugins/mod_rewrite/includes/functions.mod_rewrite.php create mode 100644 conlite/plugins/mod_rewrite/includes/include.mod_rewrite_content.php create mode 100644 conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contentexpert.php create mode 100644 conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contenttest.php create mode 100644 conlite/plugins/mod_rewrite/locale/de_DE/LC_MESSAGES/mod_rewrite.mo create mode 100644 conlite/plugins/mod_rewrite/locale/de_DE/LC_MESSAGES/mod_rewrite.po create mode 100644 conlite/plugins/mod_rewrite/locale/mod_rewrite.pot create mode 100644 conlite/plugins/mod_rewrite/locale/potfiles.txt create mode 100644 conlite/plugins/mod_rewrite/readme.txt create mode 100644 conlite/plugins/mod_rewrite/scripts/mod_rewrite.js create mode 100644 conlite/plugins/mod_rewrite/styles/styles.css create mode 100644 conlite/plugins/mod_rewrite/templates/content.html create mode 100644 conlite/plugins/mod_rewrite/templates/contentexpert.html create mode 100644 conlite/plugins/mod_rewrite/templates/contenttest.html create mode 100644 conlite/plugins/mod_rewrite/xml/lang_de_DE.xml create mode 100644 conlite/plugins/mod_rewrite/xml/lang_en_US.xml create mode 100644 conlite/plugins/newsletter/check.plugin.xml create mode 100644 conlite/plugins/newsletter/classes/class.newsletter.groups.php create mode 100644 conlite/plugins/newsletter/classes/class.newsletter.jobs.php create mode 100644 conlite/plugins/newsletter/classes/class.newsletter.logs.php create mode 100644 conlite/plugins/newsletter/classes/class.newsletter.php create mode 100644 conlite/plugins/newsletter/classes/class.newsletter.recipients.php create mode 100644 conlite/plugins/newsletter/includes/config.autoloader.php create mode 100644 conlite/plugins/newsletter/includes/config.plugin.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_edit.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_edit_message.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_jobs_details.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_jobs_menu.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_jobs_subnav.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_left_top.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_menu.php create mode 100644 conlite/plugins/newsletter/includes/include.newsletter_subnav.php create mode 100644 conlite/plugins/newsletter/includes/include.recipients.group.subnav.php create mode 100644 conlite/plugins/newsletter/includes/include.recipients.group_edit.php create mode 100644 conlite/plugins/newsletter/includes/include.recipients.group_menu.php create mode 100644 conlite/plugins/newsletter/includes/include.recipients_edit.php create mode 100644 conlite/plugins/newsletter/includes/include.recipients_import.php create mode 100644 conlite/plugins/newsletter/includes/include.recipients_menu.php create mode 100644 conlite/plugins/repository/custom/FrontendNavigation.php create mode 100644 conlite/plugins/workflow/classes/class.workflow.php create mode 100644 conlite/plugins/workflow/classes/class.workflowactions.php create mode 100644 conlite/plugins/workflow/classes/class.workflowallocation.php create mode 100644 conlite/plugins/workflow/classes/class.workflowartallocation.php create mode 100644 conlite/plugins/workflow/classes/class.workflowitems.php create mode 100644 conlite/plugins/workflow/classes/class.workflowtasks.php create mode 100644 conlite/plugins/workflow/classes/class.workflowusersequence.php create mode 100644 conlite/plugins/workflow/cronjobs/advance_workflow.php create mode 100644 conlite/plugins/workflow/images/no_verschieben.gif create mode 100644 conlite/plugins/workflow/images/nu_verschieben.gif create mode 100644 conlite/plugins/workflow/images/workflow.gif create mode 100644 conlite/plugins/workflow/images/workflow_alt.gif create mode 100644 conlite/plugins/workflow/images/workflow_email_noti.gif create mode 100644 conlite/plugins/workflow/images/workflow_erstellen.gif create mode 100644 conlite/plugins/workflow/images/workflow_escal_noti.gif create mode 100644 conlite/plugins/workflow/images/workflow_step.gif create mode 100644 conlite/plugins/workflow/images/workflow_step_delete.gif create mode 100644 conlite/plugins/workflow/images/workflow_step_ist_raus.gif create mode 100644 conlite/plugins/workflow/images/workflow_step_new.gif create mode 100644 conlite/plugins/workflow/images/workflow_user.gif create mode 100644 conlite/plugins/workflow/includes/config.plugin.php create mode 100644 conlite/plugins/workflow/includes/functions.workflow.php create mode 100644 conlite/plugins/workflow/includes/include.workflow_edit.php create mode 100644 conlite/plugins/workflow/includes/include.workflow_left_top.php create mode 100644 conlite/plugins/workflow/includes/include.workflow_list.php create mode 100644 conlite/plugins/workflow/includes/include.workflow_steps.php create mode 100644 conlite/plugins/workflow/includes/include.workflow_subnav.php create mode 100644 conlite/plugins/workflow/includes/include.workflow_tasks.php create mode 100644 conlite/plugins/workflow/locale/de_DE/LC_MESSAGES/workflow.mo create mode 100644 conlite/plugins/workflow/locale/de_DE/LC_MESSAGES/workflow.po create mode 100644 conlite/plugins/workflow/locale/potfiles.txt create mode 100644 conlite/plugins/workflow/locale/workflow.pot create mode 100644 conlite/plugins/workflow/plugin_workflow.xml create mode 100644 conlite/plugins/workflow/templates/template.workflow_steps.html create mode 100644 conlite/plugins/workflow/templates/template.workflow_tasks.html create mode 100644 conlite/plugins/workflow/xml/lang_de_DE.xml create mode 100644 conlite/plugins/workflow/xml/lang_en_EN.xml create mode 100644 conlite/plugins/workflow/xml/lang_en_US.xml create mode 100644 conlite/scripts/HTMLObj.js.php create mode 100644 conlite/scripts/addImageTags.js create mode 100644 conlite/scripts/articleObject.js.php create mode 100644 conlite/scripts/browserCheck.js create mode 100644 conlite/scripts/cfoldingrow.js create mode 100644 conlite/scripts/cmsDate.js create mode 100644 conlite/scripts/cmsFileList.js create mode 100644 conlite/scripts/cmsTeaser.js create mode 100644 conlite/scripts/conFrameResize.js create mode 100644 conlite/scripts/con_tiny.js create mode 100644 conlite/scripts/contenidoConfig.js create mode 100644 conlite/scripts/contextMenu.js create mode 100644 conlite/scripts/expandCollapse.js create mode 100644 conlite/scripts/general.js create mode 100644 conlite/scripts/group_association.js create mode 100644 conlite/scripts/header.js create mode 100644 conlite/scripts/help.js.php create mode 100644 conlite/scripts/iZoom.js.php create mode 100644 conlite/scripts/index.php create mode 100644 conlite/scripts/infoBox.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-de.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-el.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-en-GB.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-en-US.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-en.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-fr.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-nl.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-pt-BR.js create mode 100644 conlite/scripts/jquery/colorpicker/i18n/jquery.ui.colorpicker-ru.js create mode 100644 conlite/scripts/jquery/colorpicker/images/128/bar-alpha.png create mode 100644 conlite/scripts/jquery/colorpicker/images/128/bar.png create mode 100644 conlite/scripts/jquery/colorpicker/images/128/map.png create mode 100644 conlite/scripts/jquery/colorpicker/images/bar-alpha.png create mode 100644 conlite/scripts/jquery/colorpicker/images/bar-opacity.png create mode 100644 conlite/scripts/jquery/colorpicker/images/bar-pointer.png create mode 100644 conlite/scripts/jquery/colorpicker/images/bar.png create mode 100644 conlite/scripts/jquery/colorpicker/images/map-opacity.png create mode 100644 conlite/scripts/jquery/colorpicker/images/map-pointer.png create mode 100644 conlite/scripts/jquery/colorpicker/images/map.png create mode 100644 conlite/scripts/jquery/colorpicker/images/preview-opacity.png create mode 100644 conlite/scripts/jquery/colorpicker/images/ui-colorpicker.png create mode 100644 conlite/scripts/jquery/colorpicker/jquery.colorpicker.css create mode 100644 conlite/scripts/jquery/colorpicker/jquery.colorpicker.js create mode 100644 conlite/scripts/jquery/colorpicker/parsers/jquery.ui.colorpicker-cmyk-parser.js create mode 100644 conlite/scripts/jquery/colorpicker/parsers/jquery.ui.colorpicker-cmyk-percentage-parser.js create mode 100644 conlite/scripts/jquery/colorpicker/parts/jquery.ui.colorpicker-memory.js create mode 100644 conlite/scripts/jquery/colorpicker/parts/jquery.ui.colorpicker-rgbslider.js create mode 100644 conlite/scripts/jquery/colorpicker/parts/jquery.ui.colorpicker-swatchesswitcher.js create mode 100644 conlite/scripts/jquery/colorpicker/swatches/jquery.ui.colorpicker-crayola.js create mode 100644 conlite/scripts/jquery/colorpicker/swatches/jquery.ui.colorpicker-pantone.js create mode 100644 conlite/scripts/jquery/colorpicker/swatches/jquery.ui.colorpicker-ral-classic.js create mode 100644 conlite/scripts/jquery/colorpicker/swatches/jquery.ui.colorpicker-x11.js create mode 100644 conlite/scripts/jquery/jquery-migrate-1.2.1.min.js create mode 100644 conlite/scripts/jquery/jquery-ui.js create mode 100755 conlite/scripts/jquery/jquery-ui.old.js create mode 100644 conlite/scripts/jquery/jquery.js create mode 100755 conlite/scripts/jquery/jquery.old.js create mode 100644 conlite/scripts/jscalendar/calendar-contenido.css create mode 100644 conlite/scripts/jscalendar/calendar-setup.js create mode 100644 conlite/scripts/jscalendar/calendar.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-af.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-al.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-bg.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-big5-utf8.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-big5.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-br.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-ca.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-cs-utf8.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-cs-win.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-da.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-de.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-du.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-el.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-en.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-es.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-fi.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-fr.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-he-utf8.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-hu.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-it.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-jp.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-ko-utf8.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-ko.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-lt-utf8.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-lt.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-lv.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-nl.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-no.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-pl-utf8.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-pl.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-pt.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-ro.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-ru.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-ru_win_.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-si.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-sk.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-sp.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-sv.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-tr.js create mode 100644 conlite/scripts/jscalendar/lang/calendar-zh.js create mode 100644 conlite/scripts/jscalendar/lang/cn_utf8.js create mode 100644 conlite/scripts/jscalendar/menuarrow.gif create mode 100644 conlite/scripts/jscalendar/menuarrow2.gif create mode 100644 conlite/scripts/langref.php create mode 100644 conlite/scripts/md5.js create mode 100644 conlite/scripts/messageBox.js.php create mode 100644 conlite/scripts/parameterCollector.js create mode 100644 conlite/scripts/rights.js.php create mode 100644 conlite/scripts/rowMark.js create mode 100644 conlite/scripts/setPager.js create mode 100644 conlite/scripts/str_overview.js create mode 100644 conlite/scripts/subnav.js create mode 100644 conlite/scripts/tip_balloon.js create mode 100644 conlite/scripts/tip_balloon/b.gif create mode 100644 conlite/scripts/tip_balloon/background.gif create mode 100644 conlite/scripts/tip_balloon/l.gif create mode 100644 conlite/scripts/tip_balloon/lb.gif create mode 100644 conlite/scripts/tip_balloon/lt.gif create mode 100644 conlite/scripts/tip_balloon/r.gif create mode 100644 conlite/scripts/tip_balloon/rb.gif create mode 100644 conlite/scripts/tip_balloon/rt.gif create mode 100644 conlite/scripts/tip_balloon/stemb.gif create mode 100644 conlite/scripts/tip_balloon/stemt.gif create mode 100644 conlite/scripts/tip_balloon/t.gif create mode 100644 conlite/scripts/wz_tooltip.js create mode 100644 conlite/styles/cms_filelist.css create mode 100644 conlite/styles/cms_teaser.css create mode 100644 conlite/styles/conlite.css create mode 100644 conlite/styles/contenido.css create mode 100644 conlite/styles/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 conlite/styles/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 conlite/styles/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 conlite/styles/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 conlite/styles/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 conlite/styles/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 conlite/styles/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 conlite/styles/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 conlite/styles/images/ui-icons_222222_256x240.png create mode 100644 conlite/styles/images/ui-icons_2e83ff_256x240.png create mode 100644 conlite/styles/images/ui-icons_454545_256x240.png create mode 100644 conlite/styles/images/ui-icons_888888_256x240.png create mode 100644 conlite/styles/images/ui-icons_cd0a0a_256x240.png create mode 100644 conlite/styles/index.php create mode 100644 conlite/styles/inuse.css create mode 100644 conlite/styles/jquery-ui.css create mode 100644 conlite/styles/str_overview.css create mode 100644 conlite/styles/tip_balloon.css create mode 100644 conlite/subnav.php create mode 100644 conlite/temp/.keep create mode 100644 conlite/temp/deprecated.txt create mode 100644 conlite/templates/index.php create mode 100644 conlite/templates/standard/filler.html create mode 100644 conlite/templates/standard/frameset.html create mode 100644 conlite/templates/standard/frameset_content.html create mode 100644 conlite/templates/standard/frameset_content_left.html create mode 100644 conlite/templates/standard/frameset_content_right.html create mode 100644 conlite/templates/standard/frameset_menuless_content.html create mode 100644 conlite/templates/standard/generic_list.html create mode 100644 conlite/templates/standard/header.html create mode 100644 conlite/templates/standard/html5/template.generic_page.html create mode 100644 conlite/templates/standard/index.php create mode 100644 conlite/templates/standard/submenu.html create mode 100644 conlite/templates/standard/template.admin_frontend.html create mode 100644 conlite/templates/standard/template.backend_search_results.html create mode 100644 conlite/templates/standard/template.blank.html create mode 100644 conlite/templates/standard/template.client_edit.html create mode 100644 conlite/templates/standard/template.client_left_top.html create mode 100644 conlite/templates/standard/template.client_menu.html create mode 100644 conlite/templates/standard/template.client_subnav.html create mode 100644 conlite/templates/standard/template.cms_filelist_dirlistitem.html create mode 100644 conlite/templates/standard/template.cms_filelist_edit.html create mode 100644 conlite/templates/standard/template.cms_filelist_metadata_limititem.html create mode 100644 conlite/templates/standard/template.cms_teaser_edit.html create mode 100644 conlite/templates/standard/template.con_art_overview.html create mode 100644 conlite/templates/standard/template.con_edit_form.html create mode 100644 conlite/templates/standard/template.con_left_top.html create mode 100644 conlite/templates/standard/template.con_str_overview.html create mode 100644 conlite/templates/standard/template.con_str_overview.list.html create mode 100644 conlite/templates/standard/template.con_subnav.html create mode 100644 conlite/templates/standard/template.con_subnav_noleft.html create mode 100644 conlite/templates/standard/template.deco.html create mode 100644 conlite/templates/standard/template.default_subnav.html create mode 100644 conlite/templates/standard/template.file_subnav.html create mode 100644 conlite/templates/standard/template.files_overview.html create mode 100644 conlite/templates/standard/template.generic_form.html create mode 100644 conlite/templates/standard/template.generic_left_top.html create mode 100644 conlite/templates/standard/template.generic_list.html create mode 100644 conlite/templates/standard/template.generic_list_row.html create mode 100644 conlite/templates/standard/template.generic_menu.html create mode 100644 conlite/templates/standard/template.generic_page.html create mode 100644 conlite/templates/standard/template.generic_table_form.html create mode 100644 conlite/templates/standard/template.grouprights_create.html create mode 100644 conlite/templates/standard/template.grouprights_details.html create mode 100644 conlite/templates/standard/template.grouprights_left_top.html create mode 100644 conlite/templates/standard/template.grouprights_memberlist.html create mode 100644 conlite/templates/standard/template.grouprights_memberselect.html create mode 100644 conlite/templates/standard/template.grouprights_menu.html create mode 100644 conlite/templates/standard/template.grouprights_overview.html create mode 100644 conlite/templates/standard/template.html_tpl_left_top.html create mode 100644 conlite/templates/standard/template.info.html create mode 100644 conlite/templates/standard/template.inuse_lay_mod.html create mode 100644 conlite/templates/standard/template.inuse_tpl.html create mode 100644 conlite/templates/standard/template.js_left_top.html create mode 100644 conlite/templates/standard/template.lang_edit.html create mode 100644 conlite/templates/standard/template.lang_left_top.html create mode 100644 conlite/templates/standard/template.lang_overview.html create mode 100644 conlite/templates/standard/template.lay_edit_form.html create mode 100644 conlite/templates/standard/template.lay_overview.html create mode 100644 conlite/templates/standard/template.left_top.html create mode 100644 conlite/templates/standard/template.left_top_blank.html create mode 100644 conlite/templates/standard/template.log_main.html create mode 100644 conlite/templates/standard/template.log_menu.html create mode 100644 conlite/templates/standard/template.mod_edit_form.html create mode 100644 conlite/templates/standard/template.mod_left_top.html create mode 100644 conlite/templates/standard/template.mycontenido_lastarticles.html create mode 100644 conlite/templates/standard/template.mycontenido_settings.html create mode 100644 conlite/templates/standard/template.mycontenido_start.html create mode 100644 conlite/templates/standard/template.mycontenido_subnav.html create mode 100644 conlite/templates/standard/template.newsletter_edit.html create mode 100644 conlite/templates/standard/template.newsletter_left_top.html create mode 100644 conlite/templates/standard/template.newsletter_menu.html create mode 100644 conlite/templates/standard/template.recipient_edit.html create mode 100644 conlite/templates/standard/template.recipient_left_top.html create mode 100644 conlite/templates/standard/template.recipient_menu.html create mode 100644 conlite/templates/standard/template.request_password.html create mode 100644 conlite/templates/standard/template.right_top_blank.html create mode 100644 conlite/templates/standard/template.rights_create.html create mode 100644 conlite/templates/standard/template.rights_details.html create mode 100644 conlite/templates/standard/template.rights_inc.html create mode 100644 conlite/templates/standard/template.rights_left_top.html create mode 100644 conlite/templates/standard/template.rights_menu.html create mode 100644 conlite/templates/standard/template.rights_overview.html create mode 100644 conlite/templates/standard/template.select.html create mode 100644 conlite/templates/standard/template.stat_left_top.html create mode 100644 conlite/templates/standard/template.stat_menu.html create mode 100644 conlite/templates/standard/template.stat_overview.html create mode 100644 conlite/templates/standard/template.stat_subnav.html create mode 100644 conlite/templates/standard/template.stat_top.html create mode 100644 conlite/templates/standard/template.str_overview.html create mode 100644 conlite/templates/standard/template.style_left_top.html create mode 100644 conlite/templates/standard/template.subnav.html create mode 100644 conlite/templates/standard/template.subnav_blank.html create mode 100644 conlite/templates/standard/template.subnav_noleft.html create mode 100644 conlite/templates/standard/template.symbolhelp.html create mode 100644 conlite/templates/standard/template.system_purge.html create mode 100644 conlite/templates/standard/template.system_subnav.html create mode 100644 conlite/templates/standard/template.system_variables.html create mode 100644 conlite/templates/standard/template.tpl_edit_form.html create mode 100644 conlite/templates/standard/template.tpl_overview.html create mode 100644 conlite/templates/standard/template.tplcfg_edit_form.html create mode 100644 conlite/templates/standard/template.upl_dirs_overview.html create mode 100644 conlite/templates/standard/template.upl_files_overview.html create mode 100644 conlite/templates/standard/template.upl_left_top.html create mode 100644 conlite/templates/standard/template.welcome.html create mode 100644 conlite/templates/standard/template.welcome_update.html create mode 100644 conlite/templates/standard/white.html create mode 100644 conlite/templates/standard/widgets/template.widgets.left_top.html create mode 100644 conlite/tools/create_autoloader_cfg.php create mode 100644 conlite/tools/mpAutoloaderClassMap/mpClassMapFileCreator.php create mode 100644 conlite/tools/mpAutoloaderClassMap/mpClassMapFileCreatorContenido.php create mode 100644 conlite/tools/mpAutoloaderClassMap/mpClassTypeFinder.php create mode 100644 conlite/tools/phpcompatinfo.php create mode 100644 conlite/xml/conrepo.xsd create mode 100644 conlite/xml/index.php create mode 100644 conlite/xml/lang_de_DE.xml create mode 100644 conlite/xml/lang_en_US.xml create mode 100644 conlite/xml/lang_fr_FR.xml create mode 100644 data/.directory create mode 100644 data/backup/index.php create mode 100644 data/cache/index.php create mode 100644 data/config/production/cfg_sql.inc.php create mode 100644 data/config/production/config.autoloader.php create mode 100644 data/config/production/config.chains.php create mode 100644 data/config/production/config.colors.php create mode 100644 data/config/production/config.http_check.php create mode 100644 data/config/production/config.misc.php create mode 100644 data/config/production/config.path.php create mode 100644 data/config/production/config.templates.php create mode 100644 data/config/production/index.php create mode 100644 data/logs/index.php create mode 100644 data/temp/index.php create mode 100644 docs/techref/backend/backend.autoloader.html create mode 100644 docs/techref/backend/backend.customizing.1.gif create mode 100644 docs/techref/backend/backend.customizing.html create mode 100644 docs/techref/backend/backend.localconfig.html create mode 100644 docs/techref/backend/backend.plugauth.html create mode 100644 docs/techref/backend/conlogo.gif create mode 100644 docs/techref/frontend/conlogo.gif create mode 100644 docs/techref/frontend/frontend.customizing.html create mode 100644 docs/techref/frontend/frontend.permissions.html create mode 100644 docs/techref/frontend/frontend.protectedcategories.html create mode 100644 docs/techref/frontend/frontend.session.html create mode 100644 docs/techref/modules/conlogo.gif create mode 100644 docs/techref/modules/module.login.html create mode 100644 docs/techref/modules/output-gen.jpg create mode 100644 docs/techref/modules/writing.modules.html create mode 100644 docs/techref/plugins/Contenido Extension Chainer.pdf create mode 100644 docs/techref/plugins/conlogo.gif create mode 100644 docs/techref/plugins/plugin.config.html create mode 100644 docs/translators/translating.doc create mode 100644 pear/Cache/Cache.php create mode 100644 pear/Cache/Container.php create mode 100644 pear/Cache/Container/file.php create mode 100644 pear/Cache/Error.php create mode 100644 pear/Cache/Lite.php create mode 100644 pear/Cache/Output.php create mode 100644 pear/File/Archive.php create mode 100644 pear/File/Archive/Predicate.php create mode 100644 pear/File/Archive/Predicate/And.php create mode 100644 pear/File/Archive/Predicate/Current.php create mode 100644 pear/File/Archive/Predicate/Custom.php create mode 100644 pear/File/Archive/Predicate/Duplicate.php create mode 100644 pear/File/Archive/Predicate/Ereg.php create mode 100644 pear/File/Archive/Predicate/Eregi.php create mode 100644 pear/File/Archive/Predicate/Extension.php create mode 100644 pear/File/Archive/Predicate/False.php create mode 100644 pear/File/Archive/Predicate/Index.php create mode 100644 pear/File/Archive/Predicate/MIME.php create mode 100644 pear/File/Archive/Predicate/MaxDepth.php create mode 100644 pear/File/Archive/Predicate/MinSize.php create mode 100644 pear/File/Archive/Predicate/MinTime.php create mode 100644 pear/File/Archive/Predicate/Not.php create mode 100644 pear/File/Archive/Predicate/Or.php create mode 100644 pear/File/Archive/Predicate/True.php create mode 100644 pear/File/Archive/Reader.php create mode 100644 pear/File/Archive/Reader/Ar.php create mode 100644 pear/File/Archive/Reader/Archive.php create mode 100644 pear/File/Archive/Reader/Bzip2.php create mode 100644 pear/File/Archive/Reader/Cache.php create mode 100644 pear/File/Archive/Reader/ChangeName.php create mode 100644 pear/File/Archive/Reader/ChangeName/AddDirectory.php create mode 100644 pear/File/Archive/Reader/ChangeName/Callback.php create mode 100644 pear/File/Archive/Reader/ChangeName/Directory.php create mode 100644 pear/File/Archive/Reader/Concat.php create mode 100644 pear/File/Archive/Reader/Directory.php create mode 100644 pear/File/Archive/Reader/File.php create mode 100644 pear/File/Archive/Reader/Filter.php create mode 100644 pear/File/Archive/Reader/Gzip.php create mode 100644 pear/File/Archive/Reader/Memory.php create mode 100644 pear/File/Archive/Reader/MimeList.php create mode 100644 pear/File/Archive/Reader/Multi.php create mode 100644 pear/File/Archive/Reader/Relay.php create mode 100644 pear/File/Archive/Reader/Select.php create mode 100644 pear/File/Archive/Reader/Tar.php create mode 100644 pear/File/Archive/Reader/Uncompress.php create mode 100644 pear/File/Archive/Reader/Zip.php create mode 100644 pear/File/Archive/Writer.php create mode 100644 pear/File/Archive/Writer/AddBaseName.php create mode 100644 pear/File/Archive/Writer/Ar.php create mode 100644 pear/File/Archive/Writer/Archive.php create mode 100644 pear/File/Archive/Writer/Bzip2.php create mode 100644 pear/File/Archive/Writer/Files.php create mode 100644 pear/File/Archive/Writer/Gzip.php create mode 100644 pear/File/Archive/Writer/Mail.php create mode 100644 pear/File/Archive/Writer/Memory.php create mode 100644 pear/File/Archive/Writer/MemoryArchive.php create mode 100644 pear/File/Archive/Writer/Multi.php create mode 100644 pear/File/Archive/Writer/Output.php create mode 100644 pear/File/Archive/Writer/Tar.php create mode 100644 pear/File/Archive/Writer/UniqueAppender.php create mode 100644 pear/File/Archive/Writer/Zip.php create mode 100644 pear/File/Iterator.php create mode 100644 pear/File/Iterator/Factory.php create mode 100644 pear/HTML/Common.php create mode 100644 pear/HTML/Common2.php create mode 100644 pear/Log.php create mode 100644 pear/Log/composite.php create mode 100644 pear/Log/console.php create mode 100644 pear/Log/display.php create mode 100644 pear/Log/error_log.php create mode 100644 pear/Log/file.php create mode 100644 pear/Log/mail.php create mode 100644 pear/Log/mcal.php create mode 100644 pear/Log/null.php create mode 100644 pear/Log/observer.php create mode 100644 pear/Log/sql.php create mode 100644 pear/Log/sqlite.php create mode 100644 pear/Log/syslog.php create mode 100644 pear/Log/win.php create mode 100644 pear/MIME/Type.php create mode 100644 pear/MIME/Type/Extension.php create mode 100644 pear/MIME/Type/Parameter.php create mode 100644 pear/Net/IDNA.php create mode 100644 pear/Net/IDNA/php4.php create mode 100644 pear/Net/IDNA/php5.php create mode 100644 pear/Net/UserAgent/Detect.php create mode 100644 pear/OLE/OLE.php create mode 100644 pear/OLE/PPS.php create mode 100644 pear/OLE/PPS/File.php create mode 100644 pear/OLE/PPS/Root.php create mode 100644 pear/OS/Guess.php create mode 100644 pear/PEAR.php create mode 100644 pear/PEAR/Autoloader.php create mode 100644 pear/PEAR/Builder.php create mode 100644 pear/PEAR/Command.php create mode 100644 pear/PEAR/Command/Auth.php create mode 100644 pear/PEAR/Command/Build.php create mode 100644 pear/PEAR/Command/Common.php create mode 100644 pear/PEAR/Command/Config.php create mode 100644 pear/PEAR/Command/Install.php create mode 100644 pear/PEAR/Command/Mirror.php create mode 100644 pear/PEAR/Command/Package.php create mode 100644 pear/PEAR/Command/Registry.php create mode 100644 pear/PEAR/Command/Remote.php create mode 100644 pear/PEAR/Common.php create mode 100644 pear/PEAR/Config.php create mode 100644 pear/PEAR/Dependency.php create mode 100644 pear/PEAR/Frontend/CLI.php create mode 100644 pear/PEAR/Installer.php create mode 100644 pear/PEAR/Packager.php create mode 100644 pear/PEAR/Registry.php create mode 100644 pear/PEAR/Remote.php create mode 100644 pear/README.contenido create mode 100644 pear/Spreadsheet/Excel/Writer.php create mode 100644 pear/Spreadsheet/Excel/Writer/BIFFwriter.php create mode 100644 pear/Spreadsheet/Excel/Writer/Format.php create mode 100644 pear/Spreadsheet/Excel/Writer/Parser.php create mode 100644 pear/Spreadsheet/Excel/Writer/Validator.php create mode 100644 pear/Spreadsheet/Excel/Writer/Workbook.php create mode 100644 pear/Spreadsheet/Excel/Writer/Worksheet.php create mode 100644 pear/System.php create mode 100644 pear/XML/Parser.php create mode 100644 pear/XML/Parser2.php create mode 100644 pear/XML/Parser2/Simple.php create mode 100644 pear/XML/RPC.php create mode 100644 pear/XML/RPC/Dump.php create mode 100644 pear/XML/RPC/Server.php create mode 100644 pear/XML/RSS.php create mode 100755 pear/XML/Serializer.php create mode 100644 pear/XML/Tree.php create mode 100644 pear/XML/Tree/Node.php create mode 100755 pear/XML/Unserializer.php create mode 100644 pear/package.dtd create mode 100644 pear/package.xml create mode 100644 pear/scripts/pear.bat create mode 100755 pear/scripts/pear.sh create mode 100644 pear/scripts/pearcmd.php create mode 100644 pear/template.spec create mode 100644 setup/data/base.txt create mode 100644 setup/data/base/base_actions1.sql create mode 100644 setup/data/base/base_area1.sql create mode 100644 setup/data/base/base_chartable1.sql create mode 100644 setup/data/base/base_chartable2.sql create mode 100644 setup/data/base/base_chartable3.sql create mode 100644 setup/data/base/base_chartable4.sql create mode 100644 setup/data/base/base_chartable5.sql create mode 100644 setup/data/base/base_chartable6.sql create mode 100644 setup/data/base/base_chartable7.sql create mode 100644 setup/data/base/base_files1.sql create mode 100644 setup/data/base/base_framefiles1.sql create mode 100644 setup/data/base/base_framefiles2.sql create mode 100644 setup/data/base/base_meta_type1.sql create mode 100644 setup/data/base/base_misc1.sql create mode 100644 setup/data/base/base_nav_main1.sql create mode 100644 setup/data/base/base_nav_sub1.sql create mode 100644 setup/data/base/base_type1.sql create mode 100644 setup/data/client.txt create mode 100644 setup/data/client/client1.sql create mode 100644 setup/data/client/client1_nocontent.sql create mode 100644 setup/data/client_no_content.txt create mode 100644 setup/data/examples.txt create mode 100644 setup/data/indexes.sql create mode 100644 setup/data/plugin_content_allocation.txt create mode 100644 setup/data/plugin_mod_rewrite.txt create mode 100644 setup/data/plugin_newsletter.txt create mode 100644 setup/data/plugins/plugins_content_allocation.sql create mode 100644 setup/data/plugins/plugins_mod_rewrite.sql create mode 100644 setup/data/plugins/plugins_newsletter.sql create mode 100644 setup/data/standard.txt create mode 100644 setup/data/standard/standard_modules1.sql create mode 100644 setup/data/standard/standard_modules_translations1.sql create mode 100644 setup/data/standard/standard_modules_translations2.sql create mode 100644 setup/data/sysadmin.txt create mode 100644 setup/data/sysadmin/sysadmin1.sql create mode 100644 setup/data/tables.txt create mode 100644 setup/data/tables_pi.txt create mode 100644 setup/dbupdate.php create mode 100644 setup/images/cl-logo.gif create mode 100644 setup/images/controls/arrow_closed.png create mode 100644 setup/images/controls/arrow_open.png create mode 100644 setup/images/controls/back.gif create mode 100644 setup/images/controls/pbend.gif create mode 100644 setup/images/controls/up_over.png create mode 100644 setup/images/icons/error.png create mode 100644 setup/images/icons/info.png create mode 100644 setup/images/icons/warning.png create mode 100644 setup/images/spacer.gif create mode 100644 setup/index.php create mode 100644 setup/lib/class.setupcontrols.php create mode 100644 setup/lib/class.setupmask.php create mode 100644 setup/lib/class.template.php create mode 100644 setup/lib/defines.php create mode 100644 setup/lib/functions.environment.php create mode 100644 setup/lib/functions.filesystem.php create mode 100644 setup/lib/functions.libraries.php create mode 100644 setup/lib/functions.mysql.php create mode 100644 setup/lib/functions.phpinfo.php create mode 100644 setup/lib/functions.safe_mode.php create mode 100644 setup/lib/functions.setup.php create mode 100644 setup/lib/functions.sql.php create mode 100644 setup/lib/functions.system.php create mode 100644 setup/lib/release.php create mode 100644 setup/lib/release.xml create mode 100644 setup/lib/startup.php create mode 100644 setup/locale/de_DE/LC_MESSAGES/setup.mo create mode 100644 setup/locale/de_DE/LC_MESSAGES/setup.po create mode 100644 setup/locale/potfiles.txt create mode 100644 setup/locale/setup.pot create mode 100644 setup/makeconfig.php create mode 100644 setup/script/pluginInfo.js create mode 100644 setup/steps/forms/additionalplugins.php create mode 100644 setup/steps/forms/clientadjust.php create mode 100644 setup/steps/forms/clientmode.php create mode 100644 setup/steps/forms/configmode.php create mode 100644 setup/steps/forms/installer.php create mode 100644 setup/steps/forms/pathinfo.php create mode 100644 setup/steps/forms/setupresults.php create mode 100644 setup/steps/forms/setupsummary.php create mode 100644 setup/steps/forms/systemdata.php create mode 100644 setup/steps/forms/systemtest.php create mode 100644 setup/steps/languagechooser.php create mode 100644 setup/steps/migration/domigration.php create mode 100644 setup/steps/migration/step1.php create mode 100644 setup/steps/migration/step2.php create mode 100644 setup/steps/migration/step3.php create mode 100644 setup/steps/migration/step4.php create mode 100644 setup/steps/migration/step5.php create mode 100644 setup/steps/migration/step6.php create mode 100644 setup/steps/migration/step7.php create mode 100644 setup/steps/migration/step8.php create mode 100644 setup/steps/notinstallable.php create mode 100644 setup/steps/setup/doinstall.php create mode 100644 setup/steps/setup/step1.php create mode 100644 setup/steps/setup/step2.php create mode 100644 setup/steps/setup/step3.php create mode 100644 setup/steps/setup/step4.php create mode 100644 setup/steps/setup/step5.php create mode 100644 setup/steps/setup/step6.php create mode 100644 setup/steps/setup/step7.php create mode 100644 setup/steps/setup/step8.php create mode 100644 setup/steps/setuptype.php create mode 100644 setup/steps/upgrade/doupgrade.php create mode 100644 setup/steps/upgrade/step1.php create mode 100644 setup/steps/upgrade/step2.php create mode 100644 setup/steps/upgrade/step3.php create mode 100644 setup/steps/upgrade/step4.php create mode 100644 setup/steps/upgrade/step5.php create mode 100644 setup/steps/upgrade/step6.php create mode 100644 setup/steps/upgrade/step7.php create mode 100644 setup/style/setup.css create mode 100644 setup/templates/cfoldablerow.tpl create mode 100644 setup/templates/config.php.tpl create mode 100644 setup/templates/crow.tpl create mode 100644 setup/templates/languagechooser.tpl create mode 100644 setup/templates/notinstallable.tpl create mode 100644 setup/templates/setup.tpl create mode 100644 setup/templates/setup/forms/additionalplugins.tpl create mode 100644 setup/templates/setup/forms/clientmode.tpl create mode 100644 setup/templates/setup/forms/configmode.tpl create mode 100644 setup/templates/setup/forms/configmodewopass.tpl create mode 100644 setup/templates/setup/forms/databasedata.tpl create mode 100644 setup/templates/setup/forms/installer.tpl create mode 100644 setup/templates/setup/forms/pathinfo.tpl create mode 100644 setup/templates/setup/forms/setupresults.tpl create mode 100644 setup/templates/setup/forms/setupresultsfail.tpl create mode 100644 setup/templates/setup/forms/setupsummary.tpl create mode 100644 setup/templates/setup/forms/systemdata.tpl create mode 100644 setup/templates/setup/forms/systemtest.tpl create mode 100644 setup/templates/setuptype.tpl diff --git a/LIZENZ.txt b/LIZENZ.txt new file mode 100644 index 0000000..c4e6dab --- /dev/null +++ b/LIZENZ.txt @@ -0,0 +1,293 @@ +Contenido is written and distributed under the GNU General Public License which +means that its source code is freely-distributed and available to the general +public. + + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +675 Mass Ave, Cambridge, MA 02139, USA +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most +of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION + +0. This License applies to any program or other work which contains a notice + placed by the copyright holder saying it may be distributed under the terms + of this General Public License. The "Program", below, refers to any such + program or work, and a "work based on the Program" means either the Program + or any derivative work under copyright law: that is to say, a work + containing the Program or a portion of it, either verbatim or with + modifications and/or translated into another language. (Hereinafter, + translation is included without limitation in the term "modification".) Each + licensee is addressed as "you". + + Activities other than copying, distribution and modification are not covered + by this License; they are outside its scope. The act of running the Program + is not restricted, and the output from the Program is covered only if its + contents constitute a work based on the Program (independent of having been + made by running the Program). Whether that is true depends on what the + Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as + you receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice and + disclaimer of warranty; keep intact all the notices that refer to this + License and to the absence of any warranty; and give any other recipients + of the Program a copy of this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, and you + may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus + forming a work based on the Program, and copy and distribute such + modifications or work under the terms of Section 1 above, provided that you + also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that + you changed the files and the date of any change. + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to + be licensed as a whole at no charge to all third parties under the terms + of this License. + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a + copy of this License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on the + Program is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If identifiable + sections of that work are not derived from the Program, and can be + reasonably considered independent and separate works in themselves, then + this License, and its terms, do not apply to those sections when you + distribute them as separate works. But when you distribute the same sections + as part of a whole which is a work based on the Program, the distribution + of the whole must be on the terms of this License, whose permissions for + other licensees extend to the entire whole, and thus to each and every part + regardless of who wrote it. Thus, it is not the intent of this section to + claim rights or contest your rights to work written entirely by you; rather, + the intent is to exercise the right to control the distribution of + derivative or collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program with + the Program (or with a work based on the Program) on a volume of a storage + or distribution medium does not bring the other work under the scope of this + License. + +3. You may copy and distribute the Program (or a work based on it, under + Section 2) in object code or executable form under the terms of Sections 1 + and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + + The source code for a work means the preferred form of the work for making + modifications to it. For an executable work, complete source code means all + the source code for all modules it contains, plus any associated interface + definition files, plus the scripts used to control compilation and + installation of the executable. However, as a special exception, the source + code distributed need not include anything that is normally distributed (in + either source or binary form) with the major components (compiler, kernel, + and so on) of the operating system on which the executable runs, unless that + component itself accompanies the executable. + + If distribution of executable or object code is made by offering access to + copy from a designated place, then offering equivalent access to copy the + source code from the same place counts as distribution of the source code, + even though third parties are not compelled to copy the source along with + the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as + expressly provided under this License. Any attempt otherwise to copy, + modify, sublicense or distribute the Program is void, and will automatically + terminate your rights under this License. However, parties who have received + copies, or rights, from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. + However, nothing else grants you permission to modify or distribute the + Program or its derivative works. These actions are prohibited by law if you + do not accept this License. Therefore, by modifying or distributing the + Program (or any work based on the Program), you indicate your acceptance of + this License to do so, and all its terms and conditions for copying, + distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), + the recipient automatically receives a license from the original licensor to + copy, distribute or modify the Program subject to these terms and conditions. + You may not impose any further restrictions on the recipients' exercise of + the rights granted herein. You are not responsible for enforcing compliance + by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot distribute so + as to satisfy simultaneously your obligations under this License and any + other pertinent obligations, then as a consequence you may not distribute + the Program at all. For example, if a patent license would not permit + royalty-free redistribution of the Program by all those who receive copies + directly or indirectly through you, then the only way you could satisfy both + it and this License would be to refrain entirely from distribution of the + Program. + + If any portion of this section is held invalid or unenforceable under any + particular circumstance, the balance of the section is intended to apply and + the section as a whole is intended to apply in other circumstances. + + It is not the purpose of this section to induce you to infringe any patents + or other property right claims or to contest validity of any such claims; + this section has the sole purpose of protecting the integrity of the free + software distribution system, which is implemented by public license + practices. Many people have made generous contributions to the wide range + of software distributed through that system in reliance on consistent + application of that system; it is up to the author/donor to decide if he or + she is willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be a + consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain + countries either by patents or by copyrighted interfaces, the original + copyright holder who places the Program under this License may add an + explicit geographical distribution limitation excluding those countries, so + that distribution is permitted only in or among countries not thus excluded. + In such case, this License incorporates the limitation as if written in the + body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the + General Public License from time to time. Such new versions will be similar + in spirit to the present version, but may differ in detail to address new + problems or concerns. + + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and + "any later version", you have the option of following the terms and + conditions either of that version or of any later version published by the + Free Software Foundation. If the Program does not specify a version number + of this License, you may choose any version ever published by the + Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs + whose distribution conditions are different, write to the author to ask for + permission. For software which is copyrighted by the Free Software + Foundation, write to the Free Software Foundation; we sometimes make + exceptions for this. Our decision will be guided by the two goals of + preserving the free status of all derivatives of our free software and of + promoting the sharing and reuse of software generally. + +NO WARRANTY +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR + THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO + THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM + PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR + CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL + ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +Contenido is a Content Management System based on PHP. +Copyright (C) 2000-2008 four for business AG. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the +Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Contenido, versions 0.9-4.6 and higher, +Copyright (C) 2000-2008 by four for business AG. + +Contenido comes with ABSOLUTELY NO WARRANTY. + +four for business AG +Nordring 82 B +D-63067 Offenbach am Main +Germany +E-Mail: info@4fb.de +Web: http://www.4fb.de diff --git a/README_.txt b/README_.txt new file mode 100644 index 0000000..2d8579d --- /dev/null +++ b/README_.txt @@ -0,0 +1,78 @@ +$Id: README_.txt 323 2015-05-28 12:02:34Z oldperl $ +---------------------------------------------------------------------------------------------------- +This is the readme file for ConLite 2.0 + +Any help you need you may find by visiting the following links. + +CL-Portal http//conlite.org +CL-Forum http://forum.conlite.org +CL-Bugtracker http://bugs.conlite.org +CL-API-Doc http://conlite.conrepo.org/api/4.8.16CL + +!!! Attention !!! +We tried to fix all known bugs of 4.8.15 and earlier but cannot give any garanties for that. So use +it on your own risk. If you find any bug or have any idea to enhance ConLite, feel free to visit our +bugtracker and register at http://bugs.conlite.org +Any help and ideas are welcome :) + +** Mini FAQ ** + +What is ConLite (-Edition) of CONTENIDO? + +CL (short for ConLite) is dedicated to close the gap between CONTENIDO 4.8.15 and the version 4.9. +In downloadable 4.8.20 (and former 4.8.15) are still a lot of bugs and some missing feautures and +enhancements so one cannot use the version without problems. Our goal is to give you a bugfixed and +really stable version of CONTENIDO till the 4.9 is stable. By the way, there are still a lot of big sides +build with 4.8.x out there where upgrading to 4.9.x is not possible or cost a lot of money. + +Why i have to use ConLite? + +You don't have to, but feel free to do it. ConLite will show you an easier way to upgrade to CONTENIDO +4.9. The new version of CONTENIDO will have a lot of changes, so you have to do a lot of work +with modules or custom plugins to adapt them to the new version. That's not what ConLite does nor will +do in the future. ConLite will do changes step by step, or better version by version to adapt your +4.8.15 or higher installation to work with the new 4.9 of CONTENIDO. And ConLite will try to give you a +stable and bugfixed CONTENIDO 4.8.x in the future. + +Who are the people behind ConLite? + +The Team behind the CL-version are some well known guys from CONTENIDO-forum, working since many years with +and within CONTENIDO core or coding modules and plugins for CONTENIDO. +And we love CONTENIDO :) + + +** Copyright ** + +The copyright for the code of CONTENIDO still remains to 4fb and the named coders for all codes coming +from 4.8.15 and/or from svn-repository of CONTENDIO. +All ads, enhancements or new parts, coded by the CL-Team are copyright by their named coders or +by CL-Team and conrepo.org. + + +** Know Bugs ** +FS#25 - Collision with pre-installed AMR after Migration + !!! Attention !!! + If you want to upgrade with an installed AMR-plugin, uninstall AMR before upgrade. + We will include a fix for that in one of the next versions of CL + + +** History / Changelog ** + +ConLite 1.0 + +CONTENIDO 4.8.16 CL + 20 Bug Report genericdb: urlencode() expects parameter 1 to be string ... + 16 Enhancement RSS-Reader austauschen/überarbeiten + 31 Optimization Test CL installation with newest PHP and SQL on XAMPP + 3 Bug Report Genericdb caching not working + 37 Bug Report Upgrade: valid_from and valid_to fields are set to NULL + 33 Bug Report Missing include.subnav_blank.php + 22 Bug Report Modul xhtml which is not choosable in modularea + 10 Optimization Generate API-Doc + 34 Bug Report Error when searching article with no criteria + 24 Bug Report No reset of subnavigation if a layout is deleted + 15 Optimization Add CL readme file + 13 Bug Report FEUser-Plugins valide_to and valide_from saving wrong t ... + 9 Enhancement Check all translations (i18n) + 8 Bug Report adapt genericdb from 4.8.17 CL + 5 Bug Report Buttontranslations missing or wrong \ No newline at end of file diff --git a/cms/config.php b/cms/config.php new file mode 100644 index 0000000..8918a2a --- /dev/null +++ b/cms/config.php @@ -0,0 +1,52 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * + * + * {@internal + * created unknown + * modified 2008-07-03, bilal arslan, added security fix + * + * $Id: config.php 450 2016-07-20 11:11:12Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// Relative path to contenido directory, for all inclusions, in most cases: "../contenido/" +$contenido_path = "../conlite/"; + +// If language isn't specified, set this client and language (ID) +$load_lang = "1"; +$load_client = "1"; + +/* Various debugging options */ +$frontend_debug["container_display"] = false; +$frontend_debug["module_display"] = false; +$frontend_debug["module_timing"] = false; +$frontend_debug["module_timing_summary"]= false; + +/* Set to 1 to brute-force module regeneration */ +$force = 0; +?> diff --git a/cms/css/basic-style.css b/cms/css/basic-style.css new file mode 100644 index 0000000..a2c9e8b --- /dev/null +++ b/cms/css/basic-style.css @@ -0,0 +1,523 @@ +/* +Simple Responsive Template v 1.2 + + +primary styles + Author: www.prowebdesign.ro + Add your own styles to customize the project. + + + +BASE (MOBILE) SIZE + These are the mobile styles. It's what people see on their phones. + Remember, keep it light: Speed is Important. +*/ + +/* typography */ +body{ + color:#666; + font-family:'Ubuntu', Arial, Helvetica, sans-serif; + font-size:1em; + line-height:1.4em; + font-weight:normal; +} +h1, h2, h3, h4, h5, h6{ + font-weight:normal; + font-family:'Droid Serif', Arial, Helvetica, sans-serif; + line-height:1.5em; + margin:.45em 0; + padding:0; +} + + +/* links */ +a, +a:visited, +a:active, +a:hover{color:#0099ff;} +a:hover{ text-decoration:none;} + + +/* Box sizing. Awesome thing. Read about it here: http://www.w3schools.com/cssref/css3_pr_box-sizing.asp */ +*{ box-sizing:border-box; + -moz-box-sizing:border-box;} + + +/* structure */ +.wrapper{ + width: 92%; + margin: 0 auto; +} +header{ + padding:15px 0; +} +#banner{ + text-align:center; +} + +#hero, +#page-header{ + background:#f3f3f3; + border-top:1px solid #e2e2e2; + border-bottom:1px solid #e2e2e2; + padding:20px 0; +} +#hero h1{ + line-height:1.2em; + margin-top:0px; + margin-bottom:10px;} + +.flexslider{ + display:none; +} + +#content { + margin:40px 0; +} + +aside { + margin:40px 0; +} + +p{ margin:0 0 1.5em;} + + +/* RESPONSIVE IMAGES */ +img{ max-width:100%; height:auto;} + + +/*MAIN MENU*/ +.menu-toggle{ + display:block; + padding:10px; + margin:20px 0 0; + background:#666; + color:#fff; + cursor:pointer; + text-transform:uppercase; + font-size:20px; +} +.menu-toggle.toggled-on{ + background:#0099ff; +} +.srt-menu{ + display:none; +} +.srt-menu.toggled-on{ + display:block; + position:relative; + z-index:10; +} + +.srt-menu{ + clear:both; + margin-bottom:60px; + +} +.srt-menu li a { + background:#dadada; + display:block; + margin:1px 0; + padding:10px; + text-decoration:none; +} +.srt-menu li a:hover{ + background:#0099ff; + color:#fff; +} +.srt-menu li li a { + background:#e8e8e8; + padding-left:40px; +} +.srt-menu li li li a { + background:#efefef; + padding-left:80px; +} + +/*SECONDARY MENU*/ +#secondary-navigation{ + margin-bottom:60px; +} +#secondary-navigation ul{ + margin:0; + padding:0; +} +#secondary-navigation ul li a{ + background:#E6E6E6; + display:block; + margin:5px 0; + padding:10px; + text-decoration:none; +} +#secondary-navigation ul li a:hover, +#secondary-navigation ul li.active a{ + background:#0099ff; + color:#fff; +} + +/*SPACE GRID ELEMENTS VERTICALLY, SINCE THEY ARE ONE UNDER ANOTHER SO FAR*/ +.grid_1, +.grid_2, +.grid_3, +.grid_4, +.grid_5, +.grid_6, +.grid_7, +.grid_8, +.grid_9, +.grid_10, +.grid_11, +.grid_12 { + margin-bottom:40px; + /*positioning and padding*/ + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} + +/*FOOTER*/ +footer{ + clear:both; + font-size:80%; + padding:20px 0; +} +footer ul{ + margin:0; + padding:0; +} + +/*colors and backgrounds*/ +body{ + background:#fff; +} +h1, h2, h3, h4, h5, h6{ + color:#333; +} + +footer{ + background:#333; + color:#ccc; +} +footer h1, footer h2, footer h3, footer h4{ + color:#CCC; + margin-bottom:10px; +} +footer ul{ + margin:0 0 0 8%; +} + +a.buttonlink{ + background:#0099ff; + border-radius:7px; + color:#fff; + display:block; + float:left; + margin:10px 15px 10px 0; + padding:10px; + text-decoration:none; +} +a.buttonlink:hover{ + background:#8dbc01; +} +.greenelement{ + background:#5ec79e; + color:#fff; +} +.violetelement{ + background:#887dc2; + color:#fff; +} + + + +/* Contain floats*/ +.clearfix:before, +.clearfix:after, +.row:before, +.row:after { + content: " "; + display: table; +} +.clearfix:after, +.container:after, +.row:after{ + clear: both; +} + + +/* +LARGER MOBILE DEVICES +This is for mobile devices with a bit larger screens. +*/ +@media only screen and (min-width: 481px) { +#banner{ + float:left; + text-align:left; + margin-bottom:-20px;/*this depends on the height of the logo*/ +} +.menu-toggle{/*make menu float right, instead of sitting under the logo*/ + margin-top:10px; /*this depends on the height of the logo*/ + float:right; +} + +} + +/* +TABLET & SMALLER LAPTOPS +The average viewing window and preferred media query for those is 768px. +But I think that some more breathing space is good:) +*/ +@media only screen and (min-width: 920px) { + +.wrapper{ + max-width: 1200px; + margin: .75em auto; +} + +#banner{ + float:left; + text-align:left; + margin-bottom:0px; +} +header{ + padding:0; +} +#content { + float:left; + width:65%; +} +#content.wide-content{ + float:none; + width:100%; +} + +.flexslider{ +display:block; +/*demo 1 slider theme*/ +margin: 0 0 60px; +background: #fff; +border: 4px solid #fff; +-webkit-border-radius: 4px; +-moz-border-radius: 4px; +-o-border-radius: 4px; +border-radius: 4px; +box-shadow: 0 1px 4px rgba(0,0,0,.2); +-webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); +-moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); +-o-box-shadow: 0 1px 4px rgba(0,0,0,.2); +} + + +aside { + float:right; + width:30%; +} + +/*** MAIN MENU - ESSENTIAL STYLES ***/ +.menu-toggle{display:none;} +#menu-main-navigation{display:block;} + +.srt-menu, .srt-menu * { + margin: 0; + padding: 0; + list-style: none; +} +.srt-menu ul { + position: absolute; + display:none; + width: 12em; /* left offset of submenus need to match (see below) */ +} +.srt-menu ul li { + width: 100%; +} +.srt-menu li:hover { + visibility: inherit; /* fixes IE7 'sticky bug' */ +} +.srt-menu li { + float: left; + position: relative; + margin-left:1px; +} +.srt-menu li li { + margin-left:0px; +} +.srt-menu a { + display: block; + position: relative; +} +.srt-menu li:hover ul, +.srt-menu li.sfHover ul { + display:block; + left: 0; + top: 45px; /* match top ul list item height */ + z-index: 99; + -webkit-box-shadow: 2px 3px 2px 0px rgba(00, 00, 00, .3); + box-shadow: 2px 3px 2px 0px rgba(00, 00, 00, .3); +} +ul.srt-menu li:hover li ul, +ul.srt-menu li.sfHover li ul { + top: -999em; +} +ul.srt-menu li li:hover ul, +ul.srt-menu li li.sfHover ul { + left: 12em; /* match ul width */ + top: 0; +} +ul.srt-menu li li:hover li ul, +ul.srt-menu li li.sfHover li ul { + top: -999em; +} +ul.srt-menu li li li:hover ul, +ul.srt-menu li li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} + +/*** DEMO1 SKIN ***/ +#topnav, .srt-menu { + float:right; + margin: .35em 0 0 0; +} +.srt-menu a { + text-decoration:none; +} +.srt-menu li a { + background:#fff; + margin:0; + padding:10px 20px; + height:45px; +} +.srt-menu a, .srt-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/ + color: #0099ff; +} +.srt-menu li li a { + border-top: 1px solid rgba(255,255,255,.2); + background: #333; /*fallback for old IE*/ + background:rgba(0,0,0,.6); + color: #fff; + padding-left:20px; + height:auto; +} +.srt-menu li li a:visited{color:#fff;} +.srt-menu li li li a, +.srt-menu li.active * li a{ + padding-left:20px; + background:rgba(0,0,0,.6); +} + +.srt-menu li:hover > a, +.srt-menu li.active a{ + color:#fff; + background:#0099ff; +} +.srt-menu li li:hover > a{ + color:#fff; + background:#0099ff; +} + + + +/*GRID*/ +/* + & Columns : 12 + + */ + .row{ + margin-left: -15px; + margin-right: -15px; +} + +.grid_1 { width: 8.33333333%; } +.grid_2 { width: 16.66666667%; } +.grid_3 { width: 25%; } +.grid_4 { width: 33.33333333%; } +.grid_5 { width: 41.66666667%; } +.grid_6 { width: 50%; } +.grid_7 { width: 58.33333333%; } +.grid_8 { width: 66.66666667%; } +.grid_9 { width: 75%; } +.grid_10 { width: 83.33333333%; } +.grid_11 { width: 91.66666667%; } +.grid_12 { width: 100%; } + +.grid_1, +.grid_2, +.grid_3, +.grid_4, +.grid_5, +.grid_6, +.grid_7, +.grid_8, +.grid_9, +.grid_10, +.grid_11, +.grid_12 { + float: left; + display: block; +} + +.rightfloat{float:right;} +/* @notation inspired by tinyGrid, .row and percentage by Twitter Bootstrap + */ + +#hero [class*="grid_"] { margin-bottom:-20px;} + +} + +/* +DESKTOP +This is the average viewing window. So Desktops, Laptops, and +in general anyone not viewing on a mobile device. Here's where +you can add resource intensive styles. +*/ +@media only screen and (min-width: 1030px) { + +} + +/* +LARGE VIEWING SIZE +This is for the larger monitors and possibly full screen viewers. +*/ +@media only screen and (min-width: 1240px) { + +} + +/* +RETINA (2x RESOLUTION DEVICES) +This applies to the retina iPhone (4s) and iPad (2,3) along with +other displays with a 2x resolution. +*/ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (min--moz-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + + +} + +/* +iPHONE 5 MEDIA QUERY +iPhone 5 or iPod Touch 5th generation styles (you can include your own file if you want) +*/ +@media (device-height: 568px) and (-webkit-min-device-pixel-ratio: 2) { + + +} + +/* +PRINT STYLESHEET +*/ +@media print { + * { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */ + a, a:visited { text-decoration: underline; } + a[href]:after { content: " (" attr(href) ")"; } + abbr[title]:after { content: " (" attr(title) ")"; } + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */ + pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } + thead { display: table-header-group; } /* h5bp.com/t */ + tr, img { page-break-inside: avoid; } + img { max-width: 100% !important; } + @page { margin: 0.5cm; } + p, h2, h3 { orphans: 3; widows: 3; } + h2, h3 { page-break-after: avoid; } +} \ No newline at end of file diff --git a/cms/css/conlite-demo.css b/cms/css/conlite-demo.css new file mode 100644 index 0000000..6662565 --- /dev/null +++ b/cms/css/conlite-demo.css @@ -0,0 +1,136 @@ +form#login_box { + width: 100%; +} + +form#login_box fieldset { + padding: 3px; + border-radius: 6px; +} + +input[type='submit'] { + background: #0099ff none repeat scroll 0 0; + border: 1px solid; + border-radius: 6px; + color: #fff; + margin: 5px 10px 5px 0; + padding: 5px; + text-decoration: none; +} + +footer #colophon { + position: relative; +} + +div#social-media-links { + position: absolute; + right: 0; + text-align: right; + width: 20%; + display: inline-block; +} + +a.social-media-icon { + width: 32px; + height: 32px; + background-image: url(../images/ico/social_icons_sprite.png); + display: inline-block; + color: rgba(0, 0, 0, 0); +} + +.facebook { + background-position: 0 0 !important; +} + +.facebook:hover { + background-position: 0 -32px !important; +} + +.pinterest { + background-position: -32px 0 !important; +} + +.pinterest:hover { + background-position: -32px -32px !important; +} + +.youtube { + background-position: -64px 0px !important; +} + +.youtube:hover { + background-position: -64px -32px !important; +} + +.flickr { + background-position: -96px 0px !important; +} + +.flickr:hover{ + background-position: -96px -32px !important; +} + +.google-plus { + background-position: -128px 0px !important; +} + +.google-plus:hover { + background-position: -128px -32px !important; +} + +.rss { + background-position: -160px 0 !important; +} + +.rss:hover { + background-position: -160px -32px !important; +} + + +.twitter { + background-position: -192px 0 !important; +} + +.twitter:hover { + background-position: -192px -32px !important; +} + + +.vimeo { + background-position: -224px 0 !important; +} + +.vimeo:hover { + background-position: -224px -32px !important; +} + +.dribble { + background-position: -256px 0 !important; +} + +.dribble:hover { + background-position: -256px -32px !important; +} + +.linkedin { + background-position: -288px 0 !important; +} + +.linkedin:hover { + background-position: -288px -32px !important; +} + +.xing { + background-position: -320px 0 !important; +} + +.xing:hover { + background-position: -320px -32px !important; +} + + + +@media only screen and (min-width: 920px) { + form#login_box input { + max-width: 100px; + } +} \ No newline at end of file diff --git a/cms/css/index.php b/cms/css/index.php new file mode 100644 index 0000000..ef8b776 --- /dev/null +++ b/cms/css/index.php @@ -0,0 +1,4 @@ + diff --git a/cms/css/normalize.css b/cms/css/normalize.css new file mode 100644 index 0000000..68fcfea --- /dev/null +++ b/cms/css/normalize.css @@ -0,0 +1,530 @@ +/*! normalize.css v1.1.0 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + * Known issue: no IE 6 support. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/** + * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using + * `em` units. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/** + * Address `font-family` inconsistency between `textarea` and other form + * elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/** + * Address margins handled incorrectly in IE 6/7. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/** + * Address font sizes and margins set differently in IE 6/7. + * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, + * and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +/** + * Address styling not present in IE 7/8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/** + * Address styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address differences between Firefox and other browsers. + * Known issue: no IE 6/7 normalization. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Address styling not present in IE 6/7/8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address margins set differently in IE 6/7. + */ + +p, +pre { + margin: 1em 0; +} + +/** + * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/** + * Improve readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + +} + +/** + * Address CSS quotes not supported in IE 6/7. + */ + +q { + quotes: none; +} + +/** + * Address `quotes` property not supported in Safari 4. + */ + +q:before, +q:after { + content: ''; + content: none; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Lists + ========================================================================== */ + +/** + * Address margins set differently in IE 6/7. + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/** + * Address paddings set differently in IE 6/7. + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/** + * Correct list images handled incorrectly in IE 7. + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; + padding:0; + margin:0; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/** + * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * 2. Improve image quality when scaled in IE 7. + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/** + * Correct overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/** + * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/** + * Correct margin displayed oddly in IE 6/7. + */ + +form { + margin: 0; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct color not being inherited in IE 6/7/8/9. + * 2. Correct text not wrapping in Firefox 3. + * 3. Correct alignment displayed oddly in IE 6/7. + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/** + * 1. Correct font size not being inherited in all browsers. + * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, + * and Chrome. + * 3. Improve appearance and consistency in all browsers. + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/** + * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + * 4. Remove inner spacing in IE 7 without affecting normal text inputs. + * Known issue: inner spacing remains in IE 6. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ + *overflow: visible; /* 4 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to content-box in IE 8/9. + * 2. Remove excess padding in IE 8/9. + * 3. Remove excess padding in IE 7. + * Known issue: excess padding remains in IE 6. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 3+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 6/7/8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/cms/data/modules/index.php b/cms/data/modules/index.php new file mode 100644 index 0000000..ef8b776 --- /dev/null +++ b/cms/data/modules/index.php @@ -0,0 +1,4 @@ + diff --git a/cms/dbfs.php b/cms/dbfs.php new file mode 100644 index 0000000..50210ca --- /dev/null +++ b/cms/dbfs.php @@ -0,0 +1,66 @@ + + * + * Requirements: + * @con_php_req 5 + * @con_template + * @con_notice + * + * + * @package ContenidoBackendArea + * @author unknown + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * + * + * {@internal + * created unknown + * modified 2008-06-16, H. Librenz - Hotfix: checking for potential unsecure calling + * modified 2008-07-03, bilal arslan, added security fix + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: dbfs.php 450 2016-07-20 11:11:12Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +$contenido_path = ''; +# include the config file of the frontend to init the Client and Language Id +include_once ("config.php"); + +// Contenido startup process +include_once ($contenido_path . 'includes/startup.php'); + +if ($contenido) +{ + page_open(array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +} else { + page_open(array('sess' => 'Contenido_Frontend_Session', + 'auth' => 'Contenido_Frontend_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); +} + +/* Shorten load time */ +$client = $load_client; + +$dbfs = new DBFSCollection; +$dbfs->outputFile($file); + +page_close(); + +?> \ No newline at end of file diff --git a/cms/error.php b/cms/error.php new file mode 100644 index 0000000..e18b0eb --- /dev/null +++ b/cms/error.php @@ -0,0 +1,13 @@ + + + Fehler + + + + + + + +  + + diff --git a/cms/favicon.ico b/cms/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fbca42b7360bfad06a9e6b3f67fe35c3d7c81acc GIT binary patch literal 29038 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 aVvXMgvCXt&iUIsa2xFiHbYJcFL;f56R8$%O literal 0 HcmV?d00001 diff --git a/cms/front_content.php b/cms/front_content.php new file mode 100644 index 0000000..0fb2500 --- /dev/null +++ b/cms/front_content.php @@ -0,0 +1,949 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +$contenido_path = ''; +# include the config file of the frontend to init the Client and Language Id +include_once ("config.php"); + +# Contenido startup process +include_once ($contenido_path . 'includes/startup.php'); + +cInclude("includes", "functions.con.php"); +cInclude("includes", "functions.con2.php"); +cInclude("includes", "functions.api.php"); +cInclude("includes", "functions.pathresolver.php"); + +if ($cfg["use_pseudocron"] == true) +{ + /* Include cronjob-Emulator */ + $oldpwd = getcwd(); + chdir($cfg["path"]["contenido"].$cfg["path"]["cronjobs"]); + cInclude("includes", "pseudo-cron.inc.php"); + chdir($oldpwd); +} + +/* + * Initialize the Database Abstraction Layer, the Session, Authentication and Permissions Handler of the + * PHPLIB application development toolkit + * @see http://sourceforge.net/projects/phplib + */ +if ($contenido) +{ + //Backend + page_open(array ('sess' => 'Contenido_Session', 'auth' => 'Contenido_Challenge_Crypt_Auth', 'perm' => 'Contenido_Perm')); + i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); +} +else +{ + //Frontend + page_open(array ('sess' => 'Contenido_Frontend_Session', 'auth' => 'Contenido_Frontend_Challenge_Crypt_Auth', 'perm' => 'Contenido_Perm')); +} + +/** + * Bugfix + * @see http://contenido.org/forum/viewtopic.php?t=18291 + * + * added by H. Librenz (2007-12-07) + */ +//includePluginConf(); +/** + * fixed bugfix - using functions brokes variable scopes! + * + * added by H. Librenz (2007-12-21) based on an idea of A. Lindner + */ +require_once $cfg['path']['contenido'] . $cfg['path']['includes'] . 'functions.includePluginConf.php'; + +$db = new DB_Contenido; + +$sess->register("cfgClient"); +$sess->register("errsite_idcat"); +$sess->register("errsite_idart"); +$sess->register("encoding"); + +if ($cfgClient["set"] != "set") +{ + rereadClients(); +} + +# Check if this request is for a compressed file +if ($_GET['action'] == 'get_compressed') { + # Get the calling parameters + $sFilename = ((isset($_GET['f'])) ? $_GET['f'] : $_GET['amp;f']); + $sContentType = ((isset($_GET['c'])) ? $_GET['c'] : $_GET['amp;c']); + + # Output the file using the class output() function + Output_Compressor::output($cfgClient[$client]['path']['frontend'] . 'cache/', $sFilename, $sContentType); + + # Don't do anything else + exit(); +} + +// Call hook after plugins are loaded, added by Murat Purc, 2008-09-07 +CEC_Hook::execute('Contenido.Frontend.AfterLoadPlugins'); + +if (!isset($encoding) || !is_array($encoding) || count($encoding) == 0) +{ + // get encodings of all languages + $encoding = array(); + $sql = "SELECT idlang, encoding FROM " . $cfg["tab"]["lang"]; + $db->query($sql); + while ($db->next_record()) { + $encoding[$db->f('idlang')] = $db->f('encoding'); + } +} + + +// Check frontend globals +// @TODO: Should be outsourced into startup process but requires a better detection (frontend or backend) +Contenido_Security::checkFrontendGlobals(); + + +// update urlbuilder set http base path +Contenido_Url::getInstance()->getUrlBuilder()->setHttpBasePath($cfgClient[$client]['htmlpath']['frontend']); + + +// Initialize language +if (!isset($lang)) { + + // if there is an entry load_lang in frontend/config.php use it, else use the first language of this client + if(isset($load_lang)){ + // load_client is set in frontend/config.php + $lang = $load_lang; + }else{ + + $sql = "SELECT + B.idlang + FROM + ".$cfg["tab"]["clients_lang"]." AS A, + ".$cfg["tab"]["lang"]." AS B + WHERE + A.idclient='".Contenido_Security::toInteger($client)."' AND + A.idlang = B.idlang + LIMIT + 0,1"; + + $db->query($sql); + $db->next_record(); + + $lang = $db->f("idlang"); + } +} + +if (!$sess->is_registered("lang") ) $sess->register("lang"); +if (!$sess->is_registered("client") ) $sess->register("client"); + +if (isset ($username)) +{ + $auth->login_if(true); +} + +/* + * Send HTTP header with encoding + */ +header("Content-Type: text/html; charset={$encoding[$lang]}"); + +/* + * if http global logout is set e.g. front_content.php?logout=true + * log out the current user. + */ +if (isset ($logout)) +{ + $auth->logout(true); + $auth->unauth(true); + $auth->auth["uname"] = "nobody"; +} + +/* + * local configuration + */ +if (file_exists("config.local.php")) +{ + @ include ("config.local.php"); +} + +/* + * If the path variable was passed, try to resolve it to a Category Id + * e.g. front_content.php?path=/company/products/ + */ +if (isset($path) && strlen($path) > 1) +{ + /* Which resolve method is configured? */ + if ($cfg["urlpathresolve"] == true) + { + + $iLangCheck = 0; + $idcat = prResolvePathViaURLNames($path, $iLangCheck); + + } + else + { + $iLangCheck = 0; + + $idcat = prResolvePathViaCategoryNames($path, $iLangCheck); + if(($lang != $iLangCheck) && ((int)$iLangCheck != 0)){ + $lang = $iLangCheck; + } + + } +} + +// error page +$aParams = array ( + 'client' => $client, 'idcat' => $errsite_idcat[$client], 'idart' => $errsite_idart[$client], + 'lang' => $lang, 'error'=> '1' +); +$errsite = 'Location: ' . Contenido_Url::getInstance()->buildRedirect($aParams); + + +/* + * Try to initialize variables $idcat, $idart, $idcatart, $idartlang + * Note: These variables can be set via http globals e.g. front_content.php?idcat=41&idart=34&idcatart=35&idartlang=42 + * If not the values will be computed. + */ +if ($idart && !$idcat && !$idcatart) +{ + /* Try to fetch the first idcat */ + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + if ($db->next_record()) + { + $idcat = $db->f("idcat"); + } +} + +unset ($code); +unset ($markscript); + +if (!$idcatart) +{ + if (!$idart) + { + if (!$idcat) + { + # Note: In earlier Contenido versions the information if an article is startarticle of a category has been stored + # in relation con_cat_art. + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT + idart, + B.idcat + FROM + ".$cfg["tab"]["cat_art"]." AS A, + ".$cfg["tab"]["cat_tree"]." AS B, + ".$cfg["tab"]["cat"]." AS C + WHERE + A.idcat=B.idcat AND + B.idcat=C.idcat AND + is_start='1' AND + idclient='".Contenido_Security::toInteger($client)."' + ORDER BY + idtree ASC"; + } + else + { + # Note: Now the information if an article is startarticle of a category is stored in relation con_cat_lang. + $sql = "SELECT + A.idart, + B.idcat + FROM + ".$cfg["tab"]["cat_art"]." AS A, + ".$cfg["tab"]["cat_tree"]." AS B, + ".$cfg["tab"]["cat"]." AS C, + ".$cfg["tab"]["cat_lang"]." AS D, + ".$cfg["tab"]["art_lang"]." AS E + WHERE + A.idcat=B.idcat AND + B.idcat=C.idcat AND + D.startidartlang = E.idartlang AND + D.idlang='".Contenido_Security::toInteger($lang)."' AND + E.idart=A.idart AND + E.idlang='".Contenido_Security::toInteger($lang)."' AND + idclient='".Contenido_Security::toInteger($client)."' + ORDER BY + idtree ASC"; + } + + $db->query($sql); + + if ($db->next_record()) { + $idart = $db->f("idart"); + $idcat = $db->f("idcat"); + } else { + if($contenido) { + cInclude("includes", "functions.i18n.php"); + die(i18n("No start article for this category")); + } else { + if($error == 1) { + die("Fatal error: Could not display error page. Error to display was: 'No start article in this category'"); + } else { + header($errsite); + exit; + } + } + } + } else { + $idart = -1; + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND is_start='1'"; + $db->query($sql); + + if ($db->next_record()) + { + $idart = $db->f("idart"); + } + } + else + { + $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + if ($db->next_record()) + { + if ($db->f("startidartlang") != 0) + { + $sql = "SELECT idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang='".Contenido_Security::toInteger($db->f("startidartlang"))."'"; + $db->query($sql); + $db->next_record(); + $idart = $db->f("idart"); + } + } + } + + if ($idart != -1) + { + } + else + { + // error message in backend + if ($contenido) + { + cInclude("includes", "functions.i18n.php"); + die(i18n("No start article for this category")); + } + else + { + if ($error == 1) + { + echo "Fatal error: Could not display error page. Error to display was: 'No start article in this category'"; + } + else + { + header($errsite); + exit; + } + } + } + } + } +} +else +{ + $sql = "SELECT idcat, idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; + + $db->query($sql); + $db->next_record(); + + $idcat = $db->f("idcat"); + $idart = $db->f("idart"); +} + +/* Get idcatart */ +if (0 != $idart && 0 != $idcat) +{ + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idcat = '".Contenido_Security::toInteger($idcat)."'"; + + $db->query($sql); + $db->next_record(); + + $idcatart = $db->f("idcatart"); +} + +$idartlang = getArtLang($idart, $lang); + +if ($idartlang === false) +{ + header($errsite); + exit; +} + +/* + * removed database roundtrip for checking + * if cache is enabled + * CON-115 + * 2008-06-25 Thorsten Granz + */ +// START: concache, murat purc +if ($cfg["cache"]["disable"] != '1') { + cInclude('frontend', 'includes/concache.php'); + $oCacheHandler = new cConCacheHandler($GLOBALS['cfgConCache'], $db); + $oCacheHandler->start($iStartTime); // $iStartTime ist optional und ist die startzeit des scriptes, z. b. am anfang von fron_content.php +} +// END: concache + + +############################################## +# BACKEND / FRONTEND EDITING +############################################## + +/** + * If user has contenido-backend rights. + * $contenido <==> the cotenido backend session as http global + * In Backend: e.g. contenido/index.php?contenido=dac651142d6a6076247d3afe58c8f8f2 + * Can also be set via front_content.php?contenido=dac651142d6a6076247d3afe58c8f8f2 + * + * Note: In backend the file contenido/external/backendedit/front_content.php is included! + * The reason is to avoid cross-site scripting errors in the backend, if the backend domain differs from + * the frontend domain. + */ +if ($contenido) +{ + $perm->load_permissions(); + + /* Change mode edit / view */ + if (isset ($changeview)) + { + $sess->register("view"); + $view = $changeview; + } + + $col = new InUseCollection; + + if ($overrideid != "" && $overridetype != "") + { + $col->removeItemMarks($overridetype, $overrideid); + } + /* Remove all own marks */ + $col->removeSessionMarks($sess->id); + /* If the override flag is set, override a specific InUseItem */ + + list ($inUse, $message) = $col->checkAndMark("article", $idartlang, true, i18n("Article is in use by %s (%s)"), true, $cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?changeview=edit&action=con_editart&idartlang=$idartlang&type=$type&typenr=$typenr&idart=$idart&idcat=$idcat&idcatart=$idcatart&client=$client&lang=$lang"); + + $sHtmlInUse = ''; + $sHtmlInUseMessage = ''; + if ($inUse == true) + { + $disabled = 'disabled="disabled"'; + $sHtmlInUseCss = ''; + $sHtmlInUseMessage = $message; + } + + $sql = "SELECT locked FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + $locked = $db->f("locked"); + if ($locked == 1) + { + $inUse = true; + $disabled = 'disabled="disabled"'; + } + + // CEC to check if the user has permission to edit articles in this category + CEC_Hook::setBreakCondition(false, true); // break at "false", default value "true" + $allow = CEC_Hook::executeWhileBreakCondition( + 'Contenido.Frontend.AllowEdit', $lang, $idcat, $idart, $auth->auth['uid'] + ); + + if ($perm->have_perm_area_action_item("con_editcontent", "con_editart", $idcat) && $inUse == false && $allow == true) + { + /* Create buttons for editing */ + $edit_preview = ''; + + if ($view == "edit") + { + $edit_preview = ' + + + '; + } + else + { + $edit_preview = ' + + + '; + } + + /* Display articles */ + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT idart, is_start FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' ORDER BY idart"; + + $db->query($sql); + } + else + { + $sql = "SELECT idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' ORDER BY idart"; + + $db->query($sql); + } + + $a = 1; + + $edit_preview .= '
+ Preview + + Preview +
+ Preview + + Edit +
Articles in category:
'; + + while ($db->next_record() && ($db->affected_rows() != 1)) + { + + $class = "font-family:'Verdana'; font-size:10; color:#000000; text-decoration: underline; font-weight:normal"; + if (!isset ($idart)) + { + if (isStartArticle(getArtLang($idart, $lang), $idcat, $lang)) + { + $class = "font-family: verdana; font-size:10; color:#000000; text-decoration: underline ;font-weight:bold"; + } + } + else + { + if ($idart == $db->f("idart")) + { + $class = "font-family: verdana; font-size:10; color:#000000; text-decoration: underline; font-weight:bold"; + } + } + + $edit_preview .= "url("front_content.php?idart=".$db->f("idart")."&idcat=$idcat")."\">$a "; + $a ++; + } + + $edit_preview .= '
'; + + } + +} // end if $contenido + + +/* If mode is 'edit' and user has permission to edit articles in the current category */ +if ($inUse == false && $allow == true && $view == "edit" && ($perm->have_perm_area_action_item("con_editcontent", "con_editart", $idcat))) +{ + cInclude("includes", "functions.tpl.php"); + cInclude("includes", "functions.con.php"); + include ($cfg["path"]["contenido"].$cfg["path"]["includes"]."include.con_editcontent.php"); +} +else +{ + +############################################## +# FRONTEND VIEW +############################################## + + /* Mark submenuitem 'Preview' in the Contenido Backend (Area: Contenido --> Articles --> Preview) */ + if ($contenido) + { + $markscript = markSubMenuItem(4, true); + } + + unset($edit); // disable editmode + + /* 'mode' is preview (Area: Contenido --> Articles --> Preview) or article displayed in the front-end */ + $sql = "SELECT + createcode + FROM + ".$cfg["tab"]["cat_art"]." + WHERE + idcat = '".Contenido_Security::toInteger($idcat)."' AND + idart = '".Contenido_Security::toInteger($idart)."'"; + + $db->query($sql); + $db->next_record(); + + ############################################## + # code generation + ############################################## + + /* Check if code is expired, create new code if needed */ + if($db->f("createcode") == 0 && $force == 0 && $cfg['dceModEdit']['use'] !== true && $cfg['dceLayEdit']['use'] !== true) { + $sql = "SELECT code FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + if ($db->num_rows() == 0) + { + /* Include here for performance reasons */ + cInclude("includes", "functions.tpl.php"); + + conGenerateCode($idcat, $idart, $lang, $client); + + $sql = "SELECT code FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } + + if ($db->next_record()) + { + $code = stripslashes($db->f("code")); + } + else + { + if ($contenido) + $code = "echo \"No code available.\";"; + else + { + if ($error == 1) + { + echo "Fatal error: Could not display error page. Error to display was: 'No code available'"; + } + else + { + header($errsite); + exit; + } + } + } + } else { + $sql = "DELETE FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); + + cInclude("includes", "functions.con.php"); + cInclude("includes", "functions.tpl.php"); + cInclude("includes", "functions.mod.php"); + + conGenerateCode($idcat, $idart, $lang, $client); + + $sql = "SELECT code FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + + $db->query($sql); + $db->next_record(); + + $code = stripslashes($db->f("code")); + } + + /* Add mark Script to code if user is in the backend */ + $code = preg_replace("/<\/head>/i", "$markscript\n", $code, 1); + + /* If article is in use, display notification */ + if ($sHtmlInUseCss && $sHtmlInUseMessage) { + $code = preg_replace("/<\/head>/i", "$sHtmlInUseCss\n", $code, 1); + $code = preg_replace("/(]*)>/i", "\${1}> \n $sHtmlInUseMessage", $code, 1); + } + + /* Check if category is public */ + $sql = "SELECT public FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + + $db->query($sql); + $db->next_record(); + + $public = $db->f("public"); + + ############################################## + # protected categories + ############################################## + if ($public == 0) + { + if ($auth->auth["uid"] == "nobody") + { + $sql = "SELECT user_id, value FROM ".$cfg["tab"]["user_prop"]." WHERE type='frontend' and name='allowed_ip'"; + $db->query($sql); + + while ($db->next_record()) + { + $user_id = $db->f("user_id"); + + $range = urldecode($db->f("value")); + $slash = strpos($range, "/"); + + if ($slash == false) + { + $netmask = "255.255.255.255"; + $network = $range; + } + else + { + $network = substr($range, 0, $slash); + $netmask = substr($range, $slash +1, strlen($range) - $slash -1); + } + + if (IP_match($network, $netmask, $_SERVER["REMOTE_ADDR"])) + { + $sql = "SELECT idright + FROM ".$cfg["tab"]["rights"]." AS A, + ".$cfg["tab"]["actions"]." AS B, + ".$cfg["tab"]["area"]." AS C + WHERE B.name = 'front_allow' AND C.name = 'str' AND A.user_id = '".Contenido_Security::escapeDB($user_id, $db2)."' AND A.idcat = '".Contenido_Security::toInteger($idcat)."' + AND A.idarea = C.idarea AND B.idaction = A.idaction"; + + $db2 = new DB_Contenido; + $db2->query($sql); + + if ($db2->num_rows() > 0) + { + $auth->auth["uid"] = $user_id; + $validated = 1; + } + } + } + if ($validated != 1) + { + // CEC to check category access + CEC_Hook::setBreakCondition(true, false); // break at "true", default value "false" + $allow = CEC_Hook::executeWhileBreakCondition( + 'Contenido.Frontend.CategoryAccess', $lang, $idcat, $auth->auth['uid'] + ); + $auth->login_if(!$allow); + } + } + else + { + // CEC to check category access + CEC_Hook::setBreakCondition(true, false); // break at "true", default value "false" + $allow = CEC_Hook::executeWhileBreakCondition( + 'Contenido.Frontend.CategoryAccess', $lang, $idcat, $auth->auth['uid'] + ); + + /* + added 2008-11-18 Timo Trautmann + in backendeditmode also check if logged in backenduser has permission to view preview of page + */ + if ($allow == false && $contenido && $perm->have_perm_area_action_item("con_editcontent", "con_editart", $idcat)) { + $allow = true; + } + + if (!$allow) + { + header($errsite); + exit; + } + } + } + + ############################################## + # statistic + ############################################## + $oStatCol = new cApiStatCollection(); + $oStatCol->trackView($idcatart); + + /* + * Check if an article is start article of the category + */ + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT is_start FROM ".$cfg["tab"]["cat_art"]." WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); + $db->next_record(); + $isstart = $db->f("is_start"); + } + else + { + $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + if ($db->f("idartlang") == $idartlang) + { + $isstart = 1; + } + else + { + $isstart = 0; + } + } + + ############################################## + # time management + ############################################## + $sql = "SELECT timemgmt FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + + if (($db->f("timemgmt") == "1") && ($isstart != 1)) + { + $sql = "SELECT online, redirect, redirect_url FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."' + AND NOW() > datestart AND NOW() < dateend"; + } + else + { + $sql = "SELECT online, redirect, redirect_url FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + } + + $db->query($sql); + $db->next_record(); + + $online = $db->f("online"); + $redirect = $db->f("redirect"); + $redirect_url = $db->f("redirect_url"); + + @ eval ("\$"."redirect_url = \"$redirect_url\";"); // transform variables + + $insert_base = getEffectiveSetting('generator', 'basehref', "true"); + + /* + * generate base url + */ + if ($insert_base == "true") + { + $is_XHTML = getEffectiveSetting('generator', 'xhtml', "false"); + + $str_base_uri = $cfgClient[$client]["path"]["htmlpath"]; + + // CEC for base href generation + $str_base_uri = CEC_Hook::executeAndReturn('Contenido.Frontend.BaseHrefGeneration', $str_base_uri); + + if ($is_XHTML == "true") { + $baseCode = ''; + } else { + $baseCode = ''; + } + + $code = str_ireplace_once("", "\n".$baseCode, $code); + } + + /* + * Handle online (offline) articles + */ + if ($online) + { + if ($redirect == '1' && $redirect_url != '') + { + page_close(); + /* + * Redirect to the URL defined in article properties + */ + $oUrl = Contenido_Url::getInstance(); + if ($oUrl->isIdentifiableFrontContentUrl($redirect_url)) { + // perform urlbuilding only for identified internal urls + $aUrl = $oUrl->parse($redirect_url); + if (!isset($aUrl['params']['lang'])) { + $aUrl['params']['lang'] = $lang; + } + $redirect_url = $oUrl->buildRedirect($aUrl['params']); + } + header("Location: $redirect_url"); + exit; + } + else + { + if ($cfg["debug"]["codeoutput"]) + { + echo ""; + } + + /* + * That's it! The code of an article will be evaluated. + * The code of an article is basically a PHP script which is cached in the database. + * Layout and Modules are merged depending on the Container definitions of the Template. + */ + + $aExclude = explode(',', getEffectiveSetting('frontend.no_outputbuffer', 'idart', '')); + if (in_array(Contenido_Security::toInteger($idart), $aExclude)) { + eval ("?>\n".$code."\n\n".$code."\n\n".$code."\nend(); + #echo $oCacheHandler->getInfo(); +} +// END: concache + +/* + * configuration settings after the site is displayed. + */ +if (file_exists("config.after.php")) +{ + @ include ("config.after.php"); +} + +if (isset ($savedlang)) +{ + $lang = $savedlang; +} + +$db->disconnect(); +page_close(); +?> \ No newline at end of file diff --git a/cms/front_crcloginform.inc.php b/cms/front_crcloginform.inc.php new file mode 100644 index 0000000..1dd27a8 --- /dev/null +++ b/cms/front_crcloginform.inc.php @@ -0,0 +1,153 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * $Id: front_crcloginform.inc.php 450 2016-07-20 11:11:12Z oldperl $: + */ + +/** + * security check + */ +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +global $cfg, $idcat, $idart, $idcatart, $lang, $client, $username, $encoding; + +$err_catart = trim(getEffectiveSetting("login_error_page", "idcatart", "")); +$err_cat = trim(getEffectiveSetting("login_error_page", "idcat", "")); +$err_art = trim(getEffectiveSetting("login_error_page", "idart", "")); + +$oUrl = Contenido_Url::getInstance(); + +$sClientHtmlPath = $cfgClient[$client]['path']['htmlpath']; + +$sUrl = $sClientHtmlPath . 'front_content.php'; + +$sErrorUrl = $sUrl; +$bRedirect = false; + +if ($err_catart != '') { + $sErrorUrl .= '?idcatart=' . $err_catart . '&lang=' . $lang; + $bRedirect = true; +} elseif ($err_art != '' && $err_cat != '') { + $sErrorUrl .= '?idcat=' . $err_cat . '&idart=' . $err_art . '&lang=' . $lang; + $bRedirect = true; +} elseif ($err_cat != '') { + $sErrorUrl .= '?idcat=' . $err_cat . '&lang=' . $lang; + $bRedirect = true; +} elseif ($err_art != '') { + $sErrorUrl .= '?idart=' . $err_art . '&lang=' . $lang; + $bRedirect = true; +} + +if ($bRedirect) { + $aUrl = $oUrl->parse($sess->url($sErrorUrl)); + $sErrorUrl = $oUrl->buildRedirect($aUrl['params']); + header('Location: ' . $sErrorUrl); + exit(); +} + +if (isset($_GET['return']) || isset($_POST['return'])){ + $aLocator = array('lang=' . (int) $lang); + + if ($idcat > 0) { + $aLocator[] = 'idcat=' . intval($idcat); + } + if ($idart > 0) { + $aLocator[] = 'idart=' . intval($idart); + } + if (isset($_POST['username']) || isset($_GET['username'])){ + $aLocator[] = 'wrongpass=1'; + } + + $sErrorUrl = $sUrl . '?' . implode('&', $aLocator); + $aUrl = $oUrl->parse($sess->url($sErrorUrl)); + $sErrorUrl = $oUrl->buildRedirect($aUrl['params']); + header ('Location: ' . $sErrorUrl); + exit(); +} + +// set form action +$sFormAction = $sess->url($sUrl . '?idcat=' . intval($idcat) . '&lang=' . $lang); +$aUrl = $oUrl->parse($sFormAction); +$sFormAction = $oUrl->build($aUrl['params']); + +// set login input image, use button as fallback +if ( file_exists($cfgClient[$client]['path']['frontend'] . 'images/but_ok.gif') ) { + $sLoginButton = '' . "\n"; +} else { + $sLoginButton = '' . "\n"; +} + +?> + + + + + :: :: :: :: Contenido Login + + + + + +
+
+ + + +
Login
+
+
+
+
+
+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/cms/images/SimpleGallery/ClosePopup.png b/cms/images/SimpleGallery/ClosePopup.png new file mode 100644 index 0000000000000000000000000000000000000000..d3881e4050510e6ede06ccf00baf0a6906275a9e GIT binary patch literal 2704 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 literal 0 HcmV?d00001 diff --git a/cms/images/SimpleGallery/NaviLeftDisabled.png b/cms/images/SimpleGallery/NaviLeftDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..2ffddf96d3eb3d7c6f6f33576ca50f0374ef6955 GIT binary patch literal 1106 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 UMt|TnsXaYC3a#Rw(F z>k4#G!V&XDFdq^EN=0@k6b;*<5vPBpAP{|&6-qvo2`Ly>$`)bqRybu!>p&*+|3d|W zk7x<(1ODyze+otp7OX^(~}#l+%w*i!462Jt#zaU5qp}Cs~w_La8+~=nj6;p_Z%w z7h~4;b|#_sw}8@epTV8!701(~FzJ|zm_|m=p??K<9WHd5Ova)&mwz6b;4LfuJUG~| z_~}#Hblaod!Oh>+!U7u=&FG+nS2y5GGnnEssi#fVnyQA@R15P#t9;Bv(tTl6HY$6* zmcaAR%*;$AiCq35q0*a|$lywQXw@x`lvuL5y86ll-y1 z-t(H8nj#DabKCQs+UCs{xP-xo+RXAULqo$RDjsiC8I+t;SDBPC7@QK;{osMDL z!i-!lce@N8(J0Nz%j@DtM!GlD*FWi5k=j0%T>nnxHkC?U+mkev(HnkwGQr@p=V&9N zG3*y5J ztX{E2jbB<~hlBt{jg0~BYDs(p^k7nzr|qV;^p;P48t(5uppkI@o64BNk`n$S49?rw z=3r-M=lsOPL`zp!S5IA+gAKKC?P`UJ>C!^LIakv!ckR+0!s=hSJ32aAUt3Fz!Qk!} znUqg0E?+x;UhjTKM@M6KcX~#~PgAqAHaE4loV|4i+M=$0CO$r%o^kQbiKWuD%{k>0 zp{4tJ^nci|K^kc#G~BMN)ES#DlOMaLrLDa>`Nj4Dmt|K(|BkwTt0$8=BAy5u`YMvR za-+C-lGhOUZn)`WsPtrhmira=dYeR<%r=!F&#jn7qlu`5pMP`iE%14I;Br;VsZ(2x zcBjS;>t+@g7gMkOGS>cV+W&@`x29=ybaX3+nJRVM@69^s>gw9$>E>pQlOL}P5M|?E zoz{Be*9Y|N*s)_tekoCJj-S%<`=N4TLtP!KzNx7@R=>i_ye%y)?I?I7E4b&5<7=H{ z`qb3aK@NxW)#BT??TxQ1SS%K`ZS|hQ*NpXux78Rt1t%Y+jE+lnrt(h-<;NX`}IZXw!GZjKN~kW|G1i@ zJ`gl@Se+r$Wm*hV{aGv$=9EiqkP2Kb#X7d}*d9sj9NF^F zaG$<`!LYZl@9R1jlc9#gmX>-0{r#zNYLVa1cn?)0*+n3?N1Nqh9?Ro7kKrqIo3!(w zvf^Ut`RweQW8nrqvvwzw%3m3q58s`ipTCNf^7@6g*%vQPl$Dm6pM05zA{BZY?Rr<@ zw|h}bMei7a)M}AKZ2q-Zk#X8t_2)Qn^e7B3lnm6C9O&Gusi|4>$12pf0@NK3R(;e@ z$#yO(DtcH|RduAg)c47^mAZ*P*gZ6+uTY8K)5bf#{?hLHQJKoHj-g?Nm4(F-xhc;q zN5zlqm@j+2Nm1l)nV6fCv(k46p!+7;Q&9P4aS1}9m11GRrenN%aw0KXeNe%;)SKl` ndUZRS9&I+0YJb*kZCeNmm*;?IZJ*^T|LzPY4|;`TNYZ}+S!{y{ literal 0 HcmV?d00001 diff --git a/cms/images/SimpleGallery/PopupImageNaviRight.png b/cms/images/SimpleGallery/PopupImageNaviRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9be9ee5e3464909faa1b52f7ba663987b1a90a89 GIT binary patch literal 2162 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 literal 0 HcmV?d00001 diff --git a/cms/images/basic-pic3.jpg b/cms/images/basic-pic3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8323402fb0e27f4c9c43fddaa22b9808c4711d8 GIT binary patch literal 129079 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� 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 +2)9#Eckx3$|o-b7_v8m*Pk50Wa79Zf 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¿O*(D56_yRe^5ga*X^C}C+s-TUU!du;G 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 B7G?kd literal 0 HcmV?d00001 diff --git a/cms/images/glyphicons-halflings.png b/cms/images/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/cms/images/ico/apple-touch-icon-114-precomposed.png b/cms/images/ico/apple-touch-icon-114-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd92fa5d6b8b70817457f70207c8d25c8081e7b GIT binary patch literal 9686 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 literal 0 HcmV?d00001 diff --git a/cms/images/ico/apple-touch-icon-57-precomposed.png b/cms/images/ico/apple-touch-icon-57-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..17a7748c348b45b2516e835bb9de24ace254f3ec GIT binary patch literal 2752 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 literal 0 HcmV?d00001 diff --git a/cms/images/ico/apple-touch-icon-72-precomposed.png b/cms/images/ico/apple-touch-icon-72-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..da2b86c071de00104ffdeee83a8046efa5cfd957 GIT binary patch literal 5609 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 KhL>vEk^cu)uQz%C literal 0 HcmV?d00001 diff --git a/cms/images/ico/social_icons_sprite.png b/cms/images/ico/social_icons_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..f79efb10eb937527439779905747faa65f76349e GIT binary patch literal 26603 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 mqN4)*>)ro%vq2_9wEqM0zKDvz%!G9S0000 diff --git a/cms/images/logo-small.png b/cms/images/logo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc9dd6651cf84140c6beb93d51b7c38705b868 GIT binary patch literal 3455 zcmbVPX*`ts+qa#va~vaEjHQ2BXJclJrDMztBl|AIm>EpWVrFEl4J9FrwUkI{5oxiF zERlpbw4oA-C`-0ZA=ER@sq;K9&gcK)xj&!#{%zOydwqY`^5RZ&ak7<>RFxDG5|Y8& zVcY~`jNk=|?+|?9al=Ohg9;n#!*-{Ku%ih~vXC{29!v(}sf19n8<{|giR>X;2nmUj zC>}m+A4dlikxn%xY}*)fs0;yGNXTM8he05Qli9#vawvsnslC{APa8-fS!#QmI)WV; zHsmmhT`ZIA9_!>mj14E6k+k<)0WCNv0RffFCIC6q2pS8;vDE&H7bTc)Z-caff0?ku zEw%p^<>TlAw4pP}KvQF|5fKar1K|*32+Rb5Ko|m{U-4wKI3Eg3xNa^QXe2{FS1=18;%~^8>o>SgntKU`_BdC4?ENq8Jk$$ zsjs_zh&zK&3@9&RegnV(Amy%6Z%hFA!e_*#cPh<4)$PdWRHaKJ6GfLymUg(@zo%xm z)hn)O0FDt^^*VOXj{>y|78oTxbse@tBC!t?NRy0M9tjue1j8noQz#pky!w2 z7RD4IaVC3!Y@)DyWtICW$+gWk>(hvcw{3+uq(owK(~u#}$iMHfpeCVPn=9*{RNWRb zt6Nq3CMUK6E6}jo6;eCNm+L%Wy`Z3uQ0AN@C8Cq*qOrG~3&Wci`28;9OZ$eR#dr@k zq+SLJVIR1S>uC&E0Py`GcfYFalZojE*Pp$lzR@HE5^-12I&yYzb`)n>wFd#@i@Yo8 z>Q@=UR1Bvw_7m5*|7qaO;O#$5y*cBCqBYhrSFHwdik+IV{xPN)qvg*4huo z8Fds<*5i%?eOLTtTPF8*K_=Q)kwaRO!!2v8u@@A4-h!2TDs7Z$(V_f^i%DL2ZJxpp zKQ6x_R4zNRMfNxMzL-U-vUj(ge%?a)HJg}k5c=GR>+aQPw-Dm{ z7=a|n7_)^6<AEfa02Qoj6x_1%Z2B6n>~;yMPq(bYr(z>~rf1;dc$}x&zDNB*_TBF> z&Z$!-3#&a6I*F2cZm|XEI#{Xu{qNzM-!Lcs6k8a%FfE;dJg)Z^CVsjL<|Y%J^EybY zr9l#_#^>3&wW|-6q(d&3v_$DH4{SlwTc6SKw6gbl^>jgZtDhkGgLGbMk_1ZP#I+%a8goG;A~ zjSX}!30>yhYN_i2Ftcw>w7Zs zvi#}_>GZD;V1q@!vVpr@hbVEOZ_Z)gd+q88G{54ptNmd4Y?B`5mqsqNa51f-kSHm$ zXQW*8Q)q(Su_eEv>Z%7vZ_hig)VCN1RJ0BNpM)bH-%`QRad*)NB9$F$@t3vWVznvj zhco?*a8r>VNO`bpO(NcWrDUgD#T?b)hFqn%d0B zDuYc~^ubqRjEP}c=4jgM{k_-~_5MPbk;am^v6s}vT|ow0uf>(LW;{Na7bam&bI0Hg zzntwiaRs;~ndvtpkai30?6SS?TZ5#5kocJhP=;srY#do*Kw`v-3{E{d)fkAsdpJk2 z;G2`g8TCi;6DkHhz+1&>8wa}>1lcbKtYK1JkDTMCp)YN(_c^LKWLHW-u=*Ln6O(>1 z__l9IeR|$h^F{IDts&%1(Mz5MI(<#2hF9a&dPbGaB1A7Z={6SK@VI2(u-sgN9LXGi z-*7?cuxjs@cw2%_!Fw@z^U@ds%;+`zDa&%r&N#%XC;Vap+7hUF71Ds| zfSULIwgsiVVV`Zf70ZWj>9@(}Rk(j5ca42h%zXweh22ZYt?PT}<@Sga|K>w6XE|WG zoYzv-b$HpVKfTVdmKSP&zF{jPd{de|Q|av(8nFSxQhDJFTX>7b-U7(?8eeMa#H6)gv2b zX=&T~vB$(qp^Q`OIhXi+bisDl(xJ#xtOBQ5bf&5GpHfKQm5~7Zikw%+%xbU198T6X zYOiqR`FEwHqZh{O6g*@tlVT3!f2&t@tD0`n0OnAYW!z%EW4uZ#4GTVJXFZ`Rwa{DM z-u~!W3FFS_zjWi+e~8b(<>HU&v7a0C=%ZeIrG4MpR31XtMU<&3Kk8z9&npf;elB2g zoXqb|^O!dq(_Bn$+F6|2eV;0vk*`{^_gRsIK52H6>dE(5U%C5Ho<8Cn?`XsKuk(I- zZhvRYXP^7|ZbxMQDCEtlI?UtH-myow%7S*{gmd(MJ#|De6LN0g;DTLBg@a7u=ZN&a zXO|099%#HYr53CCaLi6t6Za+NeAkB^Cy^gNH7Fw5&m>`S0DY|$rxOch@jU4h!#G=e z-szcLD+FjWl}=XRXvPeFxq>>R$kObXLt1&)*yDpq-UpeZlGDp6!mPE@HMidz_S8u? z7LC=f_SY-jv6l%MQqbgl(L_E6ixi+vIi;Jgll$2yze}-JY3Q3m!`z!+KduDMYmR-} hP|#UF3cM!;7E+Dr&}xlpuG{`4!egB<)##w){{ijN_IdyS literal 0 HcmV?d00001 diff --git a/cms/images/logo.png b/cms/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..edcf5ec63eefc087319bc372bc7b33e858bc0bdc GIT binary patch literal 10376 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 Zf|%uCf?Wv(;IDrJ6=YRqK1-Q}{0~sER + * + * $Id: Contenido_NavMain_Util.class.php 450 2016-07-20 11:11:12Z oldperl $ + */ + +class Contenido_NavMain_Util { + /** + * Recursive Loop over all (sub)categories. + * Each level will be assigned a css class navmainStandardLevel_x + * + * @param Contenido_Category $oCategory + * @param Contenido_FrontendNavigation $oFrontendNavigation + * @param Template $oTpl + * @param string $sUrlStyle + * @param array $aCfg + * @param int $iLang + * @param array $aLevelInfo Information for marking active cat per levels + * @param array $aDepthInfo Info on level depth / where to stop. Format: array(iCurrentLoopCount, iMaxLoopCount) + * @return void + */ + public static function loopCats(Contenido_Category $oCategory, Contenido_FrontendNavigation $oFrontendNavigation, Template $oTpl, array $aCfg, $iLang, array $aLevelInfo, $iCurrentPageIdcat, array $aDepthInfo = array()) { + $aDepthInfo[0] = isset($aDepthInfo[0]) ? $aDepthInfo[0] + 1 : 1; + $aDepthInfo[1] = isset($aDepthInfo[1]) ? $aDepthInfo[1] : 1; + // display current item + $iItemLevel = $oFrontendNavigation->getLevel($oCategory->getIdCat()); + if (!isset($aLevelInfo[$oCategory->getIdCat()])) { + $aLevelInfo[$oCategory->getIdCat()] = array(); + } + $oCurrentSubcategories = $oFrontendNavigation->getSubCategories($oCategory->getIdCat()); + $aLevelInfo[$oCategory->getIdCat()]['has_children'] = $oCurrentSubcategories->count() > 0; + $aLevelInfo[$oCategory->getIdCat()]['first_child_item'] = -1; + $aLevelInfo[$oCategory->getIdCat()]['last_child_item'] = -1; + $bMarkActive = $oCategory->getIdCat() == $iCurrentPageIdcat || $oFrontendNavigation->isInPathToRoot($oCategory->getIdCat(), $iCurrentPageIdcat); + if ($oCurrentSubcategories->count() > 0) { + $aLevelInfo[$oCategory->getIdCat()]['first_child_item'] = $oCurrentSubcategories[0]->getIdCat(); + $aLevelInfo[$oCategory->getIdCat()]['last_child_item'] = $oCurrentSubcategories[$oCurrentSubcategories->count()-1]->getIdCat(); + } + // this is just for sample client - modify to your needs! + if (($aCfg['url_builder']['name'] == 'front_content') || ($aCfg['url_builder']['name'] == 'MR')) { + $aParams = array('lang' => $iLang, 'idcat' => $oCategory->getIdCat()); + } else { + $aParams = array('a' => $oCategory->getIdCat(), + 'idcat' => $oCategory->getIdCat(), // needed to build category path + 'lang' => $iLang, // needed to build category path + 'level' => 1); // needed to build category path + } + // fill template with values + $oTpl->set('d', 'name', $oCategory->getCategoryLanguage()->getName()); + $oTpl->set('d', 'css_level', $iItemLevel); + $oTpl->set('d', 'css_first_item', ($aLevelInfo[$oCategory->getIdParent()]['first_child_item'] == $oCategory->getIdCat() ? ' first' : '')); + $oTpl->set('d', 'css_last_item', ($aLevelInfo[$oCategory->getIdParent()]['last_child_item'] == $oCategory->getIdCat() ? ' last' : '')); + $oTpl->set('d', 'css_active_item', ($bMarkActive === true ? ' active' : '')); + try { + $oTpl->set('d', 'url', Contenido_Url::getInstance()->build($aParams)); + } catch (InvalidArgumentException $e) { + $oTpl->set('d', 'url', '#'); + } + $oTpl->next(); + // continue until max level depth + if ($aDepthInfo[1] > $aDepthInfo[0]) { + // check if current item has sub-items to be displayed + $bShowFollowUps = ($oCategory->getIdCat() == $iCurrentPageIdcat || $oFrontendNavigation->isInPathToRoot($oCategory->getIdCat(), $iCurrentPageIdcat)) + ? true : false; + if ($bShowFollowUps === true && $oCurrentSubcategories->count() > 0) { + $oSubCategories = $oCurrentSubcategories; + foreach ($oSubCategories as $oSubCategory) { + self::loopCats($oSubCategory, $oFrontendNavigation, $oTpl, $aCfg, $iLang, $aLevelInfo, $iCurrentPageIdcat, $aDepthInfo); + } + } + } + } +} +?> \ No newline at end of file diff --git a/cms/includes/Util/Modules/Contenido_Sitemap_Util.class.php b/cms/includes/Util/Modules/Contenido_Sitemap_Util.class.php new file mode 100644 index 0000000..3fc3b1b --- /dev/null +++ b/cms/includes/Util/Modules/Contenido_Sitemap_Util.class.php @@ -0,0 +1,66 @@ + + * + * $Id: Contenido_Sitemap_Util.class.php 450 2016-07-20 11:11:12Z oldperl $ + */ +class Contenido_Sitemap_Util { + /** + * Recursive Loop over all (sub)categories. + * Each level will be assigned a css class sitemapStandardLevel_x + * + * @param Contenido_Category $oCategory + * @param Contenido_FrontendNavigation $oFrontendNavigation + * @param Template $oTpl + * @param string $sUrlStyle + * @param array $aCfg + * @param int $iLang + * @param array $aDepthInfo Info on level depth / where to stop. Format: array(iCurrentLoopCount, iMaxLoopCount) + * @return void + */ + public static function loopCats(Contenido_Category $oCategory, Contenido_FrontendNavigation $oFrontendNavigation, Template $oTpl, $sUrlStyle, array $aCfg, $iLang, array $aDepthInfo = array()) { + $aDepthInfo[0] = isset($aDepthInfo[0]) ? $aDepthInfo[0] + 1 : 1; + $aDepthInfo[1] = isset($aDepthInfo[1]) ? $aDepthInfo[1] : 1; + // display current item + $iItemLevel = $oFrontendNavigation->getLevel($oCategory->getIdCat()); + // this is just for sample client - modify to your needs! + if (($aCfg['url_builder']['name'] == 'front_content') || ($aCfg['url_builder']['name'] == 'MR')) { + $aParams = array('lang' => $iLang, 'idcat' => $oCategory->getIdCat()); + } else { + $aParams = array('a' => $oCategory->getIdCat(), + 'idcat' => $oCategory->getIdCat(), // needed to build category path + 'lang' => $iLang, // needed to build category path + 'level' => 1); // needed to build category path + } + // fill template with values + $oTpl->set('d', 'name', $oCategory->getCategoryLanguage()->getName()); + $oTpl->set('d', 'css_level', $iItemLevel); + try { + $oTpl->set('d', 'url', Contenido_Url::getInstance()->build($aParams)); + } catch (InvalidArgumentException $e) { + $oTpl->set('d', 'url', '#'); + } + $oTpl->next(); + // continue until max level depth + if ($aDepthInfo[1] > $aDepthInfo[0]) { + // check if current item has sub-items + $oSubCategories = $oFrontendNavigation->getSubCategories($oCategory->getIdCat()); + if ($oSubCategories->count() > 0) { + foreach ($oSubCategories as $oSubCategory) { + self::loopCats($oSubCategory, $oFrontendNavigation, $oTpl, $sUrlStyle, $aCfg, $iLang, $aDepthInfo); + } + } + } + } +} +?> \ No newline at end of file diff --git a/cms/includes/class.concache.php b/cms/includes/class.concache.php new file mode 100644 index 0000000..72cadcc --- /dev/null +++ b/cms/includes/class.concache.php @@ -0,0 +1,531 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * $Id: class.concache.php 450 2016-07-20 11:11:12Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +class cConCache{ + + /** + * PEAR Cache Output Object + * + * @var obj $_oPearCache + */ + var $_oPearCache; + + /** + * Flag 2 activate caching. + * + * @var bool $_bEnableCaching + */ + var $_bEnableCaching = false; + + /** + * Flag for output of debug informations. + * + * @var bool $_bDebug + */ + var $_bDebug = false; + + /** + * Flag 2 print html comment including some debug informations. + * + * @var bool $_bHtmlComment + */ + var $_bHtmlComment = false; + + /** + * Start time of caching. + * + * @var int $_iStartTime + */ + var $_iStartTime; + + /** + * Option array 4 generating cache identifier (e. g. $_GET,$_POST, $_COOKIE, ...). + * + * @var array _aIDOptions + */ + var $_aIDOptions; + + /** + * Option array 4 pear caching. + * + * @var array $_aIDOptions + */ + var $_aCacheOptions; + + /** + * Handler array 2 store code, beeing executed on some events. + * We have actually two events: + * - 'beforeoutput': code to execute before doing the output + * - 'afteroutput' code to execute after output + * + * @var array $_aEventCode + */ + var $_aEventCode; + + /** + * Unique identifier for caching. + * + * @var string $_sID + */ + var $_sID; + + /** + * Directory 2 store cached output. + * + * @var string $_sDir + */ + var $_sDir = 'cache/'; + + /** + * Subdirectory 2 store cached output. + * + * @var string $_sGroup + */ + var $_sGroup = 'default'; + + /** + * Substring 2 add as prefix to cache-filename. + * + * @var string $_sPrefix + */ + var $_sPrefix = 'cache_'; + + /** + * Default lifetime of cached files. + * + * @var int $_iLifetime + */ + var $_iLifetime = 3600; + + /** + * Used 2 store debug message. + * + * @var string $_sDebugMsg + */ + var $_sDebugMsg = ''; + + /** + * HTML code template used for debug message. + * + * @var string $_sDebugTpl + */ + var $_sDebugTpl = '

'; + + /** + * HTML comment template used for generating some debug infos. + * + * @var string $_sDebugTpl + */ + var $_sHtmlCommentTpl = ' + +'; + + /** + * Constructor of cConCache + * + * @param string $cachedir Directory 2 cache files + * @param string $cachegroup Subdirectory 2 cache files + * @param string $cacheprefix Prefixname 2 add 2 cached files + */ + function cConCache($cachedir=null, $cachegroup=null, $cacheprefix=null){ + // wherever you want the cache files + if(!is_null($cachedir)){ + $this->_sDir = $cachedir; + } + + // subdirectory where you want the cache files + if(!is_null($cachegroup)){ + $this->_sGroup = $cachegroup; + } + + // optional a filename prefix + if(!is_null($cacheprefix)){ + $this->_sPrefix = $cacheprefix; + } + + // config options are passed to the cache as an array + $this->_aCacheOptions = array('cache_dir' => $this->_sDir, 'filename_prefix' => $this->_sPrefix); + + } // function cConCache() + + + /** + * Set/Get the flag 2 enable caching. + * + * @param bool $enable True 2 enable chaching or false + * @return mixed Enable flag or void + */ + function enable($enable=null){ + if(!is_null($enable) && is_bool($enable)){ + $this->_bEnableCaching = $enable; + } else { + return $this->_bEnableCaching; + } + } // function enable() + + + /** + * Set/Get the flag 2 debug cache object (prints out miss/hit state with execution time). + * + * @param bool $debug True 2 activate debugging or false. + * @return mixed Debug flag or void + */ + function debug($debug){ + if(!is_null($debug) && is_bool($debug)){ + $this->_bDebug = $debug; + } else { + return $this->_bDebug; + } + } // function debug() + + + /** + * Set/Get flag 2 print out cache info as html comment. + * + * @param bool $htmlcomment True debugging or false. + * @return void Htmlcomment flag or void + */ + function htmlComment($htmlcomment){ + if(!is_null($htmlcomment) && is_bool($htmlcomment)){ + $this->_bHtmlComment = $htmlcomment; + } else { + return $this->_bHtmlComment; + } + } // function htmlComment() + + + /** + * Set/Get caching lifetime in seconds. + * + * @param int $seconds New Lifetime in seconds + * @return mixed Actual lifetime or void + */ + function lifetime($seconds=null){ + if ($seconds != null && is_numeric($seconds) && $seconds > 0) { + $this->_iLifetime = $seconds; + } else { + return $this->_iLifetime; + } + } // function lifetime() + + + /** + * Set/Get template to use on printing the chache info. + * + * @param string $template Template string including the '%s' format definition. + * @return void + */ + function infoTemplate($template){ + $this->_sDebugTpl = $template; + } // function infoTemplate() + + + /** + * Add option 4 caching (e. g. $_GET,$_POST, $_COOKIE, ...). Used 2 generate the id for caching. + * + * @param string $name Name of option + * @param string $option Value of option (any variable) + * @return void + */ + function addOption($name, $option){ + $this->_aIDOptions[$name] = $option; + } // function addOption() + + + /** + * Returns information cache hit/miss and execution time if caching is enabled. + * + * @return string Information about cache if caching is enabled, otherwhise nothing. + */ + function getInfo(){ + if(!$this->_bEnableCaching){ return; } + return $this->_sDebugMsg; + } // function getInfo() + + + /** + * Handles PEAR caching. The script will be terminated by calling die(), if any cached + * content is found. + * + * @param int $iPageStartTime Optional start time, e. g. start time of main script + * @return void + */ + function start($iPageStartTime=null){ + if(!$this->_bEnableCaching){ return; } + + $this->_iStartTime = $this->_getMicroTime(); + + // set cache object and unique id + $this->_initPEARCache(); + + // check if it's cached and start the output buffering if neccessary + if ($content = $this->_oPearCache->start($this->_sID, $this->_sGroup)) { + + //raise beforeoutput event + $this->_raiseEvent('beforeoutput'); + + $iEndTime = $this->_getMicroTime(); + if ($this->_bHtmlComment) { + $time = sprintf("%2.4f", $iEndTime - $this->_iStartTime); + $exp = date('Y-m-d H:i:s', $this->_oPearCache->container->expires); + $content .= sprintf($this->_sHtmlCommentTpl, 'HIT', $time.' sec.', $exp); + if ($iPageStartTime != null && is_numeric($iPageStartTime)) { + $content .= ''; + } + } + + if ($this->_bDebug) { + $info = sprintf("HIT: %2.4f sec.", $iEndTime - $this->_iStartTime); + $info = sprintf($this->_sDebugTpl, $info); + $content = str_ireplace('', $info."\n", $content); + } + + echo $content; + + //raise afteroutput event + $this->_raiseEvent('afteroutput'); + + die(); + } + } // function start() + + + /** + * Handles ending of PEAR caching. + * + * @return void + */ + function end(){ + if (!$this->_bEnableCaching){ return; } + + // this might go into your auto_append file. store the data into the cache, default lifetime is set in $this->_iLifetime + $this->_oPearCache->endPrint($this->_iLifetime, __FILE__ . ' ' . filemtime(__FILE__)); + + if ($this->_bDebug) { + $this->_sDebugMsg .= "\n".sprintf("MISS: %2.4f sec.\n", $this->_getMicroTime() - $this->_iStartTime); + $this->_sDebugMsg = sprintf($this->_sDebugTpl, $this->_sDebugMsg); + } + } // function end() + + + /** + * Removes any cached content if exists. + * This is nesessary to delete cached articles, if they are changed on backend. + * + * @return void + */ + function removeFromCache(){ + // set cache object and unique id + $this->_initPEARCache(); + $bExists = $this->_oPearCache->isCached($this->_sID, $this->_sGroup); + if ($bExists) { + $this->_oPearCache->remove($this->_sID, $this->_sGroup); + } + } // function removeFromCache() + + + /* + * Creates one-time a instance of PEAR cache output object and also the unique id, + * if propery $this->_oPearCache is not set. + * + * @return void + * @access private + */ + function _initPEARCache(){ + if (is_object($this->_oPearCache)) { + return; + } + + // create a output cache object mode - file storage + cInclude('pear', 'Cache/Output.php'); + $this->_oPearCache = new Cache_Output('file', $this->_aCacheOptions); + + // generate an ID from whatever might influence the script behavoiur + $this->_sID = $this->_oPearCache->generateID($this->_aIDOptions); + } // function _initPEARCache() + + + /** + * Raises any defined event code by using eval(). + * + * @param string $name Name of event 2 raise + * @return void + * @access private + */ + function _raiseEvent($name){ + // check if event exists, get out if not + if (!isset($this->_aEventCode[$name]) && !is_array($this->_aEventCode[$name])) { + return; + } + + // loop array and execute each defined php-code + foreach ($this->_aEventCode[$name] as $code) { + eval($code); + } + + } // function _raiseEvent() + + + /** + * Returns microtime (Unix-Timestamp), used to calculate time of execution. + * + * @return float Timestamp + * @access private + */ + function _getMicroTime(){ + $mtime = explode(' ', microtime()); + $mtime = $mtime[1] + $mtime[0]; + return $mtime; + } // function _getMicroTime() + +} // class cConCache + + + +/** +* @class cConCacheHandler +* @brief Class cConCacheHandler. This is used to set configuration +* and to manage caching output +* @version 0.9 +* @date 07.07.2006 +* @author Murat Purc +* @copyright � Murat Purc 2006 +*/ +class cConCacheHandler extends cConCache { + + /** + * Constructor of cConCacheHandler. + * Does some checks and sets the configuration of cache object. + * + * @param array $aConf Configuration of caching as follows: + * - $a['excludecontenido'] bool. don't cache output, if we have a contenido variable, + * e. g. on calling frontend preview from backend + * - $a['enable'] bool. activate caching of frontend output + * - $a['debug'] bool. compose debuginfo (hit/miss and execution time of caching) + * - $a['infotemplate'] string. debug information template + * - $a['htmlcomment'] bool. add a html comment including several debug messages to output + * - $a['lifetime'] int. lifetime in seconds 2 cache output + * - $a['cachedir'] string. directory where cached content is 2 store. + * - $a['cachegroup'] string. cache group, will be a subdirectory inside cachedir + * - $a['cacheprefix'] string. add prefix 2 stored filenames + * - $a['idoptions'] array. several variables 2 create a unique id, if the output depends + * on them. e. g. array('uri'=>$_SERVER['REQUEST_URI'],'post'=>$_POST,'get'=>$_GET); + * @param obj $db Reference 2 Contenido database object + * @param int $iCreateCode Flag of createcode state from table con_cat_art + */ + function cConCacheHandler($aConf, &$db, $iCreateCode=null) { + + // check if caching is allowed on contenido variable + if ($aConf['excludecontenido'] == true) { + if (isset($GLOBALS['contenido'])) { + // contenido variable exists, set state and get out here + $this->_bEnableCaching = false; + return; + } + } + + // set enable state of caching + if (is_bool($aConf['enable'])) { + $this->_bEnableCaching = $aConf['enable']; + } + if ($this->_bEnableCaching == false) { + return; + } + + // check if current article shouldn't be cached (by stese) + $sExcludeIdarts = getEffectiveSetting('cache', 'excludeidarts', false); + if ($sExcludeIdarts && strlen($sExcludeIdarts)>0) { + $sExcludeIdarts = preg_replace("/[^0-9,]/", '', $sExcludeIdarts); + $aExcludeIdart = explode(',', $sExcludeIdarts); + if (in_array($GLOBALS['idart'], $aExcludeIdart)) { + $this->_bEnableCaching = false; + return; + } + } + + $this->_oDB = $db; + + // set caching configuration + parent::cConCache($aConf['cachedir'], $aConf['cachegroup']); + $this->debug($aConf['debug']); + $this->htmlComment($aConf['htmlcomment']); + $this->lifetime($aConf['lifetime']); + $this->infoTemplate($aConf['infotemplate']); + foreach ($aConf['idoptions'] as $name => $var) { + $this->addOption($name, $var); + } + + if (is_array($aConf['raiseonevent'])) { + $this->_aEventCode = $aConf['raiseonevent']; + } + + // check, if code is to create + $this->_bEnableCaching = !$this->_isCode2Create($iCreateCode); + if ($this->_bEnableCaching == false) { + $this->removeFromCache(); + } + + } // function cConCacheHandler() + + + /** + * Checks, if the create code flag is set. Output will be loaded from cache, if no code is 2 create. + * It also checks the state of global variable $force. + * + * @param mixed $iCreateCode State of create code (0 or 1). The state will be loaded from database if value is "null" + * @return bool True if code is to create, otherwhise false. + * @access private + */ + function _isCode2Create($iCreateCode){ + if ($this->_bEnableCaching == false) { + return; + } + + // check content of global variable $force, get out if is's set to '1' + if (isset($GLOBALS['force']) && is_numeric($GLOBALS['force']) && $GLOBALS['force'] == 1) { + return true; + } + + if (is_null($iCreateCode)) { + // check if code is expired + + $oApiCatArtColl = new cApiCategoryArticleCollection('idart="'.$GLOBALS['idart'].'" AND idcat="'.$GLOBALS['idcat'].'"'); + if ($oApiCatArt = $oApiCatArtColl->next()) { + $iCreateCode = $oApiCatArt->get('createcode'); + unset($oApiCatArt); + } + unset($oApiCatArtColl); + } + + return ($iCreateCode == 1) ? true : false; + } // function _isCode2Create() + + +} // class cConCacheHandler + +?> \ No newline at end of file diff --git a/cms/includes/class.input.helper.php b/cms/includes/class.input.helper.php new file mode 100644 index 0000000..fc7b816 --- /dev/null +++ b/cms/includes/class.input.helper.php @@ -0,0 +1,573 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * $Id: class.input.helper.php 450 2016-07-20 11:11:12Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// Select box with additional functions for category and article selection +class cHTMLInputSelectElement extends cHTMLSelectElement +{ + /** + * Constructor. Creates an HTML select field (aka "DropDown"). + * + * @param string $sName Name of the element + * @param int $iWidth Width of the select element + * @param string $sID ID of the element + * @param string $bDisabled Item disabled flag (non-empty to set disabled) + * @param int $iTabIndex Tab index for form elements + * @param string $sAccesskey Key to access the field + * + * @return none + **/ + function cHTMLInputSelectElement ($sName, $iWidth = "", $sID = "", $bDisabled = false, $iTabIndex = null, $sAccessKey = "") + { + cHTMLSelectElement :: __construct($sName, $iWidth, $sID, $bDisabled, $iTabIndex, $sAccessKey); + } + + + /** + * Function addArticles. Adds articles to select box values. + * + * @param int $iIDCat idcat of the category to be listed + * @param bool $bColored Add color information to option elements + * @param bool $bArtOnline If true, only online articles will be added + * @param string $sSpaces Just some " " to show data hierarchically (used in conjunction with addCategories) + * + * @return int Number of items added + **/ + function addArticles ($iIDCat, $bColored = false, $bArtOnline = true, $sSpaces = "") + { + global $cfg, $lang; + + $oDB = new DB_Contenido; + + if (is_numeric($iIDCat) && $iIDCat > 0) + { + $sSQL = "SELECT tblArtLang.title AS title, tblArtLang.idartlang AS idartlang, tblCatArt.idcat AS idcat, "; + $sSQL .= "tblCatArt.idcatart AS idcatart, tblCatArt.is_start AS isstart, tblArtLang.online AS online, "; + $sSQL .= "tblCatLang.startidartlang as idstartartlang "; + $sSQL .= "FROM ".$cfg["tab"]["art_lang"]." AS tblArtLang, ".$cfg["tab"]["cat_art"]." AS tblCatArt, "; + $sSQL .= $cfg["tab"]["cat_lang"]." AS tblCatLang "; + $sSQL .= "WHERE tblCatArt.idcat = '".Contenido_Security::toInteger($iIDCat)."' AND tblCatLang.idcat = tblCatArt.idcat AND tblCatLang.idlang = tblArtLang.idlang AND "; + + if ($bArtOnline) { + $sSQL .= "tblArtLang.online = '1' AND "; + } + + $sSQL .= "tblArtLang.idart = tblCatArt.idart AND tblArtLang.idlang = '".Contenido_Security::escapeDB($lang, $oDB)."' "; + if ($cfg["is_start_compatible"] == true) { + $sSQL .= "ORDER BY tblCatArt.is_start DESC, tblArtLang.title"; // Getting start article as first article + } else { + $sSQL .= "ORDER BY tblArtLang.title"; + } + + $oDB->query($sSQL); + + $iCount = $oDB->num_rows(); + if ($iCount == 0) { + return 0; + } else { + $iCounter = count($this->_options); + while ($oDB->next_record()) + { + // Generate new option element + $oOption = new cHTMLOptionElement($sSpaces."   ".substr(urldecode($oDB->f("title")), 0, 32), $oDB->f("idcatart")); + + if ($bColored) + { + $bIsStartArticle = false; + if ($cfg["is_start_compatible"] == true && $oDB->f("isstart") == 1) { + // Compatible mode and "start article" flag is set + $bIsStartArticle = true; + } else if ($cfg["is_start_compatible"] != true && $oDB->f("idstartartlang") == $oDB->f("idartlang")) { + // No compatible mode and current article is start article (idstartartlang is the same for all records within a category) + $bIsStartArticle = true; + } + + if ($bIsStartArticle) + { + if ($oDB->f("online") == 0) { + // Start article, but offline -> red + $oOption->setStyle("color: #ff0000;"); + } else { + // Start article -> blue + $oOption->setStyle("color: #0000ff;"); + } + } else if ($oDB->f("online") == 0) { + // Offline article -> grey + $oOption->setStyle("color: #666666;"); + } + } + + // Add option element to the list + $this->addOptionElement($iCounter, $oOption); + $iCounter++; + } + return $iCount; + } + } else { + return 0; + } + } + + /** + * Function addCategories. Adds category elements (optionally including articles) to select box values. + * Note: Using "with articles" adds the articles also - but the categories will get a negative value! + * There is no way to distinguish between a category id and an article id... + * + * @param int $iMaxLevel Max. level shown (to be exact: except this level) + * @param bool $bColored Add color information to option elements + * @param bool $bCatVisible If true, only add idcat as value, if cat is visible + * @param bool $bCatPublic If true, only add idcat as value, if cat is public + * @param bool $bWithArt Add also articles per category + * @param bool $bArtOnline If true, show only online articles + * + * @return int Number of items added + **/ + function addCategories ($iMaxLevel = 0, $bColored = false, $bCatVisible = true, $bCatPublic = true, + $bWithArt = false, $bArtOnline = true) + { + global $cfg, $client, $lang; + + $oDB = new DB_Contenido; + + $sSQL = "SELECT tblCat.idcat AS idcat, tblCatLang.name AS name, "; + $sSQL .= "tblCatLang.visible AS visible, tblCatLang.public AS public, tblCatTree.level AS level "; + $sSQL .= "FROM ".$cfg["tab"]["cat"]." AS tblCat, ".$cfg["tab"]["cat_lang"]." AS tblCatLang, "; + $sSQL .= $cfg["tab"]["cat_tree"]." AS tblCatTree "; + $sSQL .= "WHERE tblCat.idclient = '".Contenido_Security::escapeDB($client, $oDB)."' AND tblCatLang.idlang = '".Contenido_Security::escapeDB($lang, $oDB)."' AND "; + $sSQL .= "tblCatLang.idcat = tblCat.idcat AND tblCatTree.idcat = tblCat.idcat "; + + if ($iMaxLevel > 0) { + $sSQL .= "AND tblCatTree.level < '".Contenido_Security::escapeDB($iMaxLevel, $oDB)."' "; + } + $sSQL .= "ORDER BY tblCatTree.idtree"; + + $oDB->query($sSQL); + + $iCount = $oDB->num_rows(); + if ($iCount == 0) { + return false; + } else { + $iCounter = count($this->_options); + while ($oDB->next_record()) + { + $sSpaces = ""; + $sStyle = ""; + $iID = $oDB->f("idcat"); + + for ($i = 0; $i < $oDB->f("level"); $i++) { + $sSpaces .= "   "; + } + + // Generate new option element + if (($bCatVisible && $oDB->f("visible") == 0) || + ($bCatPublic && $oDB->f("public") == 0)) { + // If category has to be visible or public and it isn't, don't add value + $sValue = ""; + } else if ($bWithArt) { + // If article will be added, set negative idcat as value + $sValue = "-".$iID; + } else { + // Show only categories - and everything is fine... + $sValue = $iID; + } + $oOption = new cHTMLOptionElement($sSpaces."> ".urldecode($oDB->f("name")), $sValue); + + // Coloring option element, restricted shows grey color + $oOption->setStyle("background-color: #EFEFEF"); + if ($bColored && ($oDB->f("visible") == 0 || $oDB->f("public") == 0)) { + $oOption->setStyle("color: #666666;"); + } + + // Add option element to the list + $this->addOptionElement($iCounter, $oOption); + + if ($bWithArt) { + $iArticles = $this->addArticles($iID, $bColored, $bArtOnline, $sSpaces); + $iCount += $iArticles; + } + $iCounter = count($this->_options); + } + } + return $iCount; + } + + /** + * Function addTypesFromArt. Adds types and type ids which are available for the specified article + * + * @param int $iIDCatArt Article id + * @param string $sTypeRange Komma separated list of Contenido type ids which may be in the resulting list (e.g. '1','17','28') + * + * @return int Number of items added + **/ + function addTypesFromArt ($iIDCatArt, $sTypeRange = "") + { + global $cfg, $lang; + + $oDB = new DB_Contenido; + + if (is_numeric($iIDCatArt) && $iIDCatArt > 0) + { + $sSQL = "SELECT tblContent.typeid AS typeid, tblContent.idtype AS idtype, tblType.type AS type, tblType.description AS description, "; + $sSQL .= "tblContent.value AS value "; + $sSQL .= "FROM ".$cfg["tab"]["content"]." AS tblContent, ".$cfg["tab"]["art_lang"]." AS tblArtLang, "; + $sSQL .= $cfg["tab"]["cat_art"]." AS tblCatArt, ".$cfg["tab"]["type"]." AS tblType "; + $sSQL .= "WHERE tblContent.idtype = tblType.idtype AND tblContent.idartlang = tblArtLang.idartlang AND "; + $sSQL .= "tblArtLang.idart = tblCatArt.idart AND tblArtLang.idlang = '". Contenido_Security::escapeDB($lang, $oDB)."' AND tblCatArt.idcatart = '". Contenido_Security::toInteger($iIDCatArt)."' "; + + if ($sTypeRange != "") { + $sSQL .= "AND tblContent.idtype IN (". Contenido_Security::escapeDB($sTypeRange, $oDB).") "; + } + + $sql .= "ORDER BY tblContent.idtype, tblContent.typeid"; + + $oDB->query($sSQL); + + $iCount = $oDB->num_rows(); + if ($iCount == 0) { + return false; + } else { + while ($oDB->next_record()) + { + $sTypeIdentifier = "tblData.idtype = '".$oDB->f('idtype')."' AND tblData.typeid = '".$oDB->f('typeid')."'"; + + // Generate new option element + $oOption = new cHTMLOptionElement($oDB->f('type')."[".$oDB->f('typeid')."]: ".substr(strip_tags(urldecode($oDB->f("value"))), 0, 50), $sTypeIdentifier); + + // Add option element to the list + $this->addOptionElement($sTypeIdentifier, $oOption); + } + return $iCount; + } + } else { + return false; + } + } + + /** + * Selects specified elements as selected + * + * @param array $aElements Array with "values" of the cHTMLOptionElement to set + * + * @return none + */ + function setSelected($aElements) + { + if (is_array($this->_options) && is_array($aElements)) + { + foreach ($this->_options as $sKey => $oOption) + { + if (in_array($oOption->getAttribute("value"), $aElements)) + { + $oOption->setSelected(true); + $this->_options[$sKey] = $oOption; + } else { + $oOption->setSelected(false); + $this->_options[$sKey] = $oOption; + } + } + } + } +} + +class UI_Config_Table +{ + var $_sTplCellCode; + var $_sTplTableFile; + + var $_sWidth; + var $_sBorder; + var $_sBorderColor; + var $_bSolidBorder; + var $_sPadding; + var $_aCells; + var $_aCellAlignment; + var $_aCellVAlignment; + var $_aCellColSpan; + var $_aCellClass; + var $_aRowBgColor; + var $_aRowExtra; + var $_bAddMultiSelJS; + + var $_sColorLight; + var $_sColorDark; + + function UI_Config_Table() + { + global $cfg; + + $this->_sPadding = 2; + $this->_sBorder = 0; + $this->_sBorderColor = $cfg['color']['table_border']; + $this->_sTplCellCode = ' {CONTENT}'."\n"; + $this->_sTplTableFile = $cfg['path']['contenido'].$cfg['path']['templates'].$cfg['templates']['generic_list']; + $this->_sColorLight = $cfg['color']['table_light']; + $this->_sColorDark = $cfg['color']['table_dark']; + } + + function setCellTemplate($sCode) + { + $this->_sTplCellCode = $sCode; + } + + + function setTableTemplateFile($sPath) + { + $this->_sTplTableFile = $sPath; + } + + function setLightColor($sColor) + { + $this->_sColorLight = $sColor; + } + + function setDarkColor($sColor) + { + $this->_sColorDark = $sColor; + } + + function setAddMultiSelJS($bEnabled = true) + { + $this->_bAddMultiSelJS = (bool)$bEnabled; + } + + function setWidth ($sWidth) + { + $this->_sWidth = $sWidth; + } + + function setPadding ($sPadding) + { + $this->_sPadding = $sPadding; + } + + function setBorder ($sBorder) + { + $this->_sBorder = $sBorder; + } + + function setBorderColor ($sBorderColor) + { + $this->_sBorderColor = $sBorderColor; + } + + function setSolidBorder ($bSolidBorder = true) + { + $this->_bSolidBorder = (bool)$bSolidBorder; + } + + function setCell ($sRow, $sCell, $sContent) + { + $this->_aCells[$sRow][$sCell] = $sContent; + $this->_aCellAlignment[$sRow][$sCell] = ""; + } + + function setCellAlignment ($sRow, $sCell, $sAlignment) + { + $this->_aCellAlignment[$sRow][$sCell] = $sAlignment; + } + + function setCellVAlignment ($sRow, $sCell, $sAlignment) + { + $this->_aCellVAlignment[$sRow][$sCell] = $sAlignment; + } + + function setCellColspan ($sRow, $sCell, $iColSpan) + { + $this->_aCellColSpan[$sRow][$sCell] = $iColSpan; + } + + function setCellClass ($sRow, $sCell, $sClass) + { + $this->_aCellClass[$sRow][$sCell] = $sClass; + } + + function setRowBgColor ($sRow, $sColor) + { + $this->_aRowBgColor[$sRow] = $sColor; + } + + function setRowExtra ($sRow, $sExtra) + { + $this->_aRowExtra[$sRow] = $sExtra; + } + + function _addMultiSelJS() + { + // Trick: To save multiple selections in  '; + html += '
'; + + } else { + // Implied consent disclosure + html += scriptsDisclosure + settings.impliedDisclosureText + ' ' + settings.privacyPolicyLinkText + '.'; + html += '
'; + } + html += ''; + $('body').append(html); + + // Serve the disclosure, and be smarter about branching + var dp = settings.position.toLowerCase(); + if(dp != 'top' && dp!= 'bottom') { + dp = 'top'; + } + var opts = new Array(); + if(dp == 'top') { + opts['in'] = {'top':'0'}; + opts['out'] = {'top':'-300'}; + } else { + opts['in'] = {'bottom':'0'}; + opts['out'] = {'bottom':'-300'}; + } + + // Start animation + $('#cookiesdirective').animate(opts['in'], 1000, function() { + // Set event handlers depending on type of disclosure + if(settings.explicitConsent) { + // Explicit, need to check a box and click a button + $('#explicitsubmit').click(function() { + if($('#epdagree').is(':checked')) { + // Set a cookie to prevent this being displayed again + setCookie('cookiesDirective',1,365); + // Close the overlay + $('#cookiesdirective').animate(opts['out'],1000,function() { + // Remove the elements from the DOM and reload page + $('#cookiesdirective').remove(); + location.reload(true); + }); + } else { + // We need the box checked we want "explicit consent", display message + $('#epdnotick').css('display', 'block'); + } + }); + } else { + // Implied consent, just a button to close it + $('#impliedsubmit').click(function() { + // Set a cookie to prevent this being displayed again + setCookie('cookiesDirective',1,365); + // Close the overlay + $('#cookiesdirective').animate(opts['out'],1000,function() { + // Remove the elements from the DOM and reload page + $('#cookiesdirective').remove(); + }); + }); + } + + // Set a timer to remove the warning after 'settings.duration' seconds + setTimeout(function(){ + $('#cookiesdirective').animate({ + opacity:'0' + },2000, function(){ + $('#cookiesdirective').css(dp,'-300px'); + }); + }, settings.duration * 1000); + }); + } +})(jQuery); diff --git a/cms/js/libs/jquery-1.9.0.min.js b/cms/js/libs/jquery-1.9.0.min.js new file mode 100644 index 0000000..50d1b22 --- /dev/null +++ b/cms/js/libs/jquery-1.9.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st("'; + ifr = document.getElementById('iframe'); + doc = ifr.contentWindow.document; + + // Force absolute CSS urls + css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; + css = css.concat(tinymce.explode(ed.settings.content_css) || []); + tinymce.each(css, function(u) { + cssHTML += ''; + }); + + // Write content into iframe + doc.open(); + doc.write('' + cssHTML + ''); + doc.close(); + + doc.designMode = 'on'; + this.resize(); + + window.setTimeout(function() { + ifr.contentWindow.focus(); + }, 10); + }, + + insert : function() { + var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('iframe'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } + } +}; + +tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/de_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/de_dlg.js new file mode 100644 index 0000000..d7bbe93 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.paste_dlg',{"word_title":"Strg V auf der Tastatur dr\u00fccken, um den Text einzuf\u00fcgen.","text_linebreaks":"Zeilenumbr\u00fcche beibehalten","text_title":"Strg V auf der Tastatur dr\u00fccken, um den Text einzuf\u00fcgen."}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js new file mode 100644 index 0000000..bc74daf --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pastetext.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pastetext.htm new file mode 100644 index 0000000..8ccfbb9 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pastetext.htm @@ -0,0 +1,27 @@ + + + {#paste.paste_text_desc} + + + + +
+
{#paste.paste_text_desc}
+ +
+ +
+ +
+ +
{#paste_dlg.text_title}
+ + + +
+ + +
+
+ + \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pasteword.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pasteword.htm new file mode 100644 index 0000000..7731f39 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/paste/pasteword.htm @@ -0,0 +1,21 @@ + + + {#paste.paste_word_desc} + + + + +
+
{#paste.paste_word_desc}
+ +
{#paste_dlg.word_title}
+ +
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin.js new file mode 100644 index 0000000..507909c --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js new file mode 100644 index 0000000..80f00f0 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js @@ -0,0 +1,53 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.Preview', { + init : function(ed, url) { + var t = this, css = tinymce.explode(ed.settings.content_css); + + t.editor = ed; + + // Force absolute CSS urls + tinymce.each(css, function(u, k) { + css[k] = ed.documentBaseURI.toAbsolute(u); + }); + + ed.addCommand('mcePreview', function() { + ed.windowManager.open({ + file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"), + width : parseInt(ed.getParam("plugin_preview_width", "550")), + height : parseInt(ed.getParam("plugin_preview_height", "600")), + resizable : "yes", + scrollbars : "yes", + popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"), + inline : ed.getParam("plugin_preview_inline", 1) + }, { + base : ed.documentBaseURI.getURI() + }); + }); + + ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'}); + }, + + getInfo : function() { + return { + longname : 'Preview', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('preview', tinymce.plugins.Preview); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/example.html b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/example.html new file mode 100644 index 0000000..4820222 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/example.html @@ -0,0 +1,28 @@ + + + + + +Example of a custom preview page + + + +Editor contents:
+
+ +
+ + + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/jscripts/embed.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/jscripts/embed.js new file mode 100644 index 0000000..6fe25de --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/jscripts/embed.js @@ -0,0 +1,73 @@ +/** + * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. + */ + +function writeFlash(p) { + writeEmbed( + 'D27CDB6E-AE6D-11cf-96B8-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'application/x-shockwave-flash', + p + ); +} + +function writeShockWave(p) { + writeEmbed( + '166B1BCA-3F9C-11CF-8075-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', + 'application/x-director', + p + ); +} + +function writeQuickTime(p) { + writeEmbed( + '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', + 'video/quicktime', + p + ); +} + +function writeRealMedia(p) { + writeEmbed( + 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'audio/x-pn-realaudio-plugin', + p + ); +} + +function writeWindowsMedia(p) { + p.url = p.src; + writeEmbed( + '6BF52A52-394A-11D3-B153-00C04F79FAA6', + 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', + 'application/x-mplayer2', + p + ); +} + +function writeEmbed(cls, cb, mt, p) { + var h = '', n; + + h += ''; + + h += ' + + + + + +{#preview.preview_desc} + + + + + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin.js new file mode 100644 index 0000000..b5b3a55 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin_src.js new file mode 100644 index 0000000..47e666a --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/print/editor_plugin_src.js @@ -0,0 +1,34 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.Print', { + init : function(ed, url) { + ed.addCommand('mcePrint', function() { + ed.getWin().print(); + }); + + ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'}); + }, + + getInfo : function() { + return { + longname : 'Print', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('print', tinymce.plugins.Print); +})(); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin.js new file mode 100644 index 0000000..8e93996 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin_src.js new file mode 100644 index 0000000..5ab6491 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/save/editor_plugin_src.js @@ -0,0 +1,101 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.Save', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceSave', t._save, t); + ed.addCommand('mceCancel', t._cancel, t); + + // Register buttons + ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'}); + ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'}); + + ed.onNodeChange.add(t._nodeChange, t); + ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave'); + }, + + getInfo : function() { + return { + longname : 'Save', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + + _nodeChange : function(ed, cm, n) { + var ed = this.editor; + + if (ed.getParam('save_enablewhendirty')) { + cm.setDisabled('save', !ed.isDirty()); + cm.setDisabled('cancel', !ed.isDirty()); + } + }, + + // Private methods + + _save : function() { + var ed = this.editor, formObj, os, i, elementId; + + formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form'); + + if (ed.getParam("save_enablewhendirty") && !ed.isDirty()) + return; + + tinyMCE.triggerSave(); + + // Use callback instead + if (os = ed.getParam("save_onsavecallback")) { + if (ed.execCallback('save_onsavecallback', ed)) { + ed.startContent = tinymce.trim(ed.getContent({format : 'raw'})); + ed.nodeChanged(); + } + + return; + } + + if (formObj) { + ed.isNotDirty = true; + + if (formObj.onsubmit == null || formObj.onsubmit() != false) + formObj.submit(); + + ed.nodeChanged(); + } else + ed.windowManager.alert("Error: No form element found."); + }, + + _cancel : function() { + var ed = this.editor, os, h = tinymce.trim(ed.startContent); + + // Use callback instead + if (os = ed.getParam("save_oncancelcallback")) { + ed.execCallback('save_oncancelcallback', ed); + return; + } + + ed.setContent(h); + ed.undoManager.clear(); + ed.nodeChanged(); + } + }); + + // Register plugin + tinymce.PluginManager.add('save', tinymce.plugins.Save); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css new file mode 100644 index 0000000..3e2eaf3 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css @@ -0,0 +1,6 @@ +.panel_wrapper {height:85px;} +.panel_wrapper div.current {height:85px;} + +/* IE */ +* html .panel_wrapper {height:100px;} +* html .panel_wrapper div.current {height:100px;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js new file mode 100644 index 0000000..165bc12 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js new file mode 100644 index 0000000..b0c013f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js @@ -0,0 +1,61 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.SearchReplacePlugin', { + init : function(ed, url) { + function open(m) { + // Keep IE from writing out the f/r character to the editor + // instance while initializing a new dialog. See: #3131190 + window.focus(); + + ed.windowManager.open({ + file : url + '/searchreplace.htm', + width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), + height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)), + inline : 1, + auto_focus : 0 + }, { + mode : m, + search_string : ed.selection.getContent({format : 'text'}), + plugin_url : url + }); + }; + + // Register commands + ed.addCommand('mceSearch', function() { + open('search'); + }); + + ed.addCommand('mceReplace', function() { + open('replace'); + }); + + // Register buttons + ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'}); + ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'}); + + ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch'); + }, + + getInfo : function() { + return { + longname : 'Search/Replace', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js new file mode 100644 index 0000000..b00bf0c --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js @@ -0,0 +1,148 @@ +tinyMCEPopup.requireLangPack(); + +var SearchReplaceDialog = { + init : function(ed) { + var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); + + t.switchMode(m); + + f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); + + // Focus input field + f[m + '_panel_searchstring'].focus(); + + mcTabs.onChange.add(function(tab_id, panel_id) { + t.switchMode(tab_id.substring(0, tab_id.indexOf('_'))); + }); + + }, + + switchMode : function(m) { + var f, lm = this.lastMode; + + if (lm != m) { + f = document.forms[0]; + + if (lm) { + f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value; + f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked; + f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked; + f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked; + } + + mcTabs.displayTab(m + '_tab', m + '_panel'); + document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none"; + document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none"; + this.lastMode = m; + } + }, + + searchNext : function(a) { + var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0; + + if (tinymce.isIE11 && !window.find) { + ed.windowManager.alert("This feature is not available in IE 11+. Upgrade TinyMCE to 4.x to get this functionallity back."); + return; + } + + // Get input + f = document.forms[0]; + s = f[m + '_panel_searchstring'].value; + b = f[m + '_panel_backwardsu'].checked; + ca = f[m + '_panel_casesensitivebox'].checked; + rs = f['replace_panel_replacestring'].value; + + if (tinymce.isIE) { + r = ed.getDoc().selection.createRange(); + } + + if (s == '') + return; + + function fix() { + // Correct Firefox graphics glitches + // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions? + r = se.getRng().cloneRange(); + ed.getDoc().execCommand('SelectAll', false, null); + se.setRng(r); + }; + + function replace() { + ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE + }; + + // IE flags + if (ca) + fl = fl | 4; + + switch (a) { + case 'all': + // Move caret to beginning of text + ed.execCommand('SelectAll'); + ed.selection.collapse(true); + + if (tinymce.isIE) { + ed.focus(); + r = ed.getDoc().selection.createRange(); + + while (r.findText(s, b ? -1 : 1, fl)) { + r.scrollIntoView(); + r.select(); + replace(); + fo = 1; + + if (b) { + r.moveEnd("character", -(rs.length)); // Otherwise will loop forever + } + } + + tinyMCEPopup.storeSelection(); + } else { + while (w.find(s, ca, b, false, false, false, false)) { + replace(); + fo = 1; + } + } + + if (fo) + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced')); + else + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); + + return; + + case 'current': + if (!ed.selection.isCollapsed()) + replace(); + + break; + } + + se.collapse(b); + r = se.getRng(); + + // Whats the point + if (!s) + return; + + if (tinymce.isIE) { + ed.focus(); + r = ed.getDoc().selection.createRange(); + + if (r.findText(s, b ? -1 : 1, fl)) { + r.scrollIntoView(); + r.select(); + } else + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); + + tinyMCEPopup.storeSelection(); + } else { + if (!w.find(s, ca, b, false, false, false, false)) + tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); + else + fix(); + } + } +}; + +tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/de_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/de_dlg.js new file mode 100644 index 0000000..7c40acd --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.searchreplace_dlg',{findwhat:"Zu suchender Text",replacewith:"Ersetzen durch",direction:"Suchrichtung",up:"Aufw\u00e4rts",down:"Abw\u00e4rts",mcase:"Gro\u00df-/Kleinschreibung beachten",findnext:"Weitersuchen",allreplaced:"Alle Vorkommen der Zeichenkette wurden ersetzt.","searchnext_desc":"Weitersuchen",notfound:"Die Suche ist am Ende angelangt. Die Zeichenkette konnte nicht gefunden werden.","search_title":"Suchen","replace_title":"Suchen/Ersetzen",replaceall:"Alle ersetzen",replace:"Ersetzen"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js new file mode 100644 index 0000000..8a65900 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.searchreplace_dlg',{findwhat:"Find What",replacewith:"Replace with",direction:"Direction",up:"Up",down:"Down",mcase:"Match Case",findnext:"Find Next",allreplaced:"All occurrences of the search string were replaced.","searchnext_desc":"Find Again",notfound:"The search has been completed. The search string could not be found.","search_title":"Find","replace_title":"Find/Replace",replaceall:"Replace All",replace:"Replace"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm new file mode 100644 index 0000000..f5bafc4 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm @@ -0,0 +1,100 @@ + + + + {#searchreplace_dlg.replace_title} + + + + + + + + +
+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + +
+
+
+ +
+ +
+ + + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/css/content.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/css/content.css new file mode 100644 index 0000000..656ce1e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/css/content.css @@ -0,0 +1 @@ +.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js new file mode 100644 index 0000000..6b57241 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);f.menuItems={};c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}f._updateMenu(l);f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);f.menuItems[n]=l;if(n==f.selectedLang){f.selectedItem=l}})});return g}},setLanguage:function(e){var d=this;if(e==d.selectedLang){return}if(tinymce.grep(d.languages,function(f){return f===e}).length===0){throw"Unknown language: "+e}d.selectedLang=e;if(d.menuItems){d._updateMenu(d.menuItems[e])}if(d.active){d._done()}},_updateMenu:function(d){d.setSelected(1);this.selectedItem.setSelected(0);this.selectedItem=d},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(g.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(g.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(g.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(f,'$1$2')}g.replace(q,t)}});i.setRng(d)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}if(h.getParam("show_ignore_words",true)){e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}})}if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js new file mode 100644 index 0000000..4081181 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js @@ -0,0 +1,471 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM; + + tinymce.create('tinymce.plugins.SpellcheckerPlugin', { + getInfo : function() { + return { + longname : 'Spellchecker', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + init : function(ed, url) { + var t = this, cm; + + t.url = url; + t.editor = ed; + t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}"); + + if (t.rpcUrl == '{backend}') { + // Sniff if the browser supports native spellchecking (Don't know of a better way) + if (tinymce.isIE) + return; + + t.hasSupport = true; + + // Disable the context menu when spellchecking is active + ed.onContextMenu.addToTop(function(ed, e) { + if (t.active) + return false; + }); + } + + // Register commands + ed.addCommand('mceSpellCheck', function() { + if (t.rpcUrl == '{backend}') { + // Enable/disable native spellchecker + t.editor.getBody().spellcheck = t.active = !t.active; + return; + } + + if (!t.active) { + ed.setProgressState(1); + t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) { + if (r.length > 0) { + t.active = 1; + t._markWords(r); + ed.setProgressState(0); + ed.nodeChanged(); + } else { + ed.setProgressState(0); + + if (ed.getParam('spellchecker_report_no_misspellings', true)) + ed.windowManager.alert('spellchecker.no_mpell'); + } + }); + } else + t._done(); + }); + + if (ed.settings.content_css !== false) + ed.contentCSS.push(url + '/css/content.css'); + + ed.onClick.add(t._showMenu, t); + ed.onContextMenu.add(t._showMenu, t); + ed.onBeforeGetContent.add(function() { + if (t.active) + t._removeWords(); + }); + + ed.onNodeChange.add(function(ed, cm) { + cm.setActive('spellchecker', t.active); + }); + + ed.onSetContent.add(function() { + t._done(); + }); + + ed.onBeforeGetContent.add(function() { + t._done(); + }); + + ed.onBeforeExecCommand.add(function(ed, cmd) { + if (cmd == 'mceFullScreen') + t._done(); + }); + + // Find selected language + t.languages = {}; + each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) { + if (k.indexOf('+') === 0) { + k = k.substring(1); + t.selectedLang = v; + } + + t.languages[k] = v; + }); + }, + + createControl : function(n, cm) { + var t = this, c, ed = t.editor; + + if (n == 'spellchecker') { + // Use basic button if we use the native spellchecker + if (t.rpcUrl == '{backend}') { + // Create simple toggle button if we have native support + if (t.hasSupport) + c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); + + return c; + } + + c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); + + c.onRenderMenu.add(function(c, m) { + m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + t.menuItems = {}; + each(t.languages, function(v, k) { + var o = {icon : 1}, mi; + + o.onclick = function() { + if (v == t.selectedLang) { + return; + } + t._updateMenu(mi); + t.selectedLang = v; + }; + + o.title = k; + mi = m.add(o); + mi.setSelected(v == t.selectedLang); + t.menuItems[v] = mi; + if (v == t.selectedLang) + t.selectedItem = mi; + }); + }); + + + + return c; + } + }, + + setLanguage: function(lang) { + var t = this; + + if (lang == t.selectedLang) { + // allowed + return; + } + + if (tinymce.grep(t.languages, function(v) { return v === lang; }).length === 0) { + throw "Unknown language: " + lang; + } + + t.selectedLang = lang; + + // if the menu has been shown, update it as well + if (t.menuItems) { + t._updateMenu(t.menuItems[lang]); + } + + if (t.active) { + // clear error in the old language. + t._done(); + + // Don't immediately block the UI to check spelling in the new language, this is an API not a user action. + } + }, + + // Internal functions + + _updateMenu: function(mi) { + mi.setSelected(1); + this.selectedItem.setSelected(0); + this.selectedItem = mi; + }, + + _walk : function(n, f) { + var d = this.editor.getDoc(), w; + + if (d.createTreeWalker) { + w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); + + while ((n = w.nextNode()) != null) + f.call(this, n); + } else + tinymce.walk(n, f, 'childNodes'); + }, + + _getSeparators : function() { + var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}\u201d\u201c'); + + // Build word separator regexp + for (i=0; i elements content is broken after spellchecking. + // Bug #1408: Preceding whitespace characters are removed + // @TODO: I'm not sure that both are still issues on IE9. + if (tinymce.isIE) { + // Enclose mispelled words with temporal tag + v = v.replace(rx, '$1$2'); + // Loop over the content finding mispelled words + while ((pos = v.indexOf('')) != -1) { + // Add text node for the content before the word + txt = v.substring(0, pos); + if (txt.length) { + node = doc.createTextNode(dom.decode(txt)); + elem.appendChild(node); + } + v = v.substring(pos+10); + pos = v.indexOf(''); + txt = v.substring(0, pos); + v = v.substring(pos+11); + // Add span element for the word + elem.appendChild(dom.create('span', {'class' : 'mceItemHiddenSpellWord'}, txt)); + } + // Add text node for the rest of the content + if (v.length) { + node = doc.createTextNode(dom.decode(v)); + elem.appendChild(node); + } + } else { + // Other browsers preserve whitespace characters on innerHTML usage + elem.innerHTML = v.replace(rx, '$1$2'); + } + + // Finally, replace the node with the container + dom.replace(elem, n); + } + }); + + se.setRng(r); + }, + + _showMenu : function(ed, e) { + var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target; + + e = 0; // Fixes IE memory leak + + if (!m) { + m = ed.controlManager.createDropMenu('spellcheckermenu', {'class' : 'mceNoIcons'}); + t._menu = m; + } + + if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) { + m.removeAll(); + m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) { + var ignoreRpc; + + m.removeAll(); + + if (r.length > 0) { + m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + each(r, function(v) { + m.add({title : v, onclick : function() { + dom.replace(ed.getDoc().createTextNode(v), wordSpan); + t._checkDone(); + }}); + }); + + m.addSeparator(); + } else + m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + if (ed.getParam('show_ignore_words', true)) { + ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", ''); + m.add({ + title : 'spellchecker.ignore_word', + onclick : function() { + var word = wordSpan.innerHTML; + + dom.remove(wordSpan, 1); + t._checkDone(); + + // tell the server if we need to + if (ignoreRpc) { + ed.setProgressState(1); + t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) { + ed.setProgressState(0); + }); + } + } + }); + + m.add({ + title : 'spellchecker.ignore_words', + onclick : function() { + var word = wordSpan.innerHTML; + + t._removeWords(dom.decode(word)); + t._checkDone(); + + // tell the server if we need to + if (ignoreRpc) { + ed.setProgressState(1); + t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) { + ed.setProgressState(0); + }); + } + } + }); + } + + if (t.editor.getParam("spellchecker_enable_learn_rpc")) { + m.add({ + title : 'spellchecker.learn_word', + onclick : function() { + var word = wordSpan.innerHTML; + + dom.remove(wordSpan, 1); + t._checkDone(); + + ed.setProgressState(1); + t._sendRPC('learnWord', [t.selectedLang, word], function(r) { + ed.setProgressState(0); + }); + } + }); + } + + m.update(); + }); + + p1 = DOM.getPos(ed.getContentAreaContainer()); + m.settings.offset_x = p1.x; + m.settings.offset_y = p1.y; + + ed.selection.select(wordSpan); + p1 = dom.getPos(wordSpan); + m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y); + + return tinymce.dom.Event.cancel(e); + } else + m.hideMenu(); + }, + + _checkDone : function() { + var t = this, ed = t.editor, dom = ed.dom, o; + + each(dom.select('span'), function(n) { + if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) { + o = true; + return false; + } + }); + + if (!o) + t._done(); + }, + + _done : function() { + var t = this, la = t.active; + + if (t.active) { + t.active = 0; + t._removeWords(); + + if (t._menu) + t._menu.hideMenu(); + + if (la) + t.editor.nodeChanged(); + } + }, + + _sendRPC : function(m, p, cb) { + var t = this; + + JSONRequest.sendRPC({ + url : t.rpcUrl, + method : m, + params : p, + success : cb, + error : function(e, x) { + t.editor.setProgressState(0); + t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText)); + } + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin); +})(); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d0a4dbca03cc13177a359a5f175dda819fdf464 GIT binary patch literal 46 ycmZ?wbhEHbWMN=tXkcXcqowu#|9{1wEQ|~cj0`#qKmd|qU}ANVOOs?}um%7FLkRf* literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/css/props.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/css/props.css new file mode 100644 index 0000000..51a3b1f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/css/props.css @@ -0,0 +1,14 @@ +#text_font {width:250px;} +#text_size {width:70px;} +.mceAddSelectValue {background:#DDD;} +select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;} +#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;} +#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;} +#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;} +.panel_toggle_insert_span {padding-top:10px;} +.panel_wrapper div.current {padding-top:10px;height:230px;} +.delim {border-left:1px solid gray;} +.tdelim {border-bottom:1px solid gray;} +#block_display {width:145px;} +#list_type {width:115px;} +.disabled {background:#EEE;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin.js new file mode 100644 index 0000000..dda9f92 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){var c=false;var f=a.selection.getSelectedBlocks();var d=[];if(f.length===1){d.push(a.selection.getNode().style.cssText)}else{tinymce.each(f,function(g){d.push(a.dom.getAttrib(g,"style"))});c=true}a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:340+parseInt(a.getLang("style.delta_height",0)),inline:1},{applyStyleToBlocks:c,plugin_url:b,styles:d})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin_src.js new file mode 100644 index 0000000..5a2d848 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/editor_plugin_src.js @@ -0,0 +1,71 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.StylePlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceStyleProps', function() { + + var applyStyleToBlocks = false; + var blocks = ed.selection.getSelectedBlocks(); + var styles = []; + + if (blocks.length === 1) { + styles.push(ed.selection.getNode().style.cssText); + } + else { + tinymce.each(blocks, function(block) { + styles.push(ed.dom.getAttrib(block, 'style')); + }); + applyStyleToBlocks = true; + } + + ed.windowManager.open({ + file : url + '/props.htm', + width : 480 + parseInt(ed.getLang('style.delta_width', 0)), + height : 340 + parseInt(ed.getLang('style.delta_height', 0)), + inline : 1 + }, { + applyStyleToBlocks : applyStyleToBlocks, + plugin_url : url, + styles : styles + }); + }); + + ed.addCommand('mceSetElementStyle', function(ui, v) { + if (e = ed.selection.getNode()) { + ed.dom.setAttrib(e, 'style', v); + ed.execCommand('mceRepaint'); + } + }); + + ed.onNodeChange.add(function(ed, cm, n) { + cm.setDisabled('styleprops', n.nodeName === 'BODY'); + }); + + // Register buttons + ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'}); + }, + + getInfo : function() { + return { + longname : 'Style', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin); +})(); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/js/props.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/js/props.js new file mode 100644 index 0000000..853222b --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/js/props.js @@ -0,0 +1,709 @@ +tinyMCEPopup.requireLangPack(); + +var defaultFonts = "" + + "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + + "Courier New, Courier, mono=Courier New, Courier, mono;" + + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + + "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + + "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + + "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif"; + +var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger"; +var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; +var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%"; +var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; +var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900"; +var defaultTextStyle = "normal;italic;oblique"; +var defaultVariant = "normal;small-caps"; +var defaultLineHeight = "normal"; +var defaultAttachment = "fixed;scroll"; +var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y"; +var defaultPosH = "left;center;right"; +var defaultPosV = "top;center;bottom"; +var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom"; +var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none"; +var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset"; +var defaultBorderWidth = "thin;medium;thick"; +var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none"; + +function aggregateStyles(allStyles) { + var mergedStyles = {}; + + tinymce.each(allStyles, function(style) { + if (style !== '') { + var parsedStyles = tinyMCEPopup.editor.dom.parseStyle(style); + for (var name in parsedStyles) { + if (parsedStyles.hasOwnProperty(name)) { + if (mergedStyles[name] === undefined) { + mergedStyles[name] = parsedStyles[name]; + } + else if (name === 'text-decoration') { + if (mergedStyles[name].indexOf(parsedStyles[name]) === -1) { + mergedStyles[name] = mergedStyles[name] +' '+ parsedStyles[name]; + } + } + } + } + } + }); + + return mergedStyles; +} + +var applyActionIsInsert; +var existingStyles; + +function init(ed) { + var ce = document.getElementById('container'), h; + + existingStyles = aggregateStyles(tinyMCEPopup.getWindowArg('styles')); + ce.style.cssText = tinyMCEPopup.editor.dom.serializeStyle(existingStyles); + + applyActionIsInsert = ed.getParam("edit_css_style_insert_span", false); + document.getElementById('toggle_insert_span').checked = applyActionIsInsert; + + h = getBrowserHTML('background_image_browser','background_image','image','advimage'); + document.getElementById("background_image_browser").innerHTML = h; + + document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color'); + document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color'); + document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top'); + document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right'); + document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom'); + document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left'); + + fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true); + fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true); + fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true); + fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true); + fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true); + fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true); + fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true); + fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true); + fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true); + + fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true); + fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true); + + fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true); + fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true); + fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true); + fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true); + fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true); + fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true); + fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true); + fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true); + fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true); + + fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true); + fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true); + fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true); + + fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true); + + fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true); + fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true); + + fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true); + fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true); + + fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true); + + fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true); + + TinyMCE_EditableSelects.init(); + setupFormData(); + showDisabledControls(); +} + +function setupFormData() { + var ce = document.getElementById('container'), f = document.forms[0], s, b, i; + + // Setup text fields + + selectByValue(f, 'text_font', ce.style.fontFamily, true, true); + selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true); + selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize)); + selectByValue(f, 'text_weight', ce.style.fontWeight, true, true); + selectByValue(f, 'text_style', ce.style.fontStyle, true, true); + selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true); + selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight)); + selectByValue(f, 'text_case', ce.style.textTransform, true, true); + selectByValue(f, 'text_variant', ce.style.fontVariant, true, true); + f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color); + updateColor('text_color_pick', 'text_color'); + f.text_underline.checked = inStr(ce.style.textDecoration, 'underline'); + f.text_overline.checked = inStr(ce.style.textDecoration, 'overline'); + f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through'); + f.text_blink.checked = inStr(ce.style.textDecoration, 'blink'); + f.text_none.checked = inStr(ce.style.textDecoration, 'none'); + updateTextDecorations(); + + // Setup background fields + + f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor); + updateColor('background_color_pick', 'background_color'); + f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true); + selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true); + selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true); + selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0))); + selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true); + selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1))); + + // Setup block fields + + selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true); + selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing)); + selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true); + selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing)); + selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true); + selectByValue(f, 'block_text_align', ce.style.textAlign, true, true); + f.block_text_indent.value = getNum(ce.style.textIndent); + selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent)); + selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true); + selectByValue(f, 'block_display', ce.style.display, true, true); + + // Setup box fields + + f.box_width.value = getNum(ce.style.width); + selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width)); + + f.box_height.value = getNum(ce.style.height); + selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height)); + selectByValue(f, 'box_float', ce.style.cssFloat || ce.style.styleFloat, true, true); + + selectByValue(f, 'box_clear', ce.style.clear, true, true); + + setupBox(f, ce, 'box_padding', 'padding', ''); + setupBox(f, ce, 'box_margin', 'margin', ''); + + // Setup border fields + + setupBox(f, ce, 'border_style', 'border', 'Style'); + setupBox(f, ce, 'border_width', 'border', 'Width'); + setupBox(f, ce, 'border_color', 'border', 'Color'); + + updateColor('border_color_top_pick', 'border_color_top'); + updateColor('border_color_right_pick', 'border_color_right'); + updateColor('border_color_bottom_pick', 'border_color_bottom'); + updateColor('border_color_left_pick', 'border_color_left'); + + f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value); + f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value); + f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value); + f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value); + + // Setup list fields + + selectByValue(f, 'list_type', ce.style.listStyleType, true, true); + selectByValue(f, 'list_position', ce.style.listStylePosition, true, true); + f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + + // Setup box fields + + selectByValue(f, 'positioning_type', ce.style.position, true, true); + selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true); + selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true); + f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : ""; + + f.positioning_width.value = getNum(ce.style.width); + selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width)); + + f.positioning_height.value = getNum(ce.style.height); + selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height)); + + setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']); + + s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1"); + s = s.replace(/,/g, ' '); + + if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) { + f.positioning_clip_top.value = getNum(getVal(s, 0)); + selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); + f.positioning_clip_right.value = getNum(getVal(s, 1)); + selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1))); + f.positioning_clip_bottom.value = getNum(getVal(s, 2)); + selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2))); + f.positioning_clip_left.value = getNum(getVal(s, 3)); + selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3))); + } else { + f.positioning_clip_top.value = getNum(getVal(s, 0)); + selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); + f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value; + } + +// setupBox(f, ce, '', 'border', 'Color'); +} + +function getMeasurement(s) { + return s.replace(/^([0-9.]+)(.*)$/, "$2"); +} + +function getNum(s) { + if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s)) + return s.replace(/[^0-9.]/g, ''); + + return s; +} + +function inStr(s, n) { + return new RegExp(n, 'gi').test(s); +} + +function getVal(s, i) { + var a = s.split(' '); + + if (a.length > 1) + return a[i]; + + return ""; +} + +function setValue(f, n, v) { + if (f.elements[n].type == "text") + f.elements[n].value = v; + else + selectByValue(f, n, v, true, true); +} + +function setupBox(f, ce, fp, pr, sf, b) { + if (typeof(b) == "undefined") + b = ['Top', 'Right', 'Bottom', 'Left']; + + if (isSame(ce, pr, sf, b)) { + f.elements[fp + "_same"].checked = true; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + f.elements[fp + "_right"].value = ""; + f.elements[fp + "_right"].disabled = true; + f.elements[fp + "_bottom"].value = ""; + f.elements[fp + "_bottom"].disabled = true; + f.elements[fp + "_left"].value = ""; + f.elements[fp + "_left"].disabled = true; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + f.elements[fp + "_left_measurement"].disabled = true; + f.elements[fp + "_bottom_measurement"].disabled = true; + f.elements[fp + "_right_measurement"].disabled = true; + } + } else { + f.elements[fp + "_same"].checked = false; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); + f.elements[fp + "_right"].disabled = false; + + setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); + f.elements[fp + "_bottom"].disabled = false; + + setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left"].disabled = false; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); + selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); + selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left_measurement"].disabled = false; + f.elements[fp + "_bottom_measurement"].disabled = false; + f.elements[fp + "_right_measurement"].disabled = false; + } + } +} + +function isSame(e, pr, sf, b) { + var a = [], i, x; + + if (typeof(b) == "undefined") + b = ['Top', 'Right', 'Bottom', 'Left']; + + if (typeof(sf) == "undefined" || sf == null) + sf = ""; + + a[0] = e.style[pr + b[0] + sf]; + a[1] = e.style[pr + b[1] + sf]; + a[2] = e.style[pr + b[2] + sf]; + a[3] = e.style[pr + b[3] + sf]; + + for (i=0; i 0 ? s.substring(1) : s; + + if (f.text_none.checked) + s = "none"; + + ce.style.textDecoration = s; + + // Build background styles + + ce.style.backgroundColor = f.background_color.value; + ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; + ce.style.backgroundRepeat = f.background_repeat.value; + ce.style.backgroundAttachment = f.background_attachment.value; + + if (f.background_hpos.value != "") { + s = ""; + s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; + s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); + ce.style.backgroundPosition = s; + } + + // Build block styles + + ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); + ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); + ce.style.verticalAlign = f.block_vertical_alignment.value; + ce.style.textAlign = f.block_text_align.value; + ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); + ce.style.whiteSpace = f.block_whitespace.value; + ce.style.display = f.block_display.value; + + // Build box styles + + ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); + ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); + ce.style.styleFloat = f.box_float.value; + ce.style.cssFloat = f.box_float.value; + + ce.style.clear = f.box_clear.value; + + if (!f.box_padding_same.checked) { + ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); + ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); + ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); + } else + ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + + if (!f.box_margin_same.checked) { + ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); + ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); + ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); + } else + ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + + // Build border styles + + if (!f.border_style_same.checked) { + ce.style.borderTopStyle = f.border_style_top.value; + ce.style.borderRightStyle = f.border_style_right.value; + ce.style.borderBottomStyle = f.border_style_bottom.value; + ce.style.borderLeftStyle = f.border_style_left.value; + } else + ce.style.borderStyle = f.border_style_top.value; + + if (!f.border_width_same.checked) { + ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); + ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); + ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); + } else + ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + + if (!f.border_color_same.checked) { + ce.style.borderTopColor = f.border_color_top.value; + ce.style.borderRightColor = f.border_color_right.value; + ce.style.borderBottomColor = f.border_color_bottom.value; + ce.style.borderLeftColor = f.border_color_left.value; + } else + ce.style.borderColor = f.border_color_top.value; + + // Build list styles + + ce.style.listStyleType = f.list_type.value; + ce.style.listStylePosition = f.list_position.value; + ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; + + // Build positioning styles + + ce.style.position = f.positioning_type.value; + ce.style.visibility = f.positioning_visibility.value; + + if (ce.style.width == "") + ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); + + if (ce.style.height == "") + ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); + + ce.style.zIndex = f.positioning_zindex.value; + ce.style.overflow = f.positioning_overflow.value; + + if (!f.positioning_placement_same.checked) { + ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); + ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); + ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); + } else { + s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.top = s; + ce.style.right = s; + ce.style.bottom = s; + ce.style.left = s; + } + + if (!f.positioning_clip_same.checked) { + s = "rect("; + s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); + s += ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } else { + s = "rect("; + t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; + s += t + " "; + s += t + " "; + s += t + " "; + s += t + ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } + + ce.style.cssText = ce.style.cssText; +} + +function isNum(s) { + return new RegExp('[0-9]+', 'g').test(s); +} + +function showDisabledControls() { + var f = document.forms, i, a; + + for (i=0; i 1) { + addSelectValue(f, s, p[0], p[1]); + + if (se) + selectByValue(f, s, p[1]); + } else { + addSelectValue(f, s, p[0], p[0]); + + if (se) + selectByValue(f, s, p[0]); + } + } +} + +function toggleSame(ce, pre) { + var el = document.forms[0].elements, i; + + if (ce.checked) { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = true; + el[pre + "_bottom"].disabled = true; + el[pre + "_left"].disabled = true; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = true; + el[pre + "_bottom_measurement"].disabled = true; + el[pre + "_left_measurement"].disabled = true; + } + } else { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = false; + el[pre + "_bottom"].disabled = false; + el[pre + "_left"].disabled = false; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = false; + el[pre + "_bottom_measurement"].disabled = false; + el[pre + "_left_measurement"].disabled = false; + } + } + + showDisabledControls(); +} + +function synch(fr, to) { + var f = document.forms[0]; + + f.elements[to].value = f.elements[fr].value; + + if (f.elements[fr + "_measurement"]) + selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); +} + +function updateTextDecorations(){ + var el = document.forms[0].elements; + + var textDecorations = ["text_underline", "text_overline", "text_linethrough", "text_blink"]; + var noneChecked = el["text_none"].checked; + tinymce.each(textDecorations, function(id) { + el[id].disabled = noneChecked; + if (noneChecked) { + el[id].checked = false; + } + }); +} + +tinyMCEPopup.onInit.add(init); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/de_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/de_dlg.js new file mode 100644 index 0000000..ad04664 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.style_dlg',{"text_lineheight":"Zeilenh\u00f6he","text_variant":"Variante","text_style":"Stil","text_weight":"Dicke","text_size":"Gr\u00f6\u00dfe","text_font":"Schriftart","text_props":"Text","positioning_tab":"Positionierung","list_tab":"Liste","border_tab":"Rahmen","box_tab":"Box","block_tab":"Block","background_tab":"Hintergrund","text_tab":"Text",apply:"\u00dcbernehmen",title:"CSS-Styles bearbeiten",clip:"Ausschnitt",placement:"Platzierung",overflow:"Verhalten bei \u00dcbergr\u00f6\u00dfe",zindex:"Z-Wert",visibility:"Sichtbar","positioning_type":"Art der Positionierung",position:"Positionierung","bullet_image":"Listenpunkt-Grafik","list_type":"Listenpunkt-Art",color:"Textfarbe",height:"H\u00f6he",width:"Breite",style:"Format",margin:"\u00c4u\u00dferer Abstand",left:"Links",bottom:"Unten",right:"Rechts",top:"Oben",same:"Alle gleich",padding:"Innerer Abstand","box_clear":"Umflie\u00dfung verhindern","box_float":"Umflie\u00dfung","box_height":"H\u00f6he","box_width":"Breite","block_display":"Umbruchverhalten","block_whitespace":"Automatischer Umbruch","block_text_indent":"Einr\u00fcckung","block_text_align":"Ausrichtung","block_vertical_alignment":"Vertikale Ausrichtung","block_letterspacing":"Buchstabenabstand","block_wordspacing":"Wortabstand","background_vpos":"Position Y","background_hpos":"Position X","background_attachment":"Wasserzeicheneffekt","background_repeat":"Wiederholung","background_image":"Hintergrundbild","background_color":"Hintergrundfarbe","text_none":"keine","text_blink":"blinkend","text_case":"Schreibung","text_striketrough":"durchgestrichen","text_underline":"unterstrichen","text_overline":"\u00fcberstrichen","text_decoration":"Gestaltung","text_color":"Farbe",text:"Text",background:"Hintergrund",block:"Block",box:"Box",border:"Rahmen",list:"Liste"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/en_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/en_dlg.js new file mode 100644 index 0000000..35881b3 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",toggle_insert_span:"Insert span at selection",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"}); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/props.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/props.htm new file mode 100644 index 0000000..7dc087a --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/props.htm @@ -0,0 +1,845 @@ + + + + {#style_dlg.title} + + + + + + + + + + +
+ + +
+
+
+ {#style_dlg.text} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
  + + +
+
+ +
+ + + +
+ + + + + + +
+ +   + + +
+
+ +
+ + + + + +
 
+
{#style_dlg.text_decoration} + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ {#style_dlg.background} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
 
+
+ + + + +
 
+
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+
+
+ +
+
+ {#style_dlg.block} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+ + + + + + +
  + + + +
+
+
+
+ +
+
+ {#style_dlg.box} + + + + + + + + + + + + + + +
+ + + + + + +
  + + +
+
   
+ + + + + + +
  + + +
+
   
+
+ +
+
+ {#style_dlg.padding} + + + + + + + + + + + + + + + + + + + + + + +
 
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+
+
+ +
+
+ {#style_dlg.margin} + + + + + + + + + + + + + + + + + + + + + + +
 
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+ + + + + + +
  + + +
+
+
+
+
+
+ +
+
+ {#style_dlg.border} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
      
{#style_dlg.top}   + + + + + + +
  + + +
+
  + + + + + +
 
+
{#style_dlg.right}   + + + + + + +
  + + +
+
  + + + + + +
 
+
{#style_dlg.bottom}   + + + + + + +
  + + +
+
  + + + + + +
 
+
{#style_dlg.left}   + + + + + + +
  + + +
+
  + + + + + +
 
+
+
+
+ +
+
+ {#style_dlg.list} + + + + + + + + + + + + + + + +
+
+
+ +
+
+ {#style_dlg.position} + + + + + + + + + + + + + + + + + + + + + +
   
+ + + + + + +
  + + +
+
   
+ + + + + + +
  + + +
+
   
+
+ +
+
+ {#style_dlg.placement} + + + + + + + + + + + + + + + + + + + + + + +
 
{#style_dlg.top} + + + + + + +
  + + +
+
{#style_dlg.right} + + + + + + +
  + + +
+
{#style_dlg.bottom} + + + + + + +
  + + +
+
{#style_dlg.left} + + + + + + +
  + + +
+
+
+
+ +
+
+ {#style_dlg.clip} + + + + + + + + + + + + + + + + + + + + + + +
 
{#style_dlg.top} + + + + + + +
  + + +
+
{#style_dlg.right} + + + + + + +
  + + +
+
{#style_dlg.bottom} + + + + + + +
  + + +
+
{#style_dlg.left} + + + + + + +
  + + +
+
+
+
+
+
+
+ +
+ + +
+ +
+ + + +
+
+ +
+
+
+ + + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/readme.txt b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/readme.txt new file mode 100644 index 0000000..5bac302 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/style/readme.txt @@ -0,0 +1,19 @@ +Edit CSS Style plug-in notes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Unlike WYSIWYG editor functionality that operates only on the selected text, +typically by inserting new HTML elements with the specified styles. +This plug-in operates on the HTML blocks surrounding the selected text. +No new HTML elements are created. + +This plug-in only operates on the surrounding blocks and not the nearest +parent node. This means that if a block encapsulates a node, +e.g

text

, then only the styles in the block are +recognized, not those in the span. + +When selecting text that includes multiple blocks at the same level (peers), +this plug-in accumulates the specified styles in all of the surrounding blocks +and populates the dialogue checkboxes accordingly. There is no differentiation +between styles set in all the blocks versus styles set in some of the blocks. + +When the [Update] or [Apply] buttons are pressed, the styles selected in the +checkboxes are applied to all blocks that surround the selected text. diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js new file mode 100644 index 0000000..2c51291 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js @@ -0,0 +1 @@ +(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(t){n=c.select(":input:enabled,*[tabindex]:not(iframe)");function s(v){return v.nodeName==="BODY"||(v.type!="hidden"&&!(v.style.display=="none")&&!(v.style.visibility=="hidden")&&s(v.parentNode))}function i(v){return v.attributes.tabIndex.specified||v.nodeName=="INPUT"||v.nodeName=="TEXTAREA"}function u(){return tinymce.isIE6||tinymce.isIE7}function r(v){return((!u()||i(v)))&&v.getAttribute("tabindex")!="-1"&&s(v)}d(n,function(w,v){if(w.id==l.id){j=v;return false}});if(t>0){for(m=j+1;m=0;m--){if(r(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js new file mode 100644 index 0000000..94f4532 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js @@ -0,0 +1,122 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; + + tinymce.create('tinymce.plugins.TabFocusPlugin', { + init : function(ed, url) { + function tabCancel(ed, e) { + if (e.keyCode === 9) + return Event.cancel(e); + } + + function tabHandler(ed, e) { + var x, i, f, el, v; + + function find(d) { + el = DOM.select(':input:enabled,*[tabindex]:not(iframe)'); + + function canSelectRecursive(e) { + return e.nodeName==="BODY" || (e.type != 'hidden' && + !(e.style.display == "none") && + !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode)); + } + function canSelectInOldIe(el) { + return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA"; + } + function isOldIe() { + return tinymce.isIE6 || tinymce.isIE7; + } + function canSelect(el) { + return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el); + } + + each(el, function(e, i) { + if (e.id == ed.id) { + x = i; + return false; + } + }); + if (d > 0) { + for (i = x + 1; i < el.length; i++) { + if (canSelect(el[i])) + return el[i]; + } + } else { + for (i = x - 1; i >= 0; i--) { + if (canSelect(el[i])) + return el[i]; + } + } + + return null; + } + + if (e.keyCode === 9) { + v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); + + if (v.length == 1) { + v[1] = v[0]; + v[0] = ':prev'; + } + + // Find element to focus + if (e.shiftKey) { + if (v[0] == ':prev') + el = find(-1); + else + el = DOM.get(v[0]); + } else { + if (v[1] == ':next') + el = find(1); + else + el = DOM.get(v[1]); + } + + if (el) { + if (el.id && (ed = tinymce.get(el.id || el.name))) + ed.focus(); + else + window.setTimeout(function() { + if (!tinymce.isWebKit) + window.focus(); + el.focus(); + }, 10); + + return Event.cancel(e); + } + } + } + + ed.onKeyUp.add(tabCancel); + + if (tinymce.isGecko) { + ed.onKeyPress.add(tabHandler); + ed.onKeyDown.add(tabCancel); + } else + ed.onKeyDown.add(tabHandler); + + }, + + getInfo : function() { + return { + longname : 'Tabfocus', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); +})(); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/cell.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/cell.htm new file mode 100644 index 0000000..2922f7a --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/cell.htm @@ -0,0 +1,180 @@ + + + + {#table_dlg.cell_title} + + + + + + + + + +
+ + +
+
+
+ {#table_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+
+
+ +
+
+ {#table_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/cell.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/cell.css new file mode 100644 index 0000000..a47cc1a --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/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/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/row.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/row.css new file mode 100644 index 0000000..0e397db --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/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/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/table.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/css/table.css new file mode 100644 index 0000000..8f10783 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/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: 245px; +} + +.advfield { + width: 200px; +} + +#class { + width: 150px; +} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin.js new file mode 100644 index 0000000..4a92e1b --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin.js @@ -0,0 +1 @@ +(function(d){var e=d.each;function c(g,h){var j=h.ownerDocument,f=j.createRange(),k;f.setStartBefore(h);f.setEnd(g.endContainer,g.endOffset);k=j.createElement("body");k.appendChild(f.cloneContents());return k.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(g,f){return parseInt(g.getAttribute(f)||1)}function b(H,G,K){var g,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;g=[];e(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);e(O,function(P,Q){Q+=M;e(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(g[Q]){while(g[Q][R]){R++}}U=a(W,"rowspan");V=a(W,"colspan");for(T=Q;T'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!d.isIE||d.isIE11){M.innerHTML='
'}}return M}function q(){var M=G.createRng();e(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}e(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=g[Math.min(g.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=g[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=g[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(f(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(f(P.cells[0]),P.cells[0])}}}}}function C(){e(g,function(M,N){e(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=a(P,"colspan");R=a(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&g[M-1][R]){V=g[M-1][R].elm;O=a(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=f(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function h(N){var O,M;e(g,function(P,Q){e(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});e(g,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=a(P,"colspan");Q=a(P,"rowspan");if(R==1){if(!N){G.insertAfter(f(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(f(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];e(g,function(N,O){e(N,function(Q,P){if(j(Q)&&d.inArray(M,P)===-1){e(g,function(T){var R=T[P].elm,S;S=a(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");e(Q.cells,function(S){var T=a(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);e(g[R.y],function(S){var T;S=S.elm;if(S!=O){T=a(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();e(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();e(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){if(!O){return}var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;e(g,function(S){var R;Q=0;e(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}e(O,function(T){var S=T.cells.length,R;for(i=0;iN){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=g[y][P];if(!S.real){if(P-(S.colspan-1)N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(g[y][x]){G.addClass(g[y][x].elm,"mceSelected")}}}}}d.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:h,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}d.create("tinymce.plugins.TablePlugin",{init:function(g,h){var f,m,j=true;function l(p){var o=g.selection,n=g.dom.getParent(p||o.getNode(),"table");if(n){return new b(n,g.dom,o)}}function k(){g.getBody().style.webkitUserSelect="";if(j){g.dom.removeClass(g.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");j=false}}e([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(n){g.addButton(n[0],{title:n[1],cmd:n[2],ui:n[3]})});if(!d.isIE){g.onClick.add(function(n,o){o=o.target;if(o.nodeName==="TABLE"){n.selection.select(o);n.nodeChanged()}})}g.onPreProcess.add(function(o,p){var n,q,r,t=o.dom,s;n=t.select("table",p.node);q=n.length;while(q--){r=n[q];t.setAttrib(r,"data-mce-style","");if((s=t.getAttrib(r,"width"))){t.setStyle(r,"width",s);t.setAttrib(r,"width","")}if((s=t.getAttrib(r,"height"))){t.setStyle(r,"height",s);t.setAttrib(r,"height","")}}});g.onNodeChange.add(function(q,o,s){var r;s=q.selection.getStart();r=q.dom.getParent(s,"td,th,caption");o.setActive("table",s.nodeName==="TABLE"||!!r);if(r&&r.nodeName==="CAPTION"){r=0}o.setDisabled("delete_table",!r);o.setDisabled("delete_col",!r);o.setDisabled("delete_table",!r);o.setDisabled("delete_row",!r);o.setDisabled("col_after",!r);o.setDisabled("col_before",!r);o.setDisabled("row_after",!r);o.setDisabled("row_before",!r);o.setDisabled("row_props",!r);o.setDisabled("cell_props",!r);o.setDisabled("split_cells",!r);o.setDisabled("merge_cells",!r)});g.onInit.add(function(r){var p,t,q=r.dom,u;f=r.windowManager;r.onMouseDown.add(function(w,z){if(z.button!=2){k();t=q.getParent(z.target,"td,th");p=q.getParent(t,"table")}});q.bind(r.getDoc(),"mouseover",function(C){var A,z,B=C.target;if(t&&(u||B!=t)&&(B.nodeName=="TD"||B.nodeName=="TH")){z=q.getParent(B,"table");if(z==p){if(!u){u=l(z);u.setStartCell(t);r.getBody().style.webkitUserSelect="none"}u.setEndCell(B);j=true}A=r.selection.getSel();try{if(A.removeAllRanges){A.removeAllRanges()}else{A.empty()}}catch(w){}C.preventDefault()}});r.onMouseUp.add(function(F,G){var z,B=F.selection,H,I=B.getSel(),w,C,A,E;if(t){if(u){F.getBody().style.webkitUserSelect=""}function D(J,L){var K=new d.dom.TreeWalker(J,J);do{if(J.nodeType==3&&d.trim(J.nodeValue).length!=0){if(L){z.setStart(J,0)}else{z.setEnd(J,J.nodeValue.length)}return}if(J.nodeName=="BR"){if(L){z.setStartBefore(J)}else{z.setEndBefore(J)}return}}while(J=(L?K.next():K.prev()))}H=q.select("td.mceSelected,th.mceSelected");if(H.length>0){z=q.createRng();C=H[0];E=H[H.length-1];z.setStartBefore(C);z.setEndAfter(C);D(C,1);w=new d.dom.TreeWalker(C,q.getParent(H[0],"table"));do{if(C.nodeName=="TD"||C.nodeName=="TH"){if(!q.hasClass(C,"mceSelected")){break}A=C}}while(C=w.next());D(A);B.setRng(z)}F.nodeChanged();t=u=p=null}});r.onKeyUp.add(function(w,z){k()});r.onKeyDown.add(function(w,z){n(w)});r.onMouseDown.add(function(w,z){if(z.button!=2){n(w)}});function o(D,z,A,F){var B=3,G=D.dom.getParent(z.startContainer,"TABLE"),C,w,E;if(G){C=G.parentNode}w=z.startContainer.nodeType==B&&z.startOffset==0&&z.endOffset==0&&F&&(A.nodeName=="TR"||A==C);E=(A.nodeName=="TD"||A.nodeName=="TH")&&!F;return w||E}function n(A){if(!d.isWebKit){return}var z=A.selection.getRng();var C=A.selection.getNode();var B=A.dom.getParent(z.startContainer,"TD,TH");if(!o(A,z,C,B)){return}if(!B){B=C}var w=B.lastChild;while(w.lastChild){w=w.lastChild}z.setEnd(w,w.nodeValue.length);A.selection.setRng(z)}r.plugins.table.fixTableCellSelection=n;if(r&&r.plugins.contextmenu){r.plugins.contextmenu.onContextMenu.add(function(A,w,C){var D,B=r.selection,z=B.getNode()||r.getBody();if(r.dom.getParent(C,"td")||r.dom.getParent(C,"th")||r.dom.select("td.mceSelected,th.mceSelected").length){w.removeAll();if(z.nodeName=="A"&&!r.dom.getAttrib(z,"name")){w.add({title:"advanced.link_desc",icon:"link",cmd:r.plugins.advlink?"mceAdvLink":"mceLink",ui:true});w.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});w.addSeparator()}if(z.nodeName=="IMG"&&z.className.indexOf("mceItem")==-1){w.add({title:"advanced.image_desc",icon:"image",cmd:r.plugins.advimage?"mceAdvImage":"mceImage",ui:true});w.addSeparator()}w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});w.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});w.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});w.addSeparator();D=w.addMenu({title:"table.cell"});D.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});D.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});D.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});D=w.addMenu({title:"table.row"});D.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});D.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});D.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});D.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});D.addSeparator();D.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});D.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});D.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!m);D.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!m);D=w.addMenu({title:"table.col"});D.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});D.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});D.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(d.isWebKit){function v(C,N){var L=d.VK;var Q=N.keyCode;function O(Y,U,S){var T=Y?"previousSibling":"nextSibling";var Z=C.dom.getParent(U,"tr");var X=Z[T];if(X){z(C,U,X,Y);d.dom.Event.cancel(S);return true}else{var aa=C.dom.getParent(Z,"table");var W=Z.parentNode;var R=W.nodeName.toLowerCase();if(R==="tbody"||R===(Y?"tfoot":"thead")){var V=w(Y,aa,W,"tbody");if(V!==null){return K(Y,V,U,S)}}return M(Y,Z,T,aa,S)}}function w(V,T,U,X){var S=C.dom.select(">"+X,T);var R=S.indexOf(U);if(V&&R===0||!V&&R===S.length-1){return B(V,T)}else{if(R===-1){var W=U.tagName.toLowerCase()==="thead"?0:S.length-1;return S[W]}else{return S[R+(V?-1:1)]}}}function B(U,T){var S=U?"thead":"tfoot";var R=C.dom.select(">"+S,T);return R.length!==0?R[0]:null}function K(V,T,S,U){var R=J(T,V);R&&z(C,S,R,V);d.dom.Event.cancel(U);return true}function M(Y,U,R,X,W){var S=X[R];if(S){F(S);return true}else{var V=C.dom.getParent(X,"td,th");if(V){return O(Y,V,W)}else{var T=J(U,!Y);F(T);return d.dom.Event.cancel(W)}}}function J(S,R){var T=S&&S[R?"lastChild":"firstChild"];return T&&T.nodeName==="BR"?C.dom.getParent(T,"td,th"):T}function F(R){C.selection.setCursorLocation(R,0)}function A(){return Q==L.UP||Q==L.DOWN}function D(R){var T=R.selection.getNode();var S=R.dom.getParent(T,"tr");return S!==null}function P(S){var R=0;var T=S;while(T.previousSibling){T=T.previousSibling;R=R+a(T,"colspan")}return R}function E(T,R){var U=0;var S=0;e(T.children,function(V,W){U=U+a(V,"colspan");S=W;if(U>R){return false}});return S}function z(T,W,Y,V){var X=P(T.dom.getParent(W,"td,th"));var S=E(Y,X);var R=Y.childNodes[S];var U=J(R,V);F(U||R)}function H(R){var T=C.selection.getNode();var U=C.dom.getParent(T,"td,th");var S=C.dom.getParent(R,"td,th");return U&&U!==S&&I(U,S)}function I(S,R){return C.dom.getParent(S,"TABLE")===C.dom.getParent(R,"TABLE")}if(A()&&D(C)){var G=C.selection.getNode();setTimeout(function(){if(H(G)){O(!N.shiftKey&&Q===L.UP,G,N)}},0)}}r.onKeyDown.add(v)}function s(){var w;for(w=r.getBody().lastChild;w&&w.nodeType==3&&!w.nodeValue.length;w=w.previousSibling){}if(w&&w.nodeName=="TABLE"){if(r.settings.forced_root_block){r.dom.add(r.getBody(),r.settings.forced_root_block,null,d.isIE&&!d.isIE11?" ":'
')}else{r.dom.add(r.getBody(),"br",{"data-mce-bogus":"1"})}}}if(d.isGecko){r.onKeyDown.add(function(z,B){var w,A,C=z.dom;if(B.keyCode==37||B.keyCode==38){w=z.selection.getRng();A=C.getParent(w.startContainer,"table");if(A&&z.getBody().firstChild==A){if(c(w,A)){w=C.createRng();w.setStartBefore(A);w.setEndBefore(A);z.selection.setRng(w);B.preventDefault()}}}})}r.onKeyUp.add(s);r.onSetContent.add(s);r.onVisualAid.add(s);r.onPreProcess.add(function(w,A){var z=A.node.lastChild;if(z&&(z.nodeName=="BR"||(z.childNodes.length==1&&(z.firstChild.nodeName=="BR"||z.firstChild.nodeValue=="\u00a0")))&&z.previousSibling&&z.previousSibling.nodeName=="TABLE"){w.dom.remove(z)}});s();r.startContent=r.getContent({format:"raw"})});e({mceTableSplitCells:function(n){n.split()},mceTableMergeCells:function(o){var p,q,n;n=g.dom.getParent(g.selection.getNode(),"th,td");if(n){p=n.rowSpan;q=n.colSpan}if(!g.dom.select("td.mceSelected,th.mceSelected").length){f.open({url:h+"/merge_cells.htm",width:240+parseInt(g.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(g.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:p,cols:q,onaction:function(r){o.merge(n,r.cols,r.rows)},plugin_url:h})}else{o.merge()}},mceTableInsertRowBefore:function(n){n.insertRow(true)},mceTableInsertRowAfter:function(n){n.insertRow()},mceTableInsertColBefore:function(n){n.insertCol(true)},mceTableInsertColAfter:function(n){n.insertCol()},mceTableDeleteCol:function(n){n.deleteCols()},mceTableDeleteRow:function(n){n.deleteRows()},mceTableCutRow:function(n){m=n.cutRows()},mceTableCopyRow:function(n){m=n.copyRows()},mceTablePasteRowBefore:function(n){n.pasteRows(m,true)},mceTablePasteRowAfter:function(n){n.pasteRows(m)},mceTableDelete:function(n){n.deleteTable()}},function(o,n){g.addCommand(n,function(){var p=l();if(p){o(p);g.execCommand("mceRepaint");k()}})});e({mceInsertTable:function(n){f.open({url:h+"/table.htm",width:400+parseInt(g.getLang("table.table_delta_width",0)),height:320+parseInt(g.getLang("table.table_delta_height",0)),inline:1},{plugin_url:h,action:n?n.action:0})},mceTableRowProps:function(){f.open({url:h+"/row.htm",width:400+parseInt(g.getLang("table.rowprops_delta_width",0)),height:295+parseInt(g.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:h})},mceTableCellProps:function(){f.open({url:h+"/cell.htm",width:400+parseInt(g.getLang("table.cellprops_delta_width",0)),height:295+parseInt(g.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:h})}},function(o,n){g.addCommand(n,function(p,q){o(q)})})}});d.PluginManager.add("table",d.plugins.TablePlugin)})(tinymce); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin_src.js new file mode 100644 index 0000000..0456483 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/editor_plugin_src.js @@ -0,0 +1,1456 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var each = tinymce.each; + + // Checks if the selection/caret is at the start of the specified block element + function isAtStart(rng, par) { + var doc = par.ownerDocument, rng2 = doc.createRange(), elm; + + rng2.setStartBefore(par); + rng2.setEnd(rng.endContainer, rng.endOffset); + + elm = doc.createElement('body'); + elm.appendChild(rng2.cloneContents()); + + // Check for text characters of other elements that should be treated as content + return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; + }; + + function getSpanVal(td, name) { + return parseInt(td.getAttribute(name) || 1); + } + + /** + * Table Grid class. + */ + function TableGrid(table, dom, selection) { + var grid, startPos, endPos, selectedCell; + + buildGrid(); + selectedCell = dom.getParent(selection.getStart(), 'th,td'); + if (selectedCell) { + startPos = getPos(selectedCell); + endPos = findEndPos(); + selectedCell = getCell(startPos.x, startPos.y); + } + + function cloneNode(node, children) { + node = node.cloneNode(children); + node.removeAttribute('id'); + + return node; + } + + function buildGrid() { + var startY = 0; + + grid = []; + + each(['thead', 'tbody', 'tfoot'], function(part) { + var rows = dom.select('> ' + part + ' tr', table); + + each(rows, function(tr, y) { + y += startY; + + each(dom.select('> td, > th', tr), function(td, x) { + var x2, y2, rowspan, colspan; + + // Skip over existing cells produced by rowspan + if (grid[y]) { + while (grid[y][x]) + x++; + } + + // Get col/rowspan from cell + rowspan = getSpanVal(td, 'rowspan'); + colspan = getSpanVal(td, 'colspan'); + + // Fill out rowspan/colspan right and down + for (y2 = y; y2 < y + rowspan; y2++) { + if (!grid[y2]) + grid[y2] = []; + + for (x2 = x; x2 < x + colspan; x2++) { + grid[y2][x2] = { + part : part, + real : y2 == y && x2 == x, + elm : td, + rowspan : rowspan, + colspan : colspan + }; + } + } + }); + }); + + startY += rows.length; + }); + }; + + function getCell(x, y) { + var row; + + row = grid[y]; + if (row) + return row[x]; + }; + + function setSpanVal(td, name, val) { + if (td) { + val = parseInt(val); + + if (val === 1) + td.removeAttribute(name, 1); + else + td.setAttribute(name, val, 1); + } + } + + function isCellSelected(cell) { + return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell); + }; + + function getSelectedRows() { + var rows = []; + + each(table.rows, function(row) { + each(row.cells, function(cell) { + if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { + rows.push(row); + return false; + } + }); + }); + + return rows; + }; + + function deleteTable() { + var rng = dom.createRng(); + + rng.setStartAfter(table); + rng.setEndAfter(table); + + selection.setRng(rng); + + dom.remove(table); + }; + + function cloneCell(cell) { + var formatNode; + + // Clone formats + tinymce.walk(cell, function(node) { + var curNode; + + if (node.nodeType == 3) { + each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { + node = cloneNode(node, false); + + if (!formatNode) + formatNode = curNode = node; + else if (curNode) + curNode.appendChild(node); + + curNode = node; + }); + + // Add something to the inner node + if (curNode) + curNode.innerHTML = tinymce.isIE && !tinymce.isIE11 ? ' ' : '
'; + + return false; + } + }, 'childNodes'); + + cell = cloneNode(cell, false); + setSpanVal(cell, 'rowSpan', 1); + setSpanVal(cell, 'colSpan', 1); + + if (formatNode) { + cell.appendChild(formatNode); + } else { + if (!tinymce.isIE || tinymce.isIE11) + cell.innerHTML = '
'; + } + + return cell; + }; + + function cleanup() { + var rng = dom.createRng(); + + // Empty rows + each(dom.select('tr', table), function(tr) { + if (tr.cells.length == 0) + dom.remove(tr); + }); + + // Empty table + if (dom.select('tr', table).length == 0) { + rng.setStartAfter(table); + rng.setEndAfter(table); + selection.setRng(rng); + dom.remove(table); + return; + } + + // Empty header/body/footer + each(dom.select('thead,tbody,tfoot', table), function(part) { + if (part.rows.length == 0) + dom.remove(part); + }); + + // Restore selection to start position if it still exists + buildGrid(); + + // Restore the selection to the closest table position + row = grid[Math.min(grid.length - 1, startPos.y)]; + if (row) { + selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); + selection.collapse(true); + } + }; + + function fillLeftDown(x, y, rows, cols) { + var tr, x2, r, c, cell; + + tr = grid[y][x].elm.parentNode; + for (r = 1; r <= rows; r++) { + tr = dom.getNext(tr, 'tr'); + + if (tr) { + // Loop left to find real cell + for (x2 = x; x2 >= 0; x2--) { + cell = grid[y + r][x2].elm; + + if (cell.parentNode == tr) { + // Append clones after + for (c = 1; c <= cols; c++) + dom.insertAfter(cloneCell(cell), cell); + + break; + } + } + + if (x2 == -1) { + // Insert nodes before first cell + for (c = 1; c <= cols; c++) + tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); + } + } + } + }; + + function split() { + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan, newCell, i; + + if (isCellSelected(cell)) { + cell = cell.elm; + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan > 1 || rowSpan > 1) { + setSpanVal(cell, 'rowSpan', 1); + setSpanVal(cell, 'colSpan', 1); + + // Insert cells right + for (i = 0; i < colSpan - 1; i++) + dom.insertAfter(cloneCell(cell), cell); + + fillLeftDown(x, y, rowSpan - 1, colSpan); + } + } + }); + }); + }; + + function merge(cell, cols, rows) { + var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count; + + // Use specified cell and cols/rows + if (cell) { + pos = getPos(cell); + startX = pos.x; + startY = pos.y; + endX = startX + (cols - 1); + endY = startY + (rows - 1); + } else { + startPos = endPos = null; + + // Calculate start/end pos by checking for selected cells in grid works better with context menu + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + if (!startPos) { + startPos = {x: x, y: y}; + } + + endPos = {x: x, y: y}; + } + }); + }); + + // Use selection + startX = startPos.x; + startY = startPos.y; + endX = endPos.x; + endY = endPos.y; + } + + // Find start/end cells + startCell = getCell(startX, startY); + endCell = getCell(endX, endY); + + // Check if the cells exists and if they are of the same part for example tbody = tbody + if (startCell && endCell && startCell.part == endCell.part) { + // Split and rebuild grid + split(); + buildGrid(); + + // Set row/col span to start cell + startCell = getCell(startX, startY).elm; + setSpanVal(startCell, 'colSpan', (endX - startX) + 1); + setSpanVal(startCell, 'rowSpan', (endY - startY) + 1); + + // Remove other cells and add it's contents to the start cell + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + if (!grid[y] || !grid[y][x]) + continue; + + cell = grid[y][x].elm; + + if (cell != startCell) { + // Move children to startCell + children = tinymce.grep(cell.childNodes); + each(children, function(node) { + startCell.appendChild(node); + }); + + // Remove bogus nodes if there is children in the target cell + if (children.length) { + children = tinymce.grep(startCell.childNodes); + count = 0; + each(children, function(node) { + if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1) + startCell.removeChild(node); + }); + } + + // Remove cell + dom.remove(cell); + } + } + } + + // Remove empty rows etc and restore caret location + cleanup(); + } + }; + + function insertRow(before) { + var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan; + + // Find first/last row + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + cell = cell.elm; + rowElm = cell.parentNode; + newRow = cloneNode(rowElm, false); + posY = y; + + if (before) + return false; + } + }); + + if (before) + return !posY; + }); + + for (x = 0; x < grid[0].length; x++) { + // Cell not found could be because of an invalid table structure + if (!grid[posY][x]) + continue; + + cell = grid[posY][x].elm; + + if (cell != lastCell) { + if (!before) { + rowSpan = getSpanVal(cell, 'rowspan'); + if (rowSpan > 1) { + setSpanVal(cell, 'rowSpan', rowSpan + 1); + continue; + } + } else { + // Check if cell above can be expanded + if (posY > 0 && grid[posY - 1][x]) { + otherCell = grid[posY - 1][x].elm; + rowSpan = getSpanVal(otherCell, 'rowSpan'); + if (rowSpan > 1) { + setSpanVal(otherCell, 'rowSpan', rowSpan + 1); + continue; + } + } + } + + // Insert new cell into new row + newCell = cloneCell(cell); + setSpanVal(newCell, 'colSpan', cell.colSpan); + + newRow.appendChild(newCell); + + lastCell = cell; + } + } + + if (newRow.hasChildNodes()) { + if (!before) + dom.insertAfter(newRow, rowElm); + else + rowElm.parentNode.insertBefore(newRow, rowElm); + } + }; + + function insertCol(before) { + var posX, lastCell; + + // Find first/last column + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + posX = x; + + if (before) + return false; + } + }); + + if (before) + return !posX; + }); + + each(grid, function(row, y) { + var cell, rowSpan, colSpan; + + if (!row[posX]) + return; + + cell = row[posX].elm; + if (cell != lastCell) { + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan == 1) { + if (!before) { + dom.insertAfter(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } else { + cell.parentNode.insertBefore(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } + } else + setSpanVal(cell, 'colSpan', cell.colSpan + 1); + + lastCell = cell; + } + }); + }; + + function deleteCols() { + var cols = []; + + // Get selected column indexes + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { + each(grid, function(row) { + var cell = row[x].elm, colSpan; + + colSpan = getSpanVal(cell, 'colSpan'); + + if (colSpan > 1) + setSpanVal(cell, 'colSpan', colSpan - 1); + else + dom.remove(cell); + }); + + cols.push(x); + } + }); + }); + + cleanup(); + }; + + function deleteRows() { + var rows; + + function deleteRow(tr) { + var nextTr, pos, lastCell; + + nextTr = dom.getNext(tr, 'tr'); + + // Move down row spanned cells + each(tr.cells, function(cell) { + var rowSpan = getSpanVal(cell, 'rowSpan'); + + if (rowSpan > 1) { + setSpanVal(cell, 'rowSpan', rowSpan - 1); + pos = getPos(cell); + fillLeftDown(pos.x, pos.y, 1, 1); + } + }); + + // Delete cells + pos = getPos(tr.cells[0]); + each(grid[pos.y], function(cell) { + var rowSpan; + + cell = cell.elm; + + if (cell != lastCell) { + rowSpan = getSpanVal(cell, 'rowSpan'); + + if (rowSpan <= 1) + dom.remove(cell); + else + setSpanVal(cell, 'rowSpan', rowSpan - 1); + + lastCell = cell; + } + }); + }; + + // Get selected rows and move selection out of scope + rows = getSelectedRows(); + + // Delete all selected rows + each(rows.reverse(), function(tr) { + deleteRow(tr); + }); + + cleanup(); + }; + + function cutRows() { + var rows = getSelectedRows(); + + dom.remove(rows); + cleanup(); + + return rows; + }; + + function copyRows() { + var rows = getSelectedRows(); + + each(rows, function(row, i) { + rows[i] = cloneNode(row, true); + }); + + return rows; + }; + + function pasteRows(rows, before) { + // If we don't have any rows in the clipboard, return immediately + if(!rows) + return; + + var selectedRows = getSelectedRows(), + targetRow = selectedRows[before ? 0 : selectedRows.length - 1], + targetCellCount = targetRow.cells.length; + + // Calc target cell count + each(grid, function(row) { + var match; + + targetCellCount = 0; + each(row, function(cell, x) { + if (cell.real) + targetCellCount += cell.colspan; + + if (cell.elm.parentNode == targetRow) + match = 1; + }); + + if (match) + return false; + }); + + if (!before) + rows.reverse(); + + each(rows, function(row) { + var cellCount = row.cells.length, cell; + + // Remove col/rowspans + for (i = 0; i < cellCount; i++) { + cell = row.cells[i]; + setSpanVal(cell, 'colSpan', 1); + setSpanVal(cell, 'rowSpan', 1); + } + + // Needs more cells + for (i = cellCount; i < targetCellCount; i++) + row.appendChild(cloneCell(row.cells[cellCount - 1])); + + // Needs less cells + for (i = targetCellCount; i < cellCount; i++) + dom.remove(row.cells[i]); + + // Add before/after + if (before) + targetRow.parentNode.insertBefore(row, targetRow); + else + dom.insertAfter(row, targetRow); + }); + + // Remove current selection + dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + }; + + function getPos(target) { + var pos; + + each(grid, function(row, y) { + each(row, function(cell, x) { + if (cell.elm == target) { + pos = {x : x, y : y}; + return false; + } + }); + + return !pos; + }); + + return pos; + }; + + function setStartCell(cell) { + startPos = getPos(cell); + }; + + function findEndPos() { + var pos, maxX, maxY; + + maxX = maxY = 0; + + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan; + + if (isCellSelected(cell)) { + cell = grid[y][x]; + + if (x > maxX) + maxX = x; + + if (y > maxY) + maxY = y; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + }); + }); + + return {x : maxX, y : maxY}; + }; + + function setEndCell(cell) { + var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; + + endPos = getPos(cell); + + if (startPos && endPos) { + // Get start/end positions + startX = Math.min(startPos.x, endPos.x); + startY = Math.min(startPos.y, endPos.y); + endX = Math.max(startPos.x, endPos.x); + endY = Math.max(startPos.y, endPos.y); + + // Expand end positon to include spans + maxX = endX; + maxY = endY; + + // Expand startX + for (y = startY; y <= maxY; y++) { + cell = grid[y][startX]; + + if (!cell.real) { + if (startX - (cell.colspan - 1) < startX) + startX -= cell.colspan - 1; + } + } + + // Expand startY + for (x = startX; x <= maxX; x++) { + cell = grid[startY][x]; + + if (!cell.real) { + if (startY - (cell.rowspan - 1) < startY) + startY -= cell.rowspan - 1; + } + } + + // Find max X, Y + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + cell = grid[y][x]; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + } + + // Remove current selection + dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + + // Add new selection + for (y = startY; y <= maxY; y++) { + for (x = startX; x <= maxX; x++) { + if (grid[y][x]) + dom.addClass(grid[y][x].elm, 'mceSelected'); + } + } + } + }; + + // Expose to public + tinymce.extend(this, { + deleteTable : deleteTable, + split : split, + merge : merge, + insertRow : insertRow, + insertCol : insertCol, + deleteCols : deleteCols, + deleteRows : deleteRows, + cutRows : cutRows, + copyRows : copyRows, + pasteRows : pasteRows, + getPos : getPos, + setStartCell : setStartCell, + setEndCell : setEndCell + }); + }; + + tinymce.create('tinymce.plugins.TablePlugin', { + init : function(ed, url) { + var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload + + function createTableGrid(node) { + var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); + + if (tblElm) + return new TableGrid(tblElm, ed.dom, selection); + }; + + function cleanup() { + // Restore selection possibilities + ed.getBody().style.webkitUserSelect = ''; + + if (hasCellSelection) { + ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + hasCellSelection = false; + } + }; + + // Register buttons + each([ + ['table', 'table.desc', 'mceInsertTable', true], + ['delete_table', 'table.del', 'mceTableDelete'], + ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], + ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], + ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], + ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], + ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], + ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], + ['row_props', 'table.row_desc', 'mceTableRowProps', true], + ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], + ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], + ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] + ], function(c) { + ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); + }); + + // Select whole table is a table border is clicked + if (!tinymce.isIE) { + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'TABLE') { + ed.selection.select(e); + ed.nodeChanged(); + } + }); + } + + ed.onPreProcess.add(function(ed, args) { + var nodes, i, node, dom = ed.dom, value; + + nodes = dom.select('table', args.node); + i = nodes.length; + while (i--) { + node = nodes[i]; + dom.setAttrib(node, 'data-mce-style', ''); + + if ((value = dom.getAttrib(node, 'width'))) { + dom.setStyle(node, 'width', value); + dom.setAttrib(node, 'width', ''); + } + + if ((value = dom.getAttrib(node, 'height'))) { + dom.setStyle(node, 'height', value); + dom.setAttrib(node, 'height', ''); + } + } + }); + + // Handle node change updates + ed.onNodeChange.add(function(ed, cm, n) { + var p; + + n = ed.selection.getStart(); + p = ed.dom.getParent(n, 'td,th,caption'); + cm.setActive('table', n.nodeName === 'TABLE' || !!p); + + // Disable table tools if we are in caption + if (p && p.nodeName === 'CAPTION') + p = 0; + + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_col', !p); + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_row', !p); + cm.setDisabled('col_after', !p); + cm.setDisabled('col_before', !p); + cm.setDisabled('row_after', !p); + cm.setDisabled('row_before', !p); + cm.setDisabled('row_props', !p); + cm.setDisabled('cell_props', !p); + cm.setDisabled('split_cells', !p); + cm.setDisabled('merge_cells', !p); + }); + + ed.onInit.add(function(ed) { + var startTable, startCell, dom = ed.dom, tableGrid; + + winMan = ed.windowManager; + + // Add cell selection logic + ed.onMouseDown.add(function(ed, e) { + if (e.button != 2) { + cleanup(); + + startCell = dom.getParent(e.target, 'td,th'); + startTable = dom.getParent(startCell, 'table'); + } + }); + + dom.bind(ed.getDoc(), 'mouseover', function(e) { + var sel, table, target = e.target; + + if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { + table = dom.getParent(target, 'table'); + if (table == startTable) { + if (!tableGrid) { + tableGrid = createTableGrid(table); + tableGrid.setStartCell(startCell); + + ed.getBody().style.webkitUserSelect = 'none'; + } + + tableGrid.setEndCell(target); + hasCellSelection = true; + } + + // Remove current selection + sel = ed.selection.getSel(); + + try { + if (sel.removeAllRanges) + sel.removeAllRanges(); + else + sel.empty(); + } catch (ex) { + // IE9 might throw errors here + } + + e.preventDefault(); + } + }); + + ed.onMouseUp.add(function(ed, e) { + var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; + + // Move selection to startCell + if (startCell) { + if (tableGrid) + ed.getBody().style.webkitUserSelect = ''; + + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); + + return; + } + + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); + + return; + } + } while (node = (start ? walker.next() : walker.prev())); + } + + // Try to expand text selection as much as we can only Gecko supports cell selection + selectedCells = dom.select('td.mceSelected,th.mceSelected'); + if (selectedCells.length > 0) { + rng = dom.createRng(); + node = selectedCells[0]; + endNode = selectedCells[selectedCells.length - 1]; + rng.setStartBefore(node); + rng.setEndAfter(node); + + setPoint(node, 1); + walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); + + do { + if (node.nodeName == 'TD' || node.nodeName == 'TH') { + if (!dom.hasClass(node, 'mceSelected')) + break; + + lastNode = node; + } + } while (node = walker.next()); + + setPoint(lastNode); + + sel.setRng(rng); + } + + ed.nodeChanged(); + startCell = tableGrid = startTable = null; + } + }); + + ed.onKeyUp.add(function(ed, e) { + cleanup(); + }); + + ed.onKeyDown.add(function (ed, e) { + fixTableCellSelection(ed); + }); + + ed.onMouseDown.add(function (ed, e) { + if (e.button != 2) { + fixTableCellSelection(ed); + } + }); + function tableCellSelected(ed, rng, n, currentCell) { + // The decision of when a table cell is selected is somewhat involved. The fact that this code is + // required is actually a pointer to the root cause of this bug. A cell is selected when the start + // and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases) + // or the parent of the table (in the case of the selection containing the last cell of a table). + var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'), + tableParent, allOfCellSelected, tableCellSelection; + if (table) + tableParent = table.parentNode; + allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE && + rng.startOffset == 0 && + rng.endOffset == 0 && + currentCell && + (n.nodeName=="TR" || n==tableParent); + tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell; + return allOfCellSelected || tableCellSelection; + // return false; + } + + // this nasty hack is here to work around some WebKit selection bugs. + function fixTableCellSelection(ed) { + if (!tinymce.isWebKit) + return; + + var rng = ed.selection.getRng(); + var n = ed.selection.getNode(); + var currentCell = ed.dom.getParent(rng.startContainer, 'TD,TH'); + + if (!tableCellSelected(ed, rng, n, currentCell)) + return; + if (!currentCell) { + currentCell=n; + } + + // Get the very last node inside the table cell + var end = currentCell.lastChild; + while (end.lastChild) + end = end.lastChild; + + // Select the entire table cell. Nothing outside of the table cell should be selected. + rng.setEnd(end, end.nodeValue.length); + ed.selection.setRng(rng); + } + ed.plugins.table.fixTableCellSelection=fixTableCellSelection; + + // Add context menu + if (ed && ed.plugins.contextmenu) { + ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { + var sm, se = ed.selection, el = se.getNode() || ed.getBody(); + + if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { + m.removeAll(); + + if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { + m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); + m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); + m.addSeparator(); + } + + if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { + m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); + m.addSeparator(); + } + + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); + m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); + m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); + m.addSeparator(); + + // Cell menu + sm = m.addMenu({title : 'table.cell'}); + sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); + sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); + sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); + + // Row menu + sm = m.addMenu({title : 'table.row'}); + sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); + sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); + sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); + sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); + sm.addSeparator(); + sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); + sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); + sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); + sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); + + // Column menu + sm = m.addMenu({title : 'table.col'}); + sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); + sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); + sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); + } else + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); + }); + } + + // Fix to allow navigating up and down in a table in WebKit browsers. + if (tinymce.isWebKit) { + function moveSelection(ed, e) { + var VK = tinymce.VK; + var key = e.keyCode; + + function handle(upBool, sourceNode, event) { + var siblingDirection = upBool ? 'previousSibling' : 'nextSibling'; + var currentRow = ed.dom.getParent(sourceNode, 'tr'); + var siblingRow = currentRow[siblingDirection]; + + if (siblingRow) { + moveCursorToRow(ed, sourceNode, siblingRow, upBool); + tinymce.dom.Event.cancel(event); + return true; + } else { + var tableNode = ed.dom.getParent(currentRow, 'table'); + var middleNode = currentRow.parentNode; + var parentNodeName = middleNode.nodeName.toLowerCase(); + if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) { + var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody'); + if (targetParent !== null) { + return moveToRowInTarget(upBool, targetParent, sourceNode, event); + } + } + return escapeTable(upBool, currentRow, siblingDirection, tableNode, event); + } + } + + function getTargetParent(upBool, topNode, secondNode, nodeName) { + var tbodies = ed.dom.select('>' + nodeName, topNode); + var position = tbodies.indexOf(secondNode); + if (upBool && position === 0 || !upBool && position === tbodies.length - 1) { + return getFirstHeadOrFoot(upBool, topNode); + } else if (position === -1) { + var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1; + return tbodies[topOrBottom]; + } else { + return tbodies[position + (upBool ? -1 : 1)]; + } + } + + function getFirstHeadOrFoot(upBool, parent) { + var tagName = upBool ? 'thead' : 'tfoot'; + var headOrFoot = ed.dom.select('>' + tagName, parent); + return headOrFoot.length !== 0 ? headOrFoot[0] : null; + } + + function moveToRowInTarget(upBool, targetParent, sourceNode, event) { + var targetRow = getChildForDirection(targetParent, upBool); + targetRow && moveCursorToRow(ed, sourceNode, targetRow, upBool); + tinymce.dom.Event.cancel(event); + return true; + } + + function escapeTable(upBool, currentRow, siblingDirection, table, event) { + var tableSibling = table[siblingDirection]; + if (tableSibling) { + moveCursorToStartOfElement(tableSibling); + return true; + } else { + var parentCell = ed.dom.getParent(table, 'td,th'); + if (parentCell) { + return handle(upBool, parentCell, event); + } else { + var backUpSibling = getChildForDirection(currentRow, !upBool); + moveCursorToStartOfElement(backUpSibling); + return tinymce.dom.Event.cancel(event); + } + } + } + + function getChildForDirection(parent, up) { + var child = parent && parent[up ? 'lastChild' : 'firstChild']; + // BR is not a valid table child to return in this case we return the table cell + return child && child.nodeName === 'BR' ? ed.dom.getParent(child, 'td,th') : child; + } + + function moveCursorToStartOfElement(n) { + ed.selection.setCursorLocation(n, 0); + } + + function isVerticalMovement() { + return key == VK.UP || key == VK.DOWN; + } + + function isInTable(ed) { + var node = ed.selection.getNode(); + var currentRow = ed.dom.getParent(node, 'tr'); + return currentRow !== null; + } + + function columnIndex(column) { + var colIndex = 0; + var c = column; + while (c.previousSibling) { + c = c.previousSibling; + colIndex = colIndex + getSpanVal(c, "colspan"); + } + return colIndex; + } + + function findColumn(rowElement, columnIndex) { + var c = 0; + var r = 0; + each(rowElement.children, function(cell, i) { + c = c + getSpanVal(cell, "colspan"); + r = i; + if (c > columnIndex) + return false; + }); + return r; + } + + function moveCursorToRow(ed, node, row, upBool) { + var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th')); + var tgtColumnIndex = findColumn(row, srcColumnIndex); + var tgtNode = row.childNodes[tgtColumnIndex]; + var rowCellTarget = getChildForDirection(tgtNode, upBool); + moveCursorToStartOfElement(rowCellTarget || tgtNode); + } + + function shouldFixCaret(preBrowserNode) { + var newNode = ed.selection.getNode(); + var newParent = ed.dom.getParent(newNode, 'td,th'); + var oldParent = ed.dom.getParent(preBrowserNode, 'td,th'); + return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent) + } + + function checkSameParentTable(nodeOne, NodeTwo) { + return ed.dom.getParent(nodeOne, 'TABLE') === ed.dom.getParent(NodeTwo, 'TABLE'); + } + + if (isVerticalMovement() && isInTable(ed)) { + var preBrowserNode = ed.selection.getNode(); + setTimeout(function() { + if (shouldFixCaret(preBrowserNode)) { + handle(!e.shiftKey && key === VK.UP, preBrowserNode, e); + } + }, 0); + } + } + + ed.onKeyDown.add(moveSelection); + } + + // Fixes an issue on Gecko where it's impossible to place the caret behind a table + // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled + function fixTableCaretPos() { + var last; + + // Skip empty text nodes form the end + for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; + + if (last && last.nodeName == 'TABLE') { + if (ed.settings.forced_root_block) + ed.dom.add(ed.getBody(), ed.settings.forced_root_block, null, tinymce.isIE && !tinymce.isIE11 ? ' ' : '
'); + else + ed.dom.add(ed.getBody(), 'br', {'data-mce-bogus': '1'}); + } + }; + + // Fixes an bug where it's impossible to place the caret before a table in Gecko + // this fix solves it by detecting when the caret is at the beginning of such a table + // and then manually moves the caret infront of the table + if (tinymce.isGecko) { + ed.onKeyDown.add(function(ed, e) { + var rng, table, dom = ed.dom; + + // On gecko it's not possible to place the caret before a table + if (e.keyCode == 37 || e.keyCode == 38) { + rng = ed.selection.getRng(); + table = dom.getParent(rng.startContainer, 'table'); + + if (table && ed.getBody().firstChild == table) { + if (isAtStart(rng, table)) { + rng = dom.createRng(); + + rng.setStartBefore(table); + rng.setEndBefore(table); + + ed.selection.setRng(rng); + + e.preventDefault(); + } + } + } + }); + } + + ed.onKeyUp.add(fixTableCaretPos); + ed.onSetContent.add(fixTableCaretPos); + ed.onVisualAid.add(fixTableCaretPos); + + ed.onPreProcess.add(function(ed, o) { + var last = o.node.lastChild; + + if (last && (last.nodeName == "BR" || (last.childNodes.length == 1 && (last.firstChild.nodeName == 'BR' || last.firstChild.nodeValue == '\u00a0'))) && last.previousSibling && last.previousSibling.nodeName == "TABLE") { + ed.dom.remove(last); + } + }); + + + /** + * Fixes bug in Gecko where shift-enter in table cell does not place caret on new line + * + * Removed: Since the new enter logic seems to fix this one. + */ + /* + if (tinymce.isGecko) { + ed.onKeyDown.add(function(ed, e) { + if (e.keyCode === tinymce.VK.ENTER && e.shiftKey) { + var node = ed.selection.getRng().startContainer; + var tableCell = dom.getParent(node, 'td,th'); + if (tableCell) { + var zeroSizedNbsp = ed.getDoc().createTextNode("\uFEFF"); + dom.insertAfter(zeroSizedNbsp, node); + } + } + }); + } + */ + + fixTableCaretPos(); + ed.startContent = ed.getContent({format : 'raw'}); + }); + + // Register action commands + each({ + mceTableSplitCells : function(grid) { + grid.split(); + }, + + mceTableMergeCells : function(grid) { + var rowSpan, colSpan, cell; + + cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); + if (cell) { + rowSpan = cell.rowSpan; + colSpan = cell.colSpan; + } + + if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { + winMan.open({ + url : url + '/merge_cells.htm', + width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), + height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), + inline : 1 + }, { + rows : rowSpan, + cols : colSpan, + onaction : function(data) { + grid.merge(cell, data.cols, data.rows); + }, + plugin_url : url + }); + } else + grid.merge(); + }, + + mceTableInsertRowBefore : function(grid) { + grid.insertRow(true); + }, + + mceTableInsertRowAfter : function(grid) { + grid.insertRow(); + }, + + mceTableInsertColBefore : function(grid) { + grid.insertCol(true); + }, + + mceTableInsertColAfter : function(grid) { + grid.insertCol(); + }, + + mceTableDeleteCol : function(grid) { + grid.deleteCols(); + }, + + mceTableDeleteRow : function(grid) { + grid.deleteRows(); + }, + + mceTableCutRow : function(grid) { + clipboardRows = grid.cutRows(); + }, + + mceTableCopyRow : function(grid) { + clipboardRows = grid.copyRows(); + }, + + mceTablePasteRowBefore : function(grid) { + grid.pasteRows(clipboardRows, true); + }, + + mceTablePasteRowAfter : function(grid) { + grid.pasteRows(clipboardRows); + }, + + mceTableDelete : function(grid) { + grid.deleteTable(); + } + }, function(func, name) { + ed.addCommand(name, function() { + var grid = createTableGrid(); + + if (grid) { + func(grid); + ed.execCommand('mceRepaint'); + cleanup(); + } + }); + }); + + // Register dialog commands + each({ + mceInsertTable : function(val) { + winMan.open({ + url : url + '/table.htm', + width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), + height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + action : val ? val.action : 0 + }); + }, + + mceTableRowProps : function() { + winMan.open({ + url : url + '/row.htm', + width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }, + + mceTableCellProps : function() { + winMan.open({ + url : url + '/cell.htm', + width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + } + }, function(func, name) { + ed.addCommand(name, function(ui, val) { + func(val); + }); + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); +})(tinymce); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/cell.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/cell.js new file mode 100644 index 0000000..6f77e67 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/js/cell.js @@ -0,0 +1,319 @@ +tinyMCEPopup.requireLangPack(); + +var ed; + +function init() { + ed = tinyMCEPopup.editor; + 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 = ed; + var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th"); + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style")); + + // Get table cell data + var celltype = tdElm.nodeName.toLowerCase(); + var align = ed.dom.getAttrib(tdElm, 'align'); + var valign = ed.dom.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 = ed.dom.getAttrib(tdElm, 'class'); + var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + var id = ed.dom.getAttrib(tdElm, 'id'); + var lang = ed.dom.getAttrib(tdElm, 'lang'); + var dir = ed.dom.getAttrib(tdElm, 'dir'); + var scope = ed.dom.getAttrib(tdElm, 'scope'); + + // Setup form + addClassesToList('class', 'table_cell_styles'); + TinyMCE_EditableSelects.init(); + + if (!ed.dom.hasClass(tdElm, 'mceSelected')) { + 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 = ed.dom.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className, true, true); + 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'); + } else + tinyMCEPopup.dom.hide('action'); +} + +function updateAction() { + var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; + + if (!AutoValidator.validate(formObj)) { + tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); + return false; + } + + tinyMCEPopup.restoreSelection(); + el = ed.selection.getStart(); + tdElm = ed.dom.getParent(el, "td,th"); + trElm = ed.dom.getParent(el, "tr"); + tableElm = ed.dom.getParent(el, "table"); + + // Cell is selected + if (ed.dom.hasClass(tdElm, 'mceSelected')) { + // Update all selected sells + tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) { + updateCell(td); + }); + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + return; + } + + switch (getSelectValue(formObj, 'action')) { + case "cell": + var celltype = getSelectValue(formObj, 'celltype'); + var scope = getSelectValue(formObj, 'scope'); + + function doUpdate(s) { + if (s) { + updateCell(tdElm); + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + } + }; + + if (ed.getParam("accessibility_warnings", 1)) { + if (celltype == "th" && scope == "") + tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate); + else + doUpdate(1); + + 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 "col": + var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr"); + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + if (cell == tdElm) + break; + col += cell.getAttribute("colspan")?cell.getAttribute("colspan"):1; + } while ((cell = nextCell(cell)) != null); + + for (var i=0; i 0) { + tinymce.each(tableElm.rows, function(tr) { + var i; + + for (i = 0; i < tr.cells.length; i++) { + if (dom.hasClass(tr.cells[i], 'mceSelected')) { + updateRow(tr, true); + return; + } + } + }); + + inst.addVisual(); + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + return; + } + + switch (action) { + case "row": + updateRow(trElm); + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i colLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); + return false; + } else if (rowLimit && rows > rowLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); + return false; + } else if (cellLimit && cols * rows > cellLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); + return false; + } + + // Update table + if (action == "update") { + dom.setAttrib(elm, 'cellPadding', cellpadding, true); + dom.setAttrib(elm, 'cellSpacing', cellspacing, true); + + if (!isCssSize(border)) { + dom.setAttrib(elm, 'border', border); + } else { + dom.setAttrib(elm, 'border', ''); + } + + if (border == '') { + dom.setStyle(elm, 'border-width', ''); + dom.setStyle(elm, 'border', ''); + dom.setAttrib(elm, 'border', ''); + } + + dom.setAttrib(elm, 'align', align); + dom.setAttrib(elm, 'frame', frame); + dom.setAttrib(elm, 'rules', rules); + dom.setAttrib(elm, 'class', className); + dom.setAttrib(elm, 'style', style); + dom.setAttrib(elm, 'id', id); + dom.setAttrib(elm, 'summary', summary); + dom.setAttrib(elm, 'dir', dir); + dom.setAttrib(elm, 'lang', lang); + + capEl = inst.dom.select('caption', elm)[0]; + + if (capEl && !caption) + capEl.parentNode.removeChild(capEl); + + if (!capEl && caption) { + capEl = elm.ownerDocument.createElement('caption'); + + if (!tinymce.isIE || tinymce.isIE11) + capEl.innerHTML = '
'; + + elm.insertBefore(capEl, elm.firstChild); + } + + if (width && inst.settings.inline_styles) { + dom.setStyle(elm, 'width', width); + dom.setAttrib(elm, 'width', ''); + } else { + dom.setAttrib(elm, 'width', width, true); + dom.setStyle(elm, 'width', ''); + } + + // Remove these since they are not valid XHTML + dom.setAttrib(elm, 'borderColor', ''); + dom.setAttrib(elm, 'bgColor', ''); + dom.setAttrib(elm, 'background', ''); + + if (height && inst.settings.inline_styles) { + dom.setStyle(elm, 'height', height); + dom.setAttrib(elm, 'height', ''); + } else { + dom.setAttrib(elm, 'height', height, true); + dom.setStyle(elm, 'height', ''); + } + + if (background != '') + elm.style.backgroundImage = "url('" + background + "')"; + else + elm.style.backgroundImage = ''; + +/* if (tinyMCEPopup.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 = cssSize(border); + } else + elm.style.borderColor = ''; + + elm.style.backgroundColor = bgcolor; + elm.style.height = getCSSSize(height); + + inst.addVisual(); + + // Fix for stange MSIE align bug + //elm.outerHTML = elm.outerHTML; + + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true}); + + // Repaint if dimensions changed + if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) + inst.execCommand('mceRepaint'); + + tinyMCEPopup.close(); + return true; + } + + // Create new table + html += ''); + + tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { + if (patt) + patt += ','; + + patt += n + ' ._mce_marker'; + }); + + tinymce.each(inst.dom.select(patt), function(n) { + inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); + }); + + dom.setOuterHTML(dom.select('br._mce_marker')[0], html); + } else + inst.execCommand('mceInsertContent', false, html); + + tinymce.each(dom.select('table[data-mce-new]'), function(node) { + var tdorth = dom.select('td,th', node); + + // Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document + if (tinymce.isIE && !tinymce.isIE11 && node.nextSibling == null) { + if (inst.settings.forced_root_block) + dom.insertAfter(dom.create(inst.settings.forced_root_block), node); + else + dom.insertAfter(dom.create('br', {'data-mce-bogus': '1'}), node); + } + + try { + // IE9 might fail to do this selection + inst.selection.setCursorLocation(tdorth[0], 0); + } catch (ex) { + // Ignore + } + + dom.setAttrib(node, 'data-mce-new', ''); + }); + + inst.addVisual(); + inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true}); + + tinyMCEPopup.close(); +} + +function makeAttrib(attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value == "") + return ""; + + // XML encode it + value = value.replace(/&/g, '&'); + value = value.replace(/\"/g, '"'); + value = value.replace(//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 = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); + var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; + var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = ""; + var inst = tinyMCEPopup.editor, dom = inst.dom; + var formObj = document.forms[0]; + var elm = dom.getParent(inst.selection.getNode(), "table"); + + // Hide advanced fields that isn't available in the schema + tinymce.each("summary id rules dir style frame".split(" "), function(name) { + var tr = tinyMCEPopup.dom.getParent(name, "tr") || tinyMCEPopup.dom.getParent("t" + name, "tr"); + + if (tr && !tinyMCEPopup.editor.schema.isValid("table", name)) { + tr.style.display = 'none'; + } + }); + + action = tinyMCEPopup.getWindowArg('action'); + + if (!action) + action = elm ? "update" : "insert"; + + if (elm && action != "insert") { + var rowsAr = elm.rows; + var cols = 0; + for (var i=0; i cols) + cols = rowsAr[i].cells.length; + + cols = cols; + rows = rowsAr.length; + + st = dom.parseStyle(dom.getAttrib(elm, "style")); + border = trimSize(getStyle(elm, 'border', 'borderWidth')); + cellpadding = dom.getAttrib(elm, 'cellpadding', ""); + cellspacing = dom.getAttrib(elm, '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 = dom.getAttrib(elm, 'align', align); + frame = dom.getAttrib(elm, 'frame'); + rules = dom.getAttrib(elm, 'rules'); + className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); + id = dom.getAttrib(elm, 'id'); + summary = dom.getAttrib(elm, 'summary'); + style = dom.serializeStyle(st); + dir = dom.getAttrib(elm, 'dir'); + lang = dom.getAttrib(elm, 'lang'); + background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; + + orgTableWidth = width; + orgTableHeight = height; + + action = "update"; + formObj.insert.value = inst.getLang('update'); + } + + addClassesToList('class', "table_styles"); + TinyMCE_EditableSelects.init(); + + // Update form + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'tframe', frame); + selectByValue(formObj, 'rules', rules); + selectByValue(formObj, 'class', className, true, true); + 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; + + 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 = dom.parseStyle(formObj.style.value); + +/* var width = formObj.width.value; + if (width != "") + st['width'] = tinyMCEPopup.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 = dom.serializeStyle(st); +} + +function isCssSize(value) { + return /^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)$/.test(value); +} + +function cssSize(value, def) { + value = tinymce.trim(value || def); + + if (!isCssSize(value)) { + return parseInt(value, 10) + 'px'; + } + + return value; +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedBorder() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + // Update border width if the element has a color + if (formObj.border.value != "" && (isCssSize(formObj.border.value) || formObj.bordercolor.value != "")) + st['border-width'] = cssSize(formObj.border.value); + else { + if (!formObj.border.value) { + st['border'] = ''; + st['border-width'] = ''; + } + } + + formObj.style.value = dom.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = dom.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'] = cssSize(formObj.border.value, 1); + } + + formObj.style.value = dom.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = dom.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'); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/de_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/de_dlg.js new file mode 100644 index 0000000..1498c14 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.table_dlg',{"rules_border":"alle 4 Seiten (Border)","rules_box":"alle 4 Seiten (Box)","rules_vsides":"links und rechts","rules_rhs":"nur rechts","rules_lhs":"nur links","rules_hsides":"oben und unten","rules_below":"nur unten","rules_above":"nur oben","rules_void":"keins",rules:"Gitter","frame_all":"zwischen allen Zellen","frame_cols":"zwischen Spalten","frame_rows":"zwischen Zeilen","frame_groups":"zwischen Gruppen","frame_none":"keine",frame:"Rahmen",caption:"Beschriftung der Tabelle","missing_scope":"Soll f\u00fcr diese \u00dcberschrift wirklich kein Bereich angegeben werden? Benutzer mit k\u00f6rperlichen Einschr\u00e4nkungen k\u00f6nnten Schwierigkeiten haben, den Inhalt der Tabelle zu verstehen.","cell_limit":"Die maximale Zellenzahl von {$cells} wurde \u00fcberschritten.","row_limit":"Die maximale Zeilenzahl von {$rows} wurde \u00fcberschritten.","col_limit":"Die maximale Spaltenzahl von {$cols} wurde \u00fcberschritten.",colgroup:"Horizontal gruppieren",rowgroup:"Vertikal gruppieren",scope:"Bezug",tfoot:"Tabellenfu\u00df",tbody:"Tabelleninhalt",thead:"Tabellenkopf","row_all":"Alle Zeilen ver\u00e4ndern","row_even":"Gerade Zeilen ver\u00e4ndern","row_odd":"Ungerade Zeilen ver\u00e4ndern","row_row":"Diese Zeile ver\u00e4ndern","cell_all":"Alle Zellen der Tabelle ver\u00e4ndern","cell_row":"Alle Zellen in dieser Zeile ver\u00e4ndern","cell_cell":"Diese Zelle ver\u00e4ndern",th:"\u00dcberschrift",td:"Textzelle",summary:"Zusammenfassung",bgimage:"Hintergrundbild",rtl:"Rechts nach links",ltr:"Links nach rechts",mime:"MIME-Type des Inhalts",langcode:"Sprachcode",langdir:"Schriftrichtung",style:"Format",id:"ID","merge_cells_title":"Zellen vereinen",bgcolor:"Hintergrundfarbe",bordercolor:"Rahmenfarbe","align_bottom":"Unten","align_top":"Oben",valign:"Vertikale Ausrichtung","cell_type":"Zellentyp","cell_title":"Eigenschaften der Zelle","row_title":"Eigenschaften der Zeile","align_middle":"Mittig","align_right":"Rechts","align_left":"Links","align_default":"Standard",align:"Ausrichtung",border:"Rahmen",cellpadding:"Abstand innerhalb der Zellen",cellspacing:"Zellenabstand",rows:"Zeilen",cols:"Spalten",height:"H\u00f6he",width:"Breite",title:"Tabelle einf\u00fcgen/bearbeiten",rowtype:"Gruppierung","advanced_props":"Erweiterte Einstellungen","general_props":"Allgemeine Einstellungen","advanced_tab":"Erweitert","general_tab":"Allgemein","cell_col":"Alle Zellen in dieser Spalte aktualisieren"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/en_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/en_dlg.js new file mode 100644 index 0000000..463e09e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table Caption","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.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Footer",tbody:"Body",thead:"Header","row_all":"Update All Rows in Table","row_even":"Update Even Rows in Table","row_odd":"Update Odd Rows in Table","row_row":"Update Current Row","cell_all":"Update All Cells in Table","cell_row":"Update All Cells in Row","cell_cell":"Update Current Cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background Image",rtl:"Right to Left",ltr:"Left to Right",mime:"Target MIME Type",langcode:"Language Code",langdir:"Language Direction",style:"Style",id:"ID","merge_cells_title":"Merge Table Cells",bgcolor:"Background Color",bordercolor:"Border Color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical Alignment","cell_type":"Cell Type","cell_title":"Table Cell Properties","row_title":"Table Row Properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cell Padding",cellspacing:"Cell Spacing",rows:"Rows",cols:"Columns",height:"Height",width:"Width",title:"Insert/Edit Table",rowtype:"Row Type","advanced_props":"Advanced Properties","general_props":"General Properties","advanced_tab":"Advanced","general_tab":"General","cell_col":"Update all cells in column"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/merge_cells.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/merge_cells.htm new file mode 100644 index 0000000..788acf6 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/merge_cells.htm @@ -0,0 +1,32 @@ + + + + {#table_dlg.merge_cells_title} + + + + + + +
+
+ {#table_dlg.merge_cells_title} + + + + + + + + + +
:
:
+
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/row.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/row.htm new file mode 100644 index 0000000..7b46137 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/row.htm @@ -0,0 +1,158 @@ + + + + {#table_dlg.row_title} + + + + + + + + + +
+ + +
+
+
+ {#table_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ {#table_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + + +
 
+
+
+
+
+
+ +
+
+ +
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/table.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/table.htm new file mode 100644 index 0000000..52e6bf2 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/table/table.htm @@ -0,0 +1,188 @@ + + + + {#table_dlg.title} + + + + + + + + + + +
+ + +
+
+
+ {#table_dlg.general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ {#table_dlg.advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
 
+
+ +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/blank.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/blank.htm new file mode 100644 index 0000000..538a3b1 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/blank.htm @@ -0,0 +1,12 @@ + + + blank_page + + + + + + + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/css/template.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/css/template.css new file mode 100644 index 0000000..0a03f2e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/css/template.css @@ -0,0 +1,23 @@ +#frmbody { + padding: 10px; + background-color: #FFF; + border: 1px solid #CCC; +} + +.frmRow { + margin-bottom: 10px; +} + +#templatesrc { + border: none; + width: 320px; + height: 240px; +} + +.title { + padding-bottom: 5px; +} + +.mceActionPanel { + padding-top: 5px; +} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/editor_plugin.js new file mode 100644 index 0000000..ebe3c27 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length 0) { + el = dom.create('div', null); + el.appendChild(n[0].cloneNode(true)); + } + + function hasClass(n, c) { + return new RegExp('\\b' + c + '\\b', 'g').test(n.className); + }; + + each(dom.select('*', el), function(n) { + // Replace cdate + if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|'))) + n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format"))); + + // Replace mdate + if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) + n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); + + // Replace selection + if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|'))) + n.innerHTML = sel; + }); + + t._replaceVals(el); + + ed.execCommand('mceInsertContent', false, el.innerHTML); + ed.addVisual(); + }, + + _replaceVals : function(e) { + var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values'); + + each(dom.select('*', e), function(e) { + each(vl, function(v, k) { + if (dom.hasClass(e, k)) { + if (typeof(vl[k]) == 'function') + vl[k](e); + } + }); + }); + }, + + _getDateTime : function(d, fmt) { + if (!fmt) + return ""; + + function addZeros(value, len) { + var i; + + value = "" + value; + + if (value.length < len) { + for (i=0; i<(len-value.length); i++) + value = "0" + value; + } + + return value; + } + + fmt = fmt.replace("%D", "%m/%d/%y"); + fmt = fmt.replace("%r", "%I:%M:%S %p"); + fmt = fmt.replace("%Y", "" + d.getFullYear()); + fmt = fmt.replace("%y", "" + d.getYear()); + fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); + fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); + fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); + fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); + fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); + fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); + fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); + fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]); + fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]); + fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]); + fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]); + fmt = fmt.replace("%%", "%"); + + return fmt; + } + }); + + // Register plugin + tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/js/template.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/js/template.js new file mode 100644 index 0000000..673395a --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/template/js/template.js @@ -0,0 +1,106 @@ +tinyMCEPopup.requireLangPack(); + +var TemplateDialog = { + preInit : function() { + var url = tinyMCEPopup.getParam("template_external_list_url"); + + if (url != null) + document.write(''); + }, + + init : function() { + var ed = tinyMCEPopup.editor, tsrc, sel, x, u; + + tsrc = ed.getParam("template_templates", false); + sel = document.getElementById('tpath'); + + // Setup external template list + if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') { + for (x=0, tsrc = []; x'); + }); + }, + + selectTemplate : function(u, ti) { + var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc; + + if (!u) + return; + + d.body.innerHTML = this.templateHTML = this.getFileContents(u); + + for (x=0; x + + {#template_dlg.title} + + + + + +
+
+
{#template_dlg.desc}
+
+ +
+
+
+
+ {#template_dlg.preview} + +
+
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css new file mode 100644 index 0000000..681b588 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css @@ -0,0 +1,21 @@ +p, h1, h2, h3, h4, h5, h6, hgroup, aside, div, section, article, blockquote, address, pre, figure {display: block; padding-top: 10px; border: 1px dashed #BBB; background: transparent no-repeat} +p, h1, h2, h3, h4, h5, h6, hgroup, aside, div, section, article, address, pre, figure {margin-left: 3px} +section, article, address, hgroup, aside, figure {margin: 0 0 1em 3px} + +p {background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)} +h1 {background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)} +h2 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)} +h3 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)} +h4 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)} +h5 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)} +h6 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)} +div {background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)} +section {background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)} +article {background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)} +blockquote {background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)} +address {background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)} +pre {background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)} +hgroup {background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)} +aside {background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)} +figure {background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)} +figcaption {border: 1px dashed #BBB} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js new file mode 100644 index 0000000..c65eaf2 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.VisualBlocks",{init:function(a,b){var c;if(!window.NodeList){return}a.addCommand("mceVisualBlocks",function(){var e=a.dom,d;if(!c){c=e.uniqueId();d=e.create("link",{id:c,rel:"stylesheet",href:b+"/css/visualblocks.css"});a.getDoc().getElementsByTagName("head")[0].appendChild(d)}else{d=e.get(c);d.disabled=!d.disabled}a.controlManager.setActive("visualblocks",!d.disabled)});a.addButton("visualblocks",{title:"visualblocks.desc",cmd:"mceVisualBlocks"});a.onInit.add(function(){if(a.settings.visualblocks_default_state){a.execCommand("mceVisualBlocks",false,null,{skip_focus:true})}})},getInfo:function(){return{longname:"Visual blocks",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualblocks",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("visualblocks",tinymce.plugins.VisualBlocks)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js new file mode 100644 index 0000000..51f8a61 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js @@ -0,0 +1,63 @@ +/** + * editor_plugin_src.js + * + * Copyright 2012, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.VisualBlocks', { + init : function(ed, url) { + var cssId; + + // We don't support older browsers like IE6/7 and they don't provide prototypes for DOM objects + if (!window.NodeList) { + return; + } + + ed.addCommand('mceVisualBlocks', function() { + var dom = ed.dom, linkElm; + + if (!cssId) { + cssId = dom.uniqueId(); + linkElm = dom.create('link', { + id: cssId, + rel : 'stylesheet', + href : url + '/css/visualblocks.css' + }); + + ed.getDoc().getElementsByTagName('head')[0].appendChild(linkElm); + } else { + linkElm = dom.get(cssId); + linkElm.disabled = !linkElm.disabled; + } + + ed.controlManager.setActive('visualblocks', !linkElm.disabled); + }); + + ed.addButton('visualblocks', {title : 'visualblocks.desc', cmd : 'mceVisualBlocks'}); + + ed.onInit.add(function() { + if (ed.settings.visualblocks_default_state) { + ed.execCommand('mceVisualBlocks', false, null, {skip_focus : true}); + } + }); + }, + + getInfo : function() { + return { + longname : 'Visual blocks', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualblocks', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('visualblocks', tinymce.plugins.VisualBlocks); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js new file mode 100644 index 0000000..1a148e8 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g$1');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js new file mode 100644 index 0000000..0e3572e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js @@ -0,0 +1,83 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.VisualChars', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + + // Register commands + ed.addCommand('mceVisualChars', t._toggleVisualChars, t); + + // Register buttons + ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'}); + + ed.onBeforeGetContent.add(function(ed, o) { + if (t.state && o.format != 'raw' && !o.draft) { + t.state = true; + t._toggleVisualChars(false); + } + }); + }, + + getInfo : function() { + return { + longname : 'Visual characters', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + // Private methods + + _toggleVisualChars : function(bookmark) { + var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm; + + t.state = !t.state; + ed.controlManager.setActive('visualchars', t.state); + + if (bookmark) + bm = s.getBookmark(); + + if (t.state) { + nl = []; + tinymce.walk(b, function(n) { + if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1) + nl.push(n); + }, 'childNodes'); + + for (i = 0; i < nl.length; i++) { + nv = nl[i].nodeValue; + nv = nv.replace(/(\u00a0)/g, '$1'); + + div = ed.dom.create('div', null, nv); + while (node = div.lastChild) + ed.dom.insertAfter(node, nl[i]); + + ed.dom.remove(nl[i]); + } + } else { + nl = ed.dom.select('span.mceItemNbsp', b); + + for (i = nl.length - 1; i >= 0; i--) + ed.dom.remove(nl[i], 1); + } + + s.moveToBookmark(bm); + } + }); + + // Register plugin + tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js new file mode 100644 index 0000000..42ece20 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(c,d){var e=this,f=0,g=tinymce.VK;e.countre=c.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);e.cleanre=c.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);e.update_rate=c.getParam("wordcount_update_rate",2000);e.update_on_delete=c.getParam("wordcount_update_on_delete",false);e.id=c.id+"-word-count";c.onPostRender.add(function(i,h){var j,k;k=i.getParam("wordcount_target_id");if(!k){j=tinymce.DOM.get(i.id+"_path_row");if(j){tinymce.DOM.add(j.parentNode,"div",{style:"float: right"},i.getLang("wordcount.words","Words: ")+'0')}}else{tinymce.DOM.add(k,"span",{},'0')}});c.onInit.add(function(h){h.selection.onSetContent.add(function(){e._count(h)});e._count(h)});c.onSetContent.add(function(h){e._count(h)});function b(h){return h!==f&&(h===g.ENTER||f===g.SPACEBAR||a(f))}function a(h){return h===g.DELETE||h===g.BACKSPACE}c.onKeyUp.add(function(h,i){if(b(i.keyCode)||e.update_on_delete&&a(i.keyCode)){e._count(h)}f=i.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){if(!a.destroyed){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},b.update_rate)}},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js new file mode 100644 index 0000000..3fb8fff --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js @@ -0,0 +1,122 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.WordCount', { + block : 0, + id : null, + countre : null, + cleanre : null, + + init : function(ed, url) { + var t = this, last = 0, VK = tinymce.VK; + + t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == ’ + t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g); + t.update_rate = ed.getParam('wordcount_update_rate', 2000); + t.update_on_delete = ed.getParam('wordcount_update_on_delete', false); + t.id = ed.id + '-word-count'; + + ed.onPostRender.add(function(ed, cm) { + var row, id; + + // Add it to the specified id or the theme advanced path + id = ed.getParam('wordcount_target_id'); + if (!id) { + row = tinymce.DOM.get(ed.id + '_path_row'); + + if (row) + tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0'); + } else { + tinymce.DOM.add(id, 'span', {}, '0'); + } + }); + + ed.onInit.add(function(ed) { + ed.selection.onSetContent.add(function() { + t._count(ed); + }); + + t._count(ed); + }); + + ed.onSetContent.add(function(ed) { + t._count(ed); + }); + + function checkKeys(key) { + return key !== last && (key === VK.ENTER || last === VK.SPACEBAR || checkDelOrBksp(last)); + } + + function checkDelOrBksp(key) { + return key === VK.DELETE || key === VK.BACKSPACE; + } + + ed.onKeyUp.add(function(ed, e) { + if (checkKeys(e.keyCode) || t.update_on_delete && checkDelOrBksp(e.keyCode)) { + t._count(ed); + } + + last = e.keyCode; + }); + }, + + _getCount : function(ed) { + var tc = 0; + var tx = ed.getContent({ format: 'raw' }); + + if (tx) { + tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces + tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars + + // deal with html entities + tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' '); + tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation + + var wordArray = tx.match(this.countre); + if (wordArray) { + tc = wordArray.length; + } + } + + return tc; + }, + + _count : function(ed) { + var t = this; + + // Keep multiple calls from happening at the same time + if (t.block) + return; + + t.block = 1; + + setTimeout(function() { + if (!ed.destroyed) { + var tc = t._getCount(ed); + tinymce.DOM.setHTML(t.id, tc.toString()); + setTimeout(function() {t.block = 0;}, t.update_rate); + } + }, 1); + }, + + getInfo: function() { + return { + longname : 'Word Count plugin', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); +})(); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm new file mode 100644 index 0000000..d410218 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm @@ -0,0 +1,142 @@ + + + + {#xhtmlxtras_dlg.title_abbr_element} + + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm new file mode 100644 index 0000000..12b189b --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm @@ -0,0 +1,142 @@ + + + + {#xhtmlxtras_dlg.title_acronym_element} + + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm new file mode 100644 index 0000000..d84f378 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm @@ -0,0 +1,149 @@ + + + + {#xhtmlxtras_dlg.attribs_title} + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.attribute_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
+ +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.attribute_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm new file mode 100644 index 0000000..ab61b33 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm @@ -0,0 +1,142 @@ + + + + {#xhtmlxtras_dlg.title_cite_element} + + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css new file mode 100644 index 0000000..85b1b37 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css @@ -0,0 +1,11 @@ +.panel_wrapper div.current { + height: 290px; +} + +#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey { + width: 200px; +} + +#events_panel input { + width: 200px; +} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css new file mode 100644 index 0000000..034b985 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css @@ -0,0 +1,9 @@ +input.field, select.field {width:200px;} +input.picker {width:179px; margin-left: 5px;} +input.disabled {border-color:#F2F2F2;} +img.picker {vertical-align:text-bottom; cursor:pointer;} +h1 {padding: 0 0 5px 0;} +.panel_wrapper div.current {height:160px;} +#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;} +a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;} +#datetime {width:180px;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm new file mode 100644 index 0000000..e3f34c7 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm @@ -0,0 +1,162 @@ + + + + {#xhtmlxtras_dlg.title_del_element} + + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_general_tab} + + + + + + + + + +
: + + + + + +
+
:
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js new file mode 100644 index 0000000..9b98a51 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380+parseInt(a.getLang("xhtmlxtras.attr_delta_width",0)),height:370+parseInt(a.getLang("xhtmlxtras.attr_delta_height",0)),inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js new file mode 100644 index 0000000..a9c12ef --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js @@ -0,0 +1,132 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceCite', function() { + ed.windowManager.open({ + file : url + '/cite.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAcronym', function() { + ed.windowManager.open({ + file : url + '/acronym.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAbbr', function() { + ed.windowManager.open({ + file : url + '/abbr.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceDel', function() { + ed.windowManager.open({ + file : url + '/del.htm', + width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceIns', function() { + ed.windowManager.open({ + file : url + '/ins.htm', + width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAttributes', function() { + ed.windowManager.open({ + file : url + '/attributes.htm', + width : 380 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)), + height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'}); + ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'}); + ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'}); + ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'}); + ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'}); + ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'}); + + ed.onNodeChange.add(function(ed, cm, n, co) { + n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS'); + + cm.setDisabled('cite', co); + cm.setDisabled('acronym', co); + cm.setDisabled('abbr', co); + cm.setDisabled('del', co); + cm.setDisabled('ins', co); + cm.setDisabled('attribs', n && n.nodeName == 'BODY'); + cm.setActive('cite', 0); + cm.setActive('acronym', 0); + cm.setActive('abbr', 0); + cm.setActive('del', 0); + cm.setActive('ins', 0); + + // Activate all + if (n) { + do { + cm.setDisabled(n.nodeName.toLowerCase(), 0); + cm.setActive(n.nodeName.toLowerCase(), 1); + } while (n = n.parentNode); + } + }); + + ed.onPreInit.add(function() { + // Fixed IE issue where it can't handle these elements correctly + ed.dom.create('abbr'); + }); + }, + + getInfo : function() { + return { + longname : 'XHTML Xtras Plugin', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm new file mode 100644 index 0000000..226e605 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm @@ -0,0 +1,162 @@ + + + + {#xhtmlxtras_dlg.title_ins_element} + + + + + + + + + + +
+ + +
+
+
+ {#xhtmlxtras_dlg.fieldset_general_tab} + + + + + + + + + +
: + + + + + +
+
:
+
+
+ {#xhtmlxtras_dlg.fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {#xhtmlxtras_dlg.fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+ + + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js new file mode 100644 index 0000000..1790e83 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js @@ -0,0 +1,28 @@ +/** + * abbr.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('abbr'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAbbr() { + SXE.insertElement('abbr'); + tinyMCEPopup.close(); +} + +function removeAbbr() { + SXE.removeElement('abbr'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js new file mode 100644 index 0000000..93b8d25 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js @@ -0,0 +1,28 @@ +/** + * acronym.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('acronym'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAcronym() { + SXE.insertElement('acronym'); + tinyMCEPopup.close(); +} + +function removeAcronym() { + SXE.removeElement('acronym'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js new file mode 100644 index 0000000..9e9b07e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js @@ -0,0 +1,111 @@ +/** + * attributes.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + tinyMCEPopup.resizeToInnerSize(); + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + var elm = inst.selection.getNode(); + var f = document.forms[0]; + var onclick = dom.getAttrib(elm, 'onclick'); + + setFormValue('title', dom.getAttrib(elm, 'title')); + setFormValue('id', dom.getAttrib(elm, 'id')); + setFormValue('style', dom.getAttrib(elm, "style")); + setFormValue('dir', dom.getAttrib(elm, 'dir')); + setFormValue('lang', dom.getAttrib(elm, 'lang')); + setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); + setFormValue('onblur', dom.getAttrib(elm, 'onblur')); + setFormValue('onclick', onclick); + setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); + setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); + setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); + setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); + setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); + setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); + setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); + setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); + setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); + className = dom.getAttrib(elm, 'class'); + + addClassesToList('classlist', 'advlink_styles'); + selectByValue(f, 'classlist', className, true); + + TinyMCE_EditableSelects.init(); +} + +function setFormValue(name, value) { + if(value && document.forms[0].elements[name]){ + document.forms[0].elements[name].value = value; + } +} + +function insertAction() { + var inst = tinyMCEPopup.editor; + var elm = inst.selection.getNode(); + + setAllAttribs(elm); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib.toLowerCase()]; + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + dom.setAttrib(elm, attrib.toLowerCase(), value); +} + +function setAllAttribs(elm) { + var f = document.forms[0]; + + setAttrib(elm, 'title'); + setAttrib(elm, 'id'); + setAttrib(elm, 'style'); + setAttrib(elm, 'class', getSelectValue(f, 'classlist')); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + setAttrib(elm, 'tabindex'); + setAttrib(elm, 'accesskey'); + setAttrib(elm, 'onfocus'); + setAttrib(elm, 'onblur'); + setAttrib(elm, 'onclick'); + setAttrib(elm, 'ondblclick'); + setAttrib(elm, 'onmousedown'); + setAttrib(elm, 'onmouseup'); + setAttrib(elm, 'onmouseover'); + setAttrib(elm, 'onmousemove'); + setAttrib(elm, 'onmouseout'); + setAttrib(elm, 'onkeypress'); + setAttrib(elm, 'onkeydown'); + setAttrib(elm, 'onkeyup'); + + // Refresh in old MSIE +// if (tinyMCE.isMSIE5) +// elm.outerHTML = elm.outerHTML; +} + +function insertAttribute() { + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); +tinyMCEPopup.requireLangPack(); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js new file mode 100644 index 0000000..b73ef47 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js @@ -0,0 +1,28 @@ +/** + * cite.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('cite'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertCite() { + SXE.insertElement('cite'); + tinyMCEPopup.close(); +} + +function removeCite() { + SXE.removeElement('cite'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js new file mode 100644 index 0000000..a5397f7 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js @@ -0,0 +1,53 @@ +/** + * del.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('del'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); + elm.removeAttribute('data-mce-new'); +} + +function insertDel() { + var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL'); + + if (elm == null) { + var s = SXE.inst.selection.getContent(); + if(s.length > 0) { + insertInlineElement('del'); + var elementArray = SXE.inst.dom.select('del[data-mce-new]'); + for (var i=0; i 0) { + tagName = element_name; + + insertInlineElement(element_name); + var elementArray = tinymce.grep(SXE.inst.dom.select(element_name)); + for (var i=0; i -1) ? true : false; +} + +SXE.removeClass = function(elm,cl) { + if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { + return true; + } + var classNames = elm.className.split(" "); + var newClassNames = ""; + for (var x = 0, cnl = classNames.length; x < cnl; x++) { + if (classNames[x] != cl) { + newClassNames += (classNames[x] + " "); + } + } + elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end +} + +SXE.addClass = function(elm,cl) { + if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; + return true; +} + +function insertInlineElement(en) { + var ed = tinyMCEPopup.editor, dom = ed.dom; + + ed.getDoc().execCommand('FontName', false, 'mceinline'); + tinymce.each(dom.select('span,font'), function(n) { + if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') + dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1); + }); +} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js new file mode 100644 index 0000000..71a8a26 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js @@ -0,0 +1,53 @@ +/** + * ins.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('ins'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); + elm.removeAttribute('data-mce-new'); +} + +function insertIns() { + var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS'); + + if (elm == null) { + var s = SXE.inst.selection.getContent(); + if(s.length > 0) { + insertInlineElement('ins'); + var elementArray = SXE.inst.dom.select('ins[data-mce-new]'); + for (var i=0; i + + + {#advanced_dlg.about_title} + + + + + + + +
+
+

{#advanced_dlg.about_title}

+

Version: ()

+

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-2008, Moxiecode Systems AB, All rights reserved.

+

For more information about this software visit the TinyMCE website.

+ +
+ Got Moxie? +
+
+ +
+
+

{#advanced_dlg.about_loaded}

+ +
+
+ +

 

+
+
+ +
+
+
+
+ +
+ +
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/anchor.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/anchor.htm new file mode 100644 index 0000000..dc53312 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/anchor.htm @@ -0,0 +1,26 @@ + + + + {#advanced_dlg.anchor_title} + + + + +
+ + + + + + + + +
{#advanced_dlg.anchor_title}
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/charmap.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/charmap.htm new file mode 100644 index 0000000..12acfe1 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/charmap.htm @@ -0,0 +1,55 @@ + + + + {#advanced_dlg.charmap_title} + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
 
 
+
+ + + + + + + + + + + + + + + + +
 
 
 
+
{#advanced_dlg.charmap_usage}
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/color_picker.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/color_picker.htm new file mode 100644 index 0000000..66633d0 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/color_picker.htm @@ -0,0 +1,70 @@ + + + + {#advanced_dlg.colorpicker_title} + + + + + + +
+ + +
+
+
+ {#advanced_dlg.colorpicker_picker_title} +
+ + +
+ +
+ +
+
+
+
+ +
+
+ {#advanced_dlg.colorpicker_palette_title} +
+ +
+ +
+
+
+ +
+
+ {#advanced_dlg.colorpicker_named_title} +
+ +
+ +
+ +
+ {#advanced_dlg.colorpicker_name} +
+
+
+
+ +
+ + +
+
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template.js new file mode 100644 index 0000000..4b8d563 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template.js @@ -0,0 +1 @@ +(function(h){var i=h.DOM,g=h.dom.Event,c=h.extend,f=h.each,a=h.util.Cookie,e,d=h.explode;function b(p,m){var k,l,o=p.dom,j="",n,r;previewStyles=p.settings.preview_styles;if(previewStyles===false){return""}if(!previewStyles){previewStyles="font-family font-size font-weight text-decoration text-transform color background-color"}function q(s){return s.replace(/%(\w+)/g,"")}k=m.block||m.inline||"span";l=o.create(k);f(m.styles,function(t,s){t=q(t);if(t){o.setStyle(l,s,t)}});f(m.attributes,function(t,s){t=q(t);if(t){o.setAttrib(l,s,t)}});f(m.classes,function(s){s=q(s);if(!o.hasClass(l,s)){o.addClass(l,s)}});o.setStyles(l,{position:"absolute",left:-65535});p.getBody().appendChild(l);n=o.getStyle(p.getBody(),"fontSize",true);n=/px$/.test(n)?parseInt(n,10):0;f(previewStyles.split(" "),function(s){var t=o.getStyle(l,s,true);if(s=="background-color"&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)){t=o.getStyle(p.getBody(),s,true);if(o.toHex(t).toLowerCase()=="#ffffff"){return}}if(s=="font-size"){if(/em|%$/.test(t)){if(n===0){return}t=parseFloat(t,10)/(/%$/.test(t)?100:1);t=(t*n)+"px"}}j+=s+":"+t+";"});o.remove(l);return j}h.ThemeManager.requireLangPack("advanced");h.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(k,l){var m=this,n,j,p;m.editor=k;m.url=l;m.onResolveName=new h.util.Dispatcher(this);n=k.settings;k.forcedHighContrastMode=k.settings.detect_highcontrast&&m._isHighContrast();k.settings.skin=k.forcedHighContrastMode?"highcontrast":k.settings.skin;if(!n.theme_advanced_buttons1){n=c({theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap"},n)}m.settings=n=c({theme_advanced_path:true,theme_advanced_toolbar_location:"top",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"left",theme_advanced_statusbar_location:"bottom",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:k.settings.readonly},n);if(!n.font_size_style_values){n.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(h.is(n.theme_advanced_font_sizes,"string")){n.font_size_style_values=h.explode(n.font_size_style_values);n.font_size_classes=h.explode(n.font_size_classes||"");p={};k.settings.theme_advanced_font_sizes=n.theme_advanced_font_sizes;f(k.getParam("theme_advanced_font_sizes","","hash"),function(r,q){var o;if(q==r&&r>=1&&r<=7){q=r+" ("+m.sizes[r-1]+"pt)";o=n.font_size_classes[r-1];r=n.font_size_style_values[r-1]||(m.sizes[r-1]+"pt")}if(/^\s*\./.test(r)){o=r.replace(/\./g,"")}p[q]=o?{"class":o}:{fontSize:r}});n.theme_advanced_font_sizes=p}if((j=n.theme_advanced_path_location)&&j!="none"){n.theme_advanced_statusbar_location=n.theme_advanced_path_location}if(n.theme_advanced_statusbar_location=="none"){n.theme_advanced_statusbar_location=0}if(k.settings.content_css!==false){k.contentCSS.push(k.baseURI.toAbsolute(l+"/skins/"+k.settings.skin+"/content.css"))}k.onInit.add(function(){if(!k.settings.readonly){k.onNodeChange.add(m._nodeChanged,m);k.onKeyUp.add(m._updateUndoStatus,m);k.onMouseUp.add(m._updateUndoStatus,m);k.dom.bind(k.dom.getRoot(),"dragend",function(){m._updateUndoStatus(k)})}});k.onSetProgressState.add(function(r,o,s){var t,u=r.id,q;if(o){m.progressTimer=setTimeout(function(){t=r.getContainer();t=t.insertBefore(i.create("DIV",{style:"position:relative"}),t.firstChild);q=i.get(r.id+"_tbl");i.add(t,"div",{id:u+"_blocker","class":"mceBlocker",style:{width:q.clientWidth+2,height:q.clientHeight+2}});i.add(t,"div",{id:u+"_progress","class":"mceProgress",style:{left:q.clientWidth/2,top:q.clientHeight/2}})},s||0)}else{i.remove(u+"_blocker");i.remove(u+"_progress");clearTimeout(m.progressTimer)}});i.loadCSS(n.editor_css?k.documentBaseURI.toAbsolute(n.editor_css):l+"/skins/"+k.settings.skin+"/ui.css");if(n.skin_variant){i.loadCSS(l+"/skins/"+k.settings.skin+"/ui_"+n.skin_variant+".css")}},_isHighContrast:function(){var j,k=i.add(i.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});j=(i.getStyle(k,"background-color",true)+"").toLowerCase().replace(/ /g,"");i.remove(k);return j!="rgb(171,239,86)"&&j!="#abef56"},createControl:function(m,j){var k,l;if(l=j.createControl(m)){return l}switch(m){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((k=this.controls[m])){return j.createButton(m,{title:"advanced."+k[0],cmd:k[1],ui:k[2],value:k[3]})}},execCommand:function(l,k,m){var j=this["_"+l];if(j){j.call(this,k,m);return true}return false},_importClasses:function(l){var j=this.editor,k=j.controlManager.get("styleselect");if(k.getLength()==0){f(j.dom.getClasses(),function(q,m){var p="style_"+m,n;n={inline:"span",attributes:{"class":q["class"]},selector:"*"};j.formatter.register(p,n);k.add(q["class"],p,{style:function(){return b(j,n)}})})}},_createStyleSelect:function(o){var l=this,j=l.editor,k=j.controlManager,m;m=k.createListBox("styleselect",{title:"advanced.style_select",onselect:function(q){var r,n=[],p;f(m.items,function(s){n.push(s.value)});j.focus();j.undoManager.add();r=j.formatter.matchAll(n);h.each(r,function(s){if(!q||s==q){if(s){j.formatter.remove(s)}p=true}});if(!p){j.formatter.apply(q)}j.undoManager.add();j.nodeChanged();return false}});j.onPreInit.add(function(){var p=0,n=j.getParam("style_formats");if(n){f(n,function(q){var r,s=0;f(q,function(){s++});if(s>1){r=q.name=q.name||"style_"+(p++);j.formatter.register(r,q);m.add(q.title,r,{style:function(){return b(j,q)}})}else{m.add(q.title)}})}else{f(j.getParam("theme_advanced_styles","","hash"),function(t,s){var r,q;if(t){r="style_"+(p++);q={inline:"span",classes:t,selector:"*"};j.formatter.register(r,q);m.add(l.editor.translate(s),r,{style:function(){return b(j,q)}})}})}});if(m.getLength()==0){m.onPostRender.add(function(p,q){if(!m.NativeListBox){g.add(q.id+"_text","focus",l._importClasses,l);g.add(q.id+"_text","mousedown",l._importClasses,l);g.add(q.id+"_open","focus",l._importClasses,l);g.add(q.id+"_open","mousedown",l._importClasses,l)}else{g.add(q.id,"focus",l._importClasses,l)}})}return m},_createFontSelect:function(){var l,k=this,j=k.editor;l=j.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(m){var n=l.items[l.selectedIndex];if(!m&&n){j.execCommand("FontName",false,n.value);return}j.execCommand("FontName",false,m);l.select(function(o){return m==o});if(n&&n.value==m){l.select(null)}return false}});if(l){f(j.getParam("theme_advanced_fonts",k.settings.theme_advanced_fonts,"hash"),function(n,m){l.add(j.translate(m),n,{style:n.indexOf("dings")==-1?"font-family:"+n:""})})}return l},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(o){var p=n.items[n.selectedIndex];if(!o&&p){p=p.value;if(p["class"]){k.formatter.toggle("fontsize_class",{value:p["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,p.fontSize)}return}if(o["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}n.select(function(q){return o==q});if(p&&(p.value.fontSize==o.fontSize||p.value["class"]&&p.value["class"]==o["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(p,o){var q=p.fontSize;if(q>=1&&q<=7){q=m.sizes[parseInt(q)-1]+"pt"}n.add(o,p,{style:"font-size:"+q,"class":"mceFontSize"+(l++)+(" "+(p["class"]||""))})})}return n},_createBlockFormats:function(){var l,j={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},k=this;l=k.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(m){k.editor.execCommand("FormatBlock",false,m);return false}});if(l){f(k.editor.getParam("theme_advanced_blockformats",k.settings.theme_advanced_blockformats,"hash"),function(n,m){l.add(k.editor.translate(m!=n?m:j[n]),n,{"class":"mce_formatPreview mce_"+n,style:function(){return b(k.editor,{block:n})}})})}return l},_createForeColorMenu:function(){var n,k=this,l=k.settings,m={},j;if(l.theme_advanced_more_colors){m.more_colors_func=function(){k._mceColorPicker(0,{color:n.value,func:function(o){n.setColor(o)}})}}if(j=l.theme_advanced_text_colors){m.colors=j}if(l.theme_advanced_default_foreground_color){m.default_color=l.theme_advanced_default_foreground_color}m.title="advanced.forecolor_desc";m.cmd="ForeColor";m.scope=this;n=k.editor.controlManager.createColorSplitButton("forecolor",m);return n},_createBackColorMenu:function(){var n,k=this,l=k.settings,m={},j;if(l.theme_advanced_more_colors){m.more_colors_func=function(){k._mceColorPicker(0,{color:n.value,func:function(o){n.setColor(o)}})}}if(j=l.theme_advanced_background_colors){m.colors=j}if(l.theme_advanced_default_background_color){m.default_color=l.theme_advanced_default_background_color}m.title="advanced.backcolor_desc";m.cmd="HiliteColor";m.scope=this;n=k.editor.controlManager.createColorSplitButton("backcolor",m);return n},renderUI:function(l){var q,m,r,w=this,u=w.editor,x=w.settings,v,k,j;if(u.settings){u.settings.aria_label=x.aria_label+u.getLang("advanced.help_shortcut")}q=k=i.create("span",{role:"application","aria-labelledby":u.id+"_voice",id:u.id+"_parent","class":"mceEditor "+u.settings.skin+"Skin"+(x.skin_variant?" "+u.settings.skin+"Skin"+w._ufirst(x.skin_variant):"")+(u.settings.directionality=="rtl"?" mceRtl":"")});i.add(q,"span",{"class":"mceVoiceLabel",style:"display:none;",id:u.id+"_voice"},x.aria_label);if(!i.boxModel){q=i.add(q,"div",{"class":"mceOldBoxModel"})}q=v=i.add(q,"table",{role:"presentation",id:u.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});q=r=i.add(q,"tbody");switch((x.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":m=w._rowLayout(x,r,l);break;case"customlayout":m=u.execCallback("theme_advanced_custom_layout",x,r,l,k);break;default:m=w._simpleLayout(x,r,l,k)}q=l.targetNode;j=v.rows;i.addClass(j[0],"mceFirst");i.addClass(j[j.length-1],"mceLast");f(i.select("tr",r),function(o){i.addClass(o.firstChild,"mceFirst");i.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(i.get(x.theme_advanced_toolbar_container)){i.get(x.theme_advanced_toolbar_container).appendChild(k)}else{i.insertAfter(k,q)}g.add(u.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){w._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return false}});if(!u.getParam("accessibility_focus")){g.add(i.add(k,"a",{href:"#"},""),"focus",function(){tinyMCE.get(u.id).focus()})}if(x.theme_advanced_toolbar_location=="external"){l.deltaHeight=0}w.deltaHeight=l.deltaHeight;l.targetNode=null;u.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){if(h.isWebKit){window.focus()}w.toolbarGroup.focus();return g.cancel(n)}else{if(n.keyCode===o){i.get(p.id+"_path_row").focus();return g.cancel(n)}}}});u.addShortcut("alt+0","","mceShortcuts",w);return{iframeContainer:m,editorContainer:u.id+"_parent",sizeContainer:v,deltaHeight:l.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:h.majorVersion+"."+h.minorVersion}},resizeBy:function(j,k){var l=i.get(this.editor.id+"_ifr");this.resizeTo(l.clientWidth+j,l.clientHeight+k)},resizeTo:function(j,n,l){var k=this.editor,m=this.settings,o=i.get(k.id+"_tbl"),p=i.get(k.id+"_ifr");j=Math.max(m.theme_advanced_resizing_min_width||100,j);n=Math.max(m.theme_advanced_resizing_min_height||100,n);j=Math.min(m.theme_advanced_resizing_max_width||65535,j);n=Math.min(m.theme_advanced_resizing_max_height||65535,n);i.setStyle(o,"height","");i.setStyle(p,"height",n);if(m.theme_advanced_resize_horizontal){i.setStyle(o,"width","");i.setStyle(p,"width",j);if(j"));i.setHTML(l,r.join(""))},_addStatusBar:function(p,k){var l,w=this,q=w.editor,x=w.settings,j,u,v,m;l=i.add(p,"tr");l=m=i.add(l,"td",{"class":"mceStatusbar"});l=i.add(l,"div",{id:q.id+"_path_row",role:"group","aria-labelledby":q.id+"_path_voice"});if(x.theme_advanced_path){i.add(l,"span",{id:q.id+"_path_voice"},q.translate("advanced.path"));i.add(l,"span",{},": ")}else{i.add(l,"span",{}," ")}if(x.theme_advanced_resizing){i.add(m,"a",{id:q.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize",tabIndex:"-1"});if(x.theme_advanced_resizing_use_cookie){q.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+q.id+"_size"),r=i.get(q.id+"_tbl");if(!n){return}w.resizeTo(n.cw,n.ch)})}q.onPostRender.add(function(){g.add(q.id+"_resize","click",function(n){n.preventDefault()});g.add(q.id+"_resize","mousedown",function(E){var t,r,s,o,D,A,B,G,n,F,y;function z(H){H.preventDefault();n=B+(H.screenX-D);F=G+(H.screenY-A);w.resizeTo(n,F)}function C(H){g.remove(i.doc,"mousemove",t);g.remove(q.getDoc(),"mousemove",r);g.remove(i.doc,"mouseup",s);g.remove(q.getDoc(),"mouseup",o);n=B+(H.screenX-D);F=G+(H.screenY-A);w.resizeTo(n,F,true);q.nodeChanged()}E.preventDefault();D=E.screenX;A=E.screenY;y=i.get(w.editor.id+"_ifr");B=n=y.clientWidth;G=F=y.clientHeight;t=g.add(i.doc,"mousemove",z);r=g.add(q.getDoc(),"mousemove",z);s=g.add(i.doc,"mouseup",C);o=g.add(q.getDoc(),"mouseup",C)})})}k.deltaHeight-=21;l=p=null},_updateUndoStatus:function(k){var j=k.controlManager,l=k.undoManager;j.setDisabled("undo",!l.hasUndo()&&!l.typing);j.setDisabled("redo",!l.hasRedo())},_nodeChanged:function(o,u,E,r,F){var z=this,D,G=0,y,H,A=z.settings,x,l,w,C,m,k,j;h.each(z.stateControls,function(n){u.setActive(n,o.queryCommandState(z.controls[n][1]))});function q(p){var s,n=F.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s0){H.mark(p)}})}if(H=u.get("formatselect")){D=q(o.dom.isBlock);if(D){H.select(D.nodeName.toLowerCase())}}q(function(p){if(p.nodeName==="SPAN"){if(!x&&p.className){x=p.className}}if(o.dom.is(p,A.theme_advanced_font_selector)){if(!l&&p.style.fontSize){l=p.style.fontSize}if(!w&&p.style.fontFamily){w=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!C&&p.style.color){C=p.style.color}if(!m&&p.style.backgroundColor){m=p.style.backgroundColor}}return false});if(H=u.get("fontselect")){H.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==w})}if(H=u.get("fontsizeselect")){if(A.theme_advanced_runtime_fontsize&&!l&&!x){l=o.dom.getStyle(E,"fontSize",true)}H.select(function(n){if(n.fontSize&&n.fontSize===l){return true}if(n["class"]&&n["class"]===x){return true}})}if(A.theme_advanced_show_current_color){function B(p,n){if(H=u.get(p)){if(!n){n=H.settings.default_color}if(n!==H.value){H.displayColor(n)}}}B("forecolor",C);B("backcolor",m)}if(A.theme_advanced_show_current_color){function B(p,n){if(H=u.get(p)){if(!n){n=H.settings.default_color}if(n!==H.value){H.displayColor(n)}}}B("forecolor",C);B("backcolor",m)}if(A.theme_advanced_path&&A.theme_advanced_statusbar_location){D=i.get(o.id+"_path")||i.add(o.id+"_path_row","span",{id:o.id+"_path"});if(z.statusKeyboardNavigation){z.statusKeyboardNavigation.destroy();z.statusKeyboardNavigation=null}i.setHTML(D,"");q(function(I){var p=I.nodeName.toLowerCase(),s,v,t="";if(I.nodeType!=1||p==="br"||I.getAttribute("data-mce-bogus")||i.hasClass(I,"mceItemHidden")||i.hasClass(I,"mceItemRemoved")){return}if(h.isIE&&I.scopeName!=="HTML"&&I.scopeName){p=I.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(y=i.getAttrib(I,"src")){t+="src: "+y+" "}break;case"a":if(y=i.getAttrib(I,"name")){t+="name: "+y+" ";p+="#"+y}if(y=i.getAttrib(I,"href")){t+="href: "+y+" "}break;case"font":if(y=i.getAttrib(I,"face")){t+="font: "+y+" "}if(y=i.getAttrib(I,"size")){t+="size: "+y+" "}if(y=i.getAttrib(I,"color")){t+="color: "+y+" "}break;case"span":if(y=i.getAttrib(I,"style")){t+="style: "+y+" "}break}if(y=i.getAttrib(I,"id")){t+="id: "+y+" "}if(y=I.className){y=y.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(y){t+="class: "+y+" ";if(o.dom.isBlock(I)||p=="img"||p=="span"){p+="."+y}}}p=p.replace(/(html:)/g,"");p={name:p,node:I,title:t};z.onResolveName.dispatch(z,p);t=p.title;p=p.name;v=i.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(G++)},p);if(D.hasChildNodes()){D.insertBefore(i.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),D.firstChild);D.insertBefore(v,D.firstChild)}else{D.appendChild(v)}},o.getBody());if(i.select("a",D).length>0){z.statusKeyboardNavigation=new h.ui.KeyboardNavigation({root:o.id+"_path_row",items:i.select("a",D),excludeFromTabOrder:true,onCancel:function(){o.focus()}},i)}}},_sel:function(j){this.editor.execCommand("mceSelectNodeDepth",false,j)},_mceInsertAnchor:function(l,k){var j=this.editor;j.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(j.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(j.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var j=this.editor;j.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(j.getLang("advanced.charmap_delta_width",0)),height:265+parseInt(j.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var j=this.editor;j.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var j=this.editor;j.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(l,k){var j=this.editor;k=k||{};j.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(j.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(j.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:k.color,func:k.func,theme_url:this.url})},_mceCodeEditor:function(k,l){var j=this.editor;j.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(j.getParam("theme_advanced_source_editor_width",720)),height:parseInt(j.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(k,l){var j=this.editor;if(j.dom.getAttrib(j.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}j.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(j.getLang("advanced.image_delta_width",0)),height:275+parseInt(j.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(k,l){var j=this.editor;j.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(j.getLang("advanced.link_delta_width",0)),height:200+parseInt(j.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var j=this.editor;j.windowManager.confirm("advanced.newdocument",function(k){if(k){j.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var j=this;this._mceColorPicker(0,{color:j.fgColor,func:function(k){j.fgColor=k;j.editor.execCommand("ForeColor",false,k)}})},_mceBackColor:function(){var j=this;this._mceColorPicker(0,{color:j.bgColor,func:function(k){j.bgColor=k;j.editor.execCommand("HiliteColor",false,k)}})},_ufirst:function(j){return j.substring(0,1).toUpperCase()+j.substring(1)}});h.ThemeManager.add("advanced",h.themes.AdvancedTheme)}(tinymce)); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template_src.js new file mode 100644 index 0000000..84039ce --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/editor_template_src.js @@ -0,0 +1,1490 @@ +/** + * editor_template_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode; + + // Generates a preview for a format + function getPreviewCss(ed, fmt) { + var name, previewElm, dom = ed.dom, previewCss = '', parentFontSize, previewStylesName; + + previewStyles = ed.settings.preview_styles; + + // No preview forced + if (previewStyles === false) + return ''; + + // Default preview + if (!previewStyles) + previewStyles = 'font-family font-size font-weight text-decoration text-transform color background-color'; + + // Removes any variables since these can't be previewed + function removeVars(val) { + return val.replace(/%(\w+)/g, ''); + }; + + // Create block/inline element to use for preview + name = fmt.block || fmt.inline || 'span'; + previewElm = dom.create(name); + + // Add format styles to preview element + each(fmt.styles, function(value, name) { + value = removeVars(value); + + if (value) + dom.setStyle(previewElm, name, value); + }); + + // Add attributes to preview element + each(fmt.attributes, function(value, name) { + value = removeVars(value); + + if (value) + dom.setAttrib(previewElm, name, value); + }); + + // Add classes to preview element + each(fmt.classes, function(value) { + value = removeVars(value); + + if (!dom.hasClass(previewElm, value)) + dom.addClass(previewElm, value); + }); + + // Add the previewElm outside the visual area + dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF}); + ed.getBody().appendChild(previewElm); + + // Get parent container font size so we can compute px values out of em/% for older IE:s + parentFontSize = dom.getStyle(ed.getBody(), 'fontSize', true); + parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0; + + each(previewStyles.split(' '), function(name) { + var value = dom.getStyle(previewElm, name, true); + + // If background is transparent then check if the body has a background color we can use + if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) { + value = dom.getStyle(ed.getBody(), name, true); + + // Ignore white since it's the default color, not the nicest fix + if (dom.toHex(value).toLowerCase() == '#ffffff') { + return; + } + } + + // Old IE won't calculate the font size so we need to do that manually + if (name == 'font-size') { + if (/em|%$/.test(value)) { + if (parentFontSize === 0) { + return; + } + + // Convert font size from em/% to px + value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1); + value = (value * parentFontSize) + 'px'; + } + } + + previewCss += name + ':' + value + ';'; + }); + + dom.remove(previewElm); + + return previewCss; + }; + + // Tell it to load theme specific language pack(s) + tinymce.ThemeManager.requireLangPack('advanced'); + + tinymce.create('tinymce.themes.AdvancedTheme', { + sizes : [8, 10, 12, 14, 18, 24, 36], + + // Control name lookup, format: title, command + controls : { + bold : ['bold_desc', 'Bold'], + italic : ['italic_desc', 'Italic'], + underline : ['underline_desc', 'Underline'], + strikethrough : ['striketrough_desc', 'Strikethrough'], + justifyleft : ['justifyleft_desc', 'JustifyLeft'], + justifycenter : ['justifycenter_desc', 'JustifyCenter'], + justifyright : ['justifyright_desc', 'JustifyRight'], + justifyfull : ['justifyfull_desc', 'JustifyFull'], + bullist : ['bullist_desc', 'InsertUnorderedList'], + numlist : ['numlist_desc', 'InsertOrderedList'], + outdent : ['outdent_desc', 'Outdent'], + indent : ['indent_desc', 'Indent'], + cut : ['cut_desc', 'Cut'], + copy : ['copy_desc', 'Copy'], + paste : ['paste_desc', 'Paste'], + undo : ['undo_desc', 'Undo'], + redo : ['redo_desc', 'Redo'], + link : ['link_desc', 'mceLink'], + unlink : ['unlink_desc', 'unlink'], + image : ['image_desc', 'mceImage'], + cleanup : ['cleanup_desc', 'mceCleanup'], + help : ['help_desc', 'mceHelp'], + code : ['code_desc', 'mceCodeEditor'], + hr : ['hr_desc', 'InsertHorizontalRule'], + removeformat : ['removeformat_desc', 'RemoveFormat'], + sub : ['sub_desc', 'subscript'], + sup : ['sup_desc', 'superscript'], + forecolor : ['forecolor_desc', 'ForeColor'], + forecolorpicker : ['forecolor_desc', 'mceForeColor'], + backcolor : ['backcolor_desc', 'HiliteColor'], + backcolorpicker : ['backcolor_desc', 'mceBackColor'], + charmap : ['charmap_desc', 'mceCharMap'], + visualaid : ['visualaid_desc', 'mceToggleVisualAid'], + anchor : ['anchor_desc', 'mceInsertAnchor'], + newdocument : ['newdocument_desc', 'mceNewDocument'], + blockquote : ['blockquote_desc', 'mceBlockQuote'] + }, + + stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], + + init : function(ed, url) { + var t = this, s, v, o; + + t.editor = ed; + t.url = url; + t.onResolveName = new tinymce.util.Dispatcher(this); + s = ed.settings; + + ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast(); + ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin; + + // Setup default buttons + if (!s.theme_advanced_buttons1) { + s = extend({ + theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", + theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", + theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap" + }, s); + } + + // Default settings + t.settings = s = extend({ + theme_advanced_path : true, + theme_advanced_toolbar_location : 'top', + theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", + theme_advanced_toolbar_align : "left", + theme_advanced_statusbar_location : "bottom", + theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", + theme_advanced_more_colors : 1, + theme_advanced_row_height : 23, + theme_advanced_resize_horizontal : 1, + theme_advanced_resizing_use_cookie : 1, + theme_advanced_font_sizes : "1,2,3,4,5,6,7", + theme_advanced_font_selector : "span", + theme_advanced_show_current_color: 0, + readonly : ed.settings.readonly + }, s); + + // Setup default font_size_style_values + if (!s.font_size_style_values) + s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt"; + + if (tinymce.is(s.theme_advanced_font_sizes, 'string')) { + s.font_size_style_values = tinymce.explode(s.font_size_style_values); + s.font_size_classes = tinymce.explode(s.font_size_classes || ''); + + // Parse string value + o = {}; + ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes; + each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) { + var cl; + + if (k == v && v >= 1 && v <= 7) { + k = v + ' (' + t.sizes[v - 1] + 'pt)'; + cl = s.font_size_classes[v - 1]; + v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); + } + + if (/^\s*\./.test(v)) + cl = v.replace(/\./g, ''); + + o[k] = cl ? {'class' : cl} : {fontSize : v}; + }); + + s.theme_advanced_font_sizes = o; + } + + if ((v = s.theme_advanced_path_location) && v != 'none') + s.theme_advanced_statusbar_location = s.theme_advanced_path_location; + + if (s.theme_advanced_statusbar_location == 'none') + s.theme_advanced_statusbar_location = 0; + + if (ed.settings.content_css !== false) + ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); + + // Init editor + ed.onInit.add(function() { + if (!ed.settings.readonly) { + ed.onNodeChange.add(t._nodeChanged, t); + ed.onKeyUp.add(t._updateUndoStatus, t); + ed.onMouseUp.add(t._updateUndoStatus, t); + ed.dom.bind(ed.dom.getRoot(), 'dragend', function() { + t._updateUndoStatus(ed); + }); + } + }); + + ed.onSetProgressState.add(function(ed, b, ti) { + var co, id = ed.id, tb; + + if (b) { + t.progressTimer = setTimeout(function() { + co = ed.getContainer(); + co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); + tb = DOM.get(ed.id + '_tbl'); + + DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); + DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); + }, ti || 0); + } else { + DOM.remove(id + '_blocker'); + DOM.remove(id + '_progress'); + clearTimeout(t.progressTimer); + } + }); + + DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); + + if (s.skin_variant) + DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); + }, + + _isHighContrast : function() { + var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'}); + + actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, ''); + DOM.remove(div); + + return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56'; + }, + + createControl : function(n, cf) { + var cd, c; + + if (c = cf.createControl(n)) + return c; + + switch (n) { + case "styleselect": + return this._createStyleSelect(); + + case "formatselect": + return this._createBlockFormats(); + + case "fontselect": + return this._createFontSelect(); + + case "fontsizeselect": + return this._createFontSizeSelect(); + + case "forecolor": + return this._createForeColorMenu(); + + case "backcolor": + return this._createBackColorMenu(); + } + + if ((cd = this.controls[n])) + return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); + }, + + execCommand : function(cmd, ui, val) { + var f = this['_' + cmd]; + + if (f) { + f.call(this, ui, val); + return true; + } + + return false; + }, + + _importClasses : function(e) { + var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); + + if (ctrl.getLength() == 0) { + each(ed.dom.getClasses(), function(o, idx) { + var name = 'style_' + idx, fmt; + + fmt = { + inline : 'span', + attributes : {'class' : o['class']}, + selector : '*' + }; + + ed.formatter.register(name, fmt); + + ctrl.add(o['class'], name, { + style: function() { + return getPreviewCss(ed, fmt); + } + }); + }); + } + }, + + _createStyleSelect : function(n) { + var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; + + // Setup style select box + ctrl = ctrlMan.createListBox('styleselect', { + title : 'advanced.style_select', + onselect : function(name) { + var matches, formatNames = [], removedFormat; + + each(ctrl.items, function(item) { + formatNames.push(item.value); + }); + + ed.focus(); + ed.undoManager.add(); + + // Toggle off the current format(s) + matches = ed.formatter.matchAll(formatNames); + tinymce.each(matches, function(match) { + if (!name || match == name) { + if (match) + ed.formatter.remove(match); + + removedFormat = true; + } + }); + + if (!removedFormat) + ed.formatter.apply(name); + + ed.undoManager.add(); + ed.nodeChanged(); + + return false; // No auto select + } + }); + + // Handle specified format + ed.onPreInit.add(function() { + var counter = 0, formats = ed.getParam('style_formats'); + + if (formats) { + each(formats, function(fmt) { + var name, keys = 0; + + each(fmt, function() {keys++;}); + + if (keys > 1) { + name = fmt.name = fmt.name || 'style_' + (counter++); + ed.formatter.register(name, fmt); + ctrl.add(fmt.title, name, { + style: function() { + return getPreviewCss(ed, fmt); + } + }); + } else + ctrl.add(fmt.title); + }); + } else { + each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { + var name, fmt; + + if (val) { + name = 'style_' + (counter++); + fmt = { + inline : 'span', + classes : val, + selector : '*' + }; + + ed.formatter.register(name, fmt); + ctrl.add(t.editor.translate(key), name, { + style: function() { + return getPreviewCss(ed, fmt); + } + }); + } + }); + } + }); + + // Auto import classes if the ctrl box is empty + if (ctrl.getLength() == 0) { + ctrl.onPostRender.add(function(ed, n) { + if (!ctrl.NativeListBox) { + Event.add(n.id + '_text', 'focus', t._importClasses, t); + Event.add(n.id + '_text', 'mousedown', t._importClasses, t); + Event.add(n.id + '_open', 'focus', t._importClasses, t); + Event.add(n.id + '_open', 'mousedown', t._importClasses, t); + } else + Event.add(n.id, 'focus', t._importClasses, t); + }); + } + + return ctrl; + }, + + _createFontSelect : function() { + var c, t = this, ed = t.editor; + + c = ed.controlManager.createListBox('fontselect', { + title : 'advanced.fontdefault', + onselect : function(v) { + var cur = c.items[c.selectedIndex]; + + if (!v && cur) { + ed.execCommand('FontName', false, cur.value); + return; + } + + ed.execCommand('FontName', false, v); + + // Fake selection, execCommand will fire a nodeChange and update the selection + c.select(function(sv) { + return v == sv; + }); + + if (cur && cur.value == v) { + c.select(null); + } + + return false; // No auto select + } + }); + + if (c) { + each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { + c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); + }); + } + + return c; + }, + + _createFontSizeSelect : function() { + var t = this, ed = t.editor, c, i = 0, cl = []; + + c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { + var cur = c.items[c.selectedIndex]; + + if (!v && cur) { + cur = cur.value; + + if (cur['class']) { + ed.formatter.toggle('fontsize_class', {value : cur['class']}); + ed.undoManager.add(); + ed.nodeChanged(); + } else { + ed.execCommand('FontSize', false, cur.fontSize); + } + + return; + } + + if (v['class']) { + ed.focus(); + ed.undoManager.add(); + ed.formatter.toggle('fontsize_class', {value : v['class']}); + ed.undoManager.add(); + ed.nodeChanged(); + } else + ed.execCommand('FontSize', false, v.fontSize); + + // Fake selection, execCommand will fire a nodeChange and update the selection + c.select(function(sv) { + return v == sv; + }); + + if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] && cur.value['class'] == v['class'])) { + c.select(null); + } + + return false; // No auto select + }}); + + if (c) { + each(t.settings.theme_advanced_font_sizes, function(v, k) { + var fz = v.fontSize; + + if (fz >= 1 && fz <= 7) + fz = t.sizes[parseInt(fz) - 1] + 'pt'; + + c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); + }); + } + + return c; + }, + + _createBlockFormats : function() { + var c, fmts = { + p : 'advanced.paragraph', + address : 'advanced.address', + pre : 'advanced.pre', + h1 : 'advanced.h1', + h2 : 'advanced.h2', + h3 : 'advanced.h3', + h4 : 'advanced.h4', + h5 : 'advanced.h5', + h6 : 'advanced.h6', + div : 'advanced.div', + blockquote : 'advanced.blockquote', + code : 'advanced.code', + dt : 'advanced.dt', + dd : 'advanced.dd', + samp : 'advanced.samp' + }, t = this; + + c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) { + t.editor.execCommand('FormatBlock', false, v); + return false; + }}); + + if (c) { + each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { + c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v, style: function() { + return getPreviewCss(t.editor, {block: v}); + }}); + }); + } + + return c; + }, + + _createForeColorMenu : function() { + var c, t = this, s = t.settings, o = {}, v; + + if (s.theme_advanced_more_colors) { + o.more_colors_func = function() { + t._mceColorPicker(0, { + color : c.value, + func : function(co) { + c.setColor(co); + } + }); + }; + } + + if (v = s.theme_advanced_text_colors) + o.colors = v; + + if (s.theme_advanced_default_foreground_color) + o.default_color = s.theme_advanced_default_foreground_color; + + o.title = 'advanced.forecolor_desc'; + o.cmd = 'ForeColor'; + o.scope = this; + + c = t.editor.controlManager.createColorSplitButton('forecolor', o); + + return c; + }, + + _createBackColorMenu : function() { + var c, t = this, s = t.settings, o = {}, v; + + if (s.theme_advanced_more_colors) { + o.more_colors_func = function() { + t._mceColorPicker(0, { + color : c.value, + func : function(co) { + c.setColor(co); + } + }); + }; + } + + if (v = s.theme_advanced_background_colors) + o.colors = v; + + if (s.theme_advanced_default_background_color) + o.default_color = s.theme_advanced_default_background_color; + + o.title = 'advanced.backcolor_desc'; + o.cmd = 'HiliteColor'; + o.scope = this; + + c = t.editor.controlManager.createColorSplitButton('backcolor', o); + + return c; + }, + + renderUI : function(o) { + var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; + + if (ed.settings) { + ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut'); + } + + // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for. + // Maybe actually inherit it from the original textara? + n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '') + (ed.settings.directionality == "rtl" ? ' mceRtl' : '')}); + DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label); + + if (!DOM.boxModel) + n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); + + n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); + n = tb = DOM.add(n, 'tbody'); + + switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { + case "rowlayout": + ic = t._rowLayout(s, tb, o); + break; + + case "customlayout": + ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); + break; + + default: + ic = t._simpleLayout(s, tb, o, p); + } + + n = o.targetNode; + + // Add classes to first and last TRs + nl = sc.rows; + DOM.addClass(nl[0], 'mceFirst'); + DOM.addClass(nl[nl.length - 1], 'mceLast'); + + // Add classes to first and last TDs + each(DOM.select('tr', tb), function(n) { + DOM.addClass(n.firstChild, 'mceFirst'); + DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); + }); + + if (DOM.get(s.theme_advanced_toolbar_container)) + DOM.get(s.theme_advanced_toolbar_container).appendChild(p); + else + DOM.insertAfter(p, n); + + Event.add(ed.id + '_path_row', 'click', function(e) { + e = e.target; + + if (e.nodeName == 'A') { + t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); + return false; + } + }); +/* + if (DOM.get(ed.id + '_path_row')) { + Event.add(ed.id + '_tbl', 'mouseover', function(e) { + var re; + + e = e.target; + + if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { + re = DOM.get(ed.id + '_path_row'); + t.lastPath = re.innerHTML; + DOM.setHTML(re, e.parentNode.title); + } + }); + + Event.add(ed.id + '_tbl', 'mouseout', function(e) { + if (t.lastPath) { + DOM.setHTML(ed.id + '_path_row', t.lastPath); + t.lastPath = 0; + } + }); + } +*/ + + if (!ed.getParam('accessibility_focus')) + Event.add(DOM.add(p, 'a', {href : '#'}, ''), 'focus', function() {tinyMCE.get(ed.id).focus();}); + + if (s.theme_advanced_toolbar_location == 'external') + o.deltaHeight = 0; + + t.deltaHeight = o.deltaHeight; + o.targetNode = null; + + ed.onKeyDown.add(function(ed, evt) { + var DOM_VK_F10 = 121, DOM_VK_F11 = 122; + + if (evt.altKey) { + if (evt.keyCode === DOM_VK_F10) { + // Make sure focus is given to toolbar in Safari. + // We can't do this in IE as it prevents giving focus to toolbar when editor is in a frame + if (tinymce.isWebKit) { + window.focus(); + } + t.toolbarGroup.focus(); + return Event.cancel(evt); + } else if (evt.keyCode === DOM_VK_F11) { + DOM.get(ed.id + '_path_row').focus(); + return Event.cancel(evt); + } + } + }); + + // alt+0 is the UK recommended shortcut for accessing the list of access controls. + ed.addShortcut('alt+0', '', 'mceShortcuts', t); + + return { + iframeContainer : ic, + editorContainer : ed.id + '_parent', + sizeContainer : sc, + deltaHeight : o.deltaHeight + }; + }, + + getInfo : function() { + return { + longname : 'Advanced theme', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + version : tinymce.majorVersion + "." + tinymce.minorVersion + } + }, + + resizeBy : function(dw, dh) { + var e = DOM.get(this.editor.id + '_ifr'); + + this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); + }, + + resizeTo : function(w, h, store) { + var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); + + // Boundery fix box + w = Math.max(s.theme_advanced_resizing_min_width || 100, w); + h = Math.max(s.theme_advanced_resizing_min_height || 100, h); + w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); + h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); + + // Resize iframe and container + DOM.setStyle(e, 'height', ''); + DOM.setStyle(ifr, 'height', h); + + if (s.theme_advanced_resize_horizontal) { + DOM.setStyle(e, 'width', ''); + DOM.setStyle(ifr, 'width', w); + + // Make sure that the size is never smaller than the over all ui + if (w < e.clientWidth) { + w = e.clientWidth; + DOM.setStyle(ifr, 'width', e.clientWidth); + } + } + + // Store away the size + if (store && s.theme_advanced_resizing_use_cookie) { + Cookie.setHash("TinyMCE_" + ed.id + "_size", { + cw : w, + ch : h + }); + } + }, + + destroy : function() { + var id = this.editor.id; + + Event.clear(id + '_resize'); + Event.clear(id + '_path_row'); + Event.clear(id + '_external_close'); + }, + + // Internal functions + + _simpleLayout : function(s, tb, o, p) { + var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; + + if (s.readonly) { + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + return ic; + } + + // Create toolbar container at top + if (lo == 'top') + t._addToolbars(tb, o); + + // Create external toolbar + if (lo == 'external') { + n = c = DOM.create('div', {style : 'position:relative'}); + n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); + DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); + n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); + etb = DOM.add(n, 'tbody'); + + if (p.firstChild.className == 'mceOldBoxModel') + p.firstChild.appendChild(c); + else + p.insertBefore(c, p.firstChild); + + t._addToolbars(etb, o); + + ed.onMouseUp.add(function() { + var e = DOM.get(ed.id + '_external'); + DOM.show(e); + + DOM.hide(lastExtID); + + var f = Event.add(ed.id + '_external_close', 'click', function() { + DOM.hide(ed.id + '_external'); + Event.remove(ed.id + '_external_close', 'click', f); + return false; + }); + + DOM.show(e); + DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); + + // Fixes IE rendering bug + DOM.hide(e); + DOM.show(e); + e.style.filter = ''; + + lastExtID = ed.id + '_external'; + + e = null; + }); + } + + if (sl == 'top') + t._addStatusBar(tb, o); + + // Create iframe container + if (!s.theme_advanced_toolbar_container) { + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + } + + // Create toolbar container at bottom + if (lo == 'bottom') + t._addToolbars(tb, o); + + if (sl == 'bottom') + t._addStatusBar(tb, o); + + return ic; + }, + + _rowLayout : function(s, tb, o) { + var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; + + dc = s.theme_advanced_containers_default_class || ''; + da = s.theme_advanced_containers_default_align || 'center'; + + each(explode(s.theme_advanced_containers || ''), function(c, i) { + var v = s['theme_advanced_container_' + c] || ''; + + switch (c.toLowerCase()) { + case 'mceeditor': + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + break; + + case 'mceelementpath': + t._addStatusBar(tb, o); + break; + + default: + a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); + a = 'mce' + t._ufirst(a); + + n = DOM.add(DOM.add(tb, 'tr'), 'td', { + 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da + }); + + to = cf.createToolbar("toolbar" + i); + t._addControls(v, to); + DOM.setHTML(n, to.renderHTML()); + o.deltaHeight -= s.theme_advanced_row_height; + } + }); + + return ic; + }, + + _addControls : function(v, tb) { + var t = this, s = t.settings, di, cf = t.editor.controlManager; + + if (s.theme_advanced_disable && !t._disabled) { + di = {}; + + each(explode(s.theme_advanced_disable), function(v) { + di[v] = 1; + }); + + t._disabled = di; + } else + di = t._disabled; + + each(explode(v), function(n) { + var c; + + if (di && di[n]) + return; + + // Compatiblity with 2.x + if (n == 'tablecontrols') { + each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { + n = t.createControl(n, cf); + + if (n) + tb.add(n); + }); + + return; + } + + c = t.createControl(n, cf); + + if (c) + tb.add(c); + }); + }, + + _addToolbars : function(c, o) { + var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup, toolbarsExist = false; + + toolbarGroup = cf.createToolbarGroup('toolbargroup', { + 'name': ed.getLang('advanced.toolbar'), + 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar') + }); + + t.toolbarGroup = toolbarGroup; + + a = s.theme_advanced_toolbar_align.toLowerCase(); + a = 'mce' + t._ufirst(a); + + n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"toolbar"}); + + // Create toolbar and add the controls + for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { + toolbarsExist = true; + tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); + + if (s['theme_advanced_buttons' + i + '_add']) + v += ',' + s['theme_advanced_buttons' + i + '_add']; + + if (s['theme_advanced_buttons' + i + '_add_before']) + v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; + + t._addControls(v, tb); + toolbarGroup.add(tb); + + o.deltaHeight -= s.theme_advanced_row_height; + } + // Handle case when there are no toolbar buttons and ensure editor height is adjusted accordingly + if (!toolbarsExist) + o.deltaHeight -= s.theme_advanced_row_height; + h.push(toolbarGroup.renderHTML()); + h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '')); + DOM.setHTML(n, h.join('')); + }, + + _addStatusBar : function(tb, o) { + var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; + + n = DOM.add(tb, 'tr'); + n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); + n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'}); + if (s.theme_advanced_path) { + DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path')); + DOM.add(n, 'span', {}, ': '); + } else { + DOM.add(n, 'span', {}, ' '); + } + + + if (s.theme_advanced_resizing) { + DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"}); + + if (s.theme_advanced_resizing_use_cookie) { + ed.onPostRender.add(function() { + var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); + + if (!o) + return; + + t.resizeTo(o.cw, o.ch); + }); + } + + ed.onPostRender.add(function() { + Event.add(ed.id + '_resize', 'click', function(e) { + e.preventDefault(); + }); + + Event.add(ed.id + '_resize', 'mousedown', function(e) { + var mouseMoveHandler1, mouseMoveHandler2, + mouseUpHandler1, mouseUpHandler2, + startX, startY, startWidth, startHeight, width, height, ifrElm; + + function resizeOnMove(e) { + e.preventDefault(); + + width = startWidth + (e.screenX - startX); + height = startHeight + (e.screenY - startY); + + t.resizeTo(width, height); + }; + + function endResize(e) { + // Stop listening + Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); + Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); + Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); + Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); + + width = startWidth + (e.screenX - startX); + height = startHeight + (e.screenY - startY); + t.resizeTo(width, height, true); + + ed.nodeChanged(); + }; + + e.preventDefault(); + + // Get the current rect size + startX = e.screenX; + startY = e.screenY; + ifrElm = DOM.get(t.editor.id + '_ifr'); + startWidth = width = ifrElm.clientWidth; + startHeight = height = ifrElm.clientHeight; + + // Register envent handlers + mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); + mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); + mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); + mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); + }); + }); + } + + o.deltaHeight -= 21; + n = tb = null; + }, + + _updateUndoStatus : function(ed) { + var cm = ed.controlManager, um = ed.undoManager; + + cm.setDisabled('undo', !um.hasUndo() && !um.typing); + cm.setDisabled('redo', !um.hasRedo()); + }, + + _nodeChanged : function(ed, cm, n, co, ob) { + var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches; + + tinymce.each(t.stateControls, function(c) { + cm.setActive(c, ed.queryCommandState(t.controls[c][1])); + }); + + function getParent(name) { + var i, parents = ob.parents, func = name; + + if (typeof(name) == 'string') { + func = function(node) { + return node.nodeName == name; + }; + } + + for (i = 0; i < parents.length; i++) { + if (func(parents[i])) + return parents[i]; + } + }; + + cm.setActive('visualaid', ed.hasVisual); + t._updateUndoStatus(ed); + cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); + + p = getParent('A'); + if (c = cm.get('link')) { + c.setDisabled((!p && co) || (p && !p.href)); + c.setActive(!!p && (!p.name && !p.id)); + } + + if (c = cm.get('unlink')) { + c.setDisabled(!p && co); + c.setActive(!!p && !p.name && !p.id); + } + + if (c = cm.get('anchor')) { + c.setActive(!co && !!p && (p.name || (p.id && !p.href))); + } + + p = getParent('IMG'); + if (c = cm.get('image')) + c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1); + + if (c = cm.get('styleselect')) { + t._importClasses(); + + formatNames = []; + each(c.items, function(item) { + formatNames.push(item.value); + }); + + matches = ed.formatter.matchAll(formatNames); + c.select(matches[0]); + tinymce.each(matches, function(match, index) { + if (index > 0) { + c.mark(match); + } + }); + } + + if (c = cm.get('formatselect')) { + p = getParent(ed.dom.isBlock); + + if (p) + c.select(p.nodeName.toLowerCase()); + } + + // Find out current fontSize, fontFamily and fontClass + getParent(function(n) { + if (n.nodeName === 'SPAN') { + if (!cl && n.className) + cl = n.className; + } + + if (ed.dom.is(n, s.theme_advanced_font_selector)) { + if (!fz && n.style.fontSize) + fz = n.style.fontSize; + + if (!fn && n.style.fontFamily) + fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); + + if (!fc && n.style.color) + fc = n.style.color; + + if (!bc && n.style.backgroundColor) + bc = n.style.backgroundColor; + } + + return false; + }); + + if (c = cm.get('fontselect')) { + c.select(function(v) { + return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; + }); + } + + // Select font size + if (c = cm.get('fontsizeselect')) { + // Use computed style + if (s.theme_advanced_runtime_fontsize && !fz && !cl) + fz = ed.dom.getStyle(n, 'fontSize', true); + + c.select(function(v) { + if (v.fontSize && v.fontSize === fz) + return true; + + if (v['class'] && v['class'] === cl) + return true; + }); + } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + } + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + }; + + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } + + if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { + p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); + + if (t.statusKeyboardNavigation) { + t.statusKeyboardNavigation.destroy(); + t.statusKeyboardNavigation = null; + } + + DOM.setHTML(p, ''); + + getParent(function(n) { + var na = n.nodeName.toLowerCase(), u, pi, ti = ''; + + // Ignore non element and bogus/hidden elements + if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')) + return; + + // Handle prefix + if (tinymce.isIE && n.scopeName !== 'HTML' && n.scopeName) + na = n.scopeName + ':' + na; + + // Remove internal prefix + na = na.replace(/mce\:/g, ''); + + // Handle node name + switch (na) { + case 'b': + na = 'strong'; + break; + + case 'i': + na = 'em'; + break; + + case 'img': + if (v = DOM.getAttrib(n, 'src')) + ti += 'src: ' + v + ' '; + + break; + + case 'a': + if (v = DOM.getAttrib(n, 'name')) { + ti += 'name: ' + v + ' '; + na += '#' + v; + } + + if (v = DOM.getAttrib(n, 'href')) + ti += 'href: ' + v + ' '; + + break; + + case 'font': + if (v = DOM.getAttrib(n, 'face')) + ti += 'font: ' + v + ' '; + + if (v = DOM.getAttrib(n, 'size')) + ti += 'size: ' + v + ' '; + + if (v = DOM.getAttrib(n, 'color')) + ti += 'color: ' + v + ' '; + + break; + + case 'span': + if (v = DOM.getAttrib(n, 'style')) + ti += 'style: ' + v + ' '; + + break; + } + + if (v = DOM.getAttrib(n, 'id')) + ti += 'id: ' + v + ' '; + + if (v = n.className) { + v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, ''); + + if (v) { + ti += 'class: ' + v + ' '; + + if (ed.dom.isBlock(n) || na == 'img' || na == 'span') + na += '.' + v; + } + } + + na = na.replace(/(html:)/g, ''); + na = {name : na, node : n, title : ti}; + t.onResolveName.dispatch(t, na); + ti = na.title; + na = na.name; + + //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; + pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); + + if (p.hasChildNodes()) { + p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild); + p.insertBefore(pi, p.firstChild); + } else + p.appendChild(pi); + }, ed.getBody()); + + if (DOM.select('a', p).length > 0) { + t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({ + root: ed.id + "_path_row", + items: DOM.select('a', p), + excludeFromTabOrder: true, + onCancel: function() { + ed.focus(); + } + }, DOM); + } + } + }, + + // Commands gets called by execCommand + + _sel : function(v) { + this.editor.execCommand('mceSelectNodeDepth', false, v); + }, + + _mceInsertAnchor : function(ui, v) { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/anchor.htm', + width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), + height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceCharMap : function() { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/charmap.htm', + width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), + height : 265 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceHelp : function() { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/about.htm', + width : 480, + height : 380, + inline : true + }, { + theme_url : this.url + }); + }, + + _mceShortcuts : function() { + var ed = this.editor; + ed.windowManager.open({ + url: this.url + '/shortcuts.htm', + width: 480, + height: 380, + inline: true + }, { + theme_url: this.url + }); + }, + + _mceColorPicker : function(u, v) { + var ed = this.editor; + + v = v || {}; + + ed.windowManager.open({ + url : this.url + '/color_picker.htm', + width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), + height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), + close_previous : false, + inline : true + }, { + input_color : v.color, + func : v.func, + theme_url : this.url + }); + }, + + _mceCodeEditor : function(ui, val) { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/source_editor.htm', + width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), + height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), + inline : true, + resizable : true, + maximizable : true + }, { + theme_url : this.url + }); + }, + + _mceImage : function(ui, val) { + var ed = this.editor; + + // Internal image object like a flash placeholder + if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1) + return; + + ed.windowManager.open({ + url : this.url + '/image.htm', + width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), + height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceLink : function(ui, val) { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/link.htm', + width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), + height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceNewDocument : function() { + var ed = this.editor; + + ed.windowManager.confirm('advanced.newdocument', function(s) { + if (s) + ed.execCommand('mceSetContent', false, ''); + }); + }, + + _mceForeColor : function() { + var t = this; + + this._mceColorPicker(0, { + color: t.fgColor, + func : function(co) { + t.fgColor = co; + t.editor.execCommand('ForeColor', false, co); + } + }); + }, + + _mceBackColor : function() { + var t = this; + + this._mceColorPicker(0, { + color: t.bgColor, + func : function(co) { + t.bgColor = co; + t.editor.execCommand('HiliteColor', false, co); + } + }); + }, + + _ufirst : function(s) { + return s.substring(0, 1).toUpperCase() + s.substring(1); + } + }); + + tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); +}(tinymce)); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/image.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/image.htm new file mode 100644 index 0000000..884890f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/image.htm @@ -0,0 +1,80 @@ + + + + {#advanced_dlg.image_title} + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+ x +
+
+
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1a377aba7784d3a0a0fabb4d22b8114cde25ace GIT binary patch literal 2584 zcmb7Bc{JPk7XQT-ib;b~B!n)ZQYwihloXMus-;?bMO70&%O72KlgJueK-#swASle5Y5YhT*O%%dE zAkc>z8ik-xeL_Q`VvZfo0TzI`m>5`0R2&QjOGtcPyzrU;Ul*Hn2<045)l;>V5-MK0^|t(rvM}*3>DEeQ&X2g z3ksC~i~iFKh=?B5i-83o3#TV^B0=RA*fOi#-=2VN?CKn!VTTmGv17_PGbp~tmc*?G?Q3b)|K!w2vr zE#B_JH@ru}sZ}~Z&Y(BdJ;w0B<_kXtGuOzs3$vq}6fO9@x%kiyX*#pRnd1k|;ZC9lr#>sh{3$yY|bYY6^>YT3sgsjiaZ zt)366^&;$S^TAwvN^I2ac+hLh>*VqIos|eL+aL&+l(KvNwWYDctNE^CZRyy^Hk}Gm zs%JVikvO#Mk)X?@TXY=wD38V@;t?)q3)?k2YvxLQMV|Z{nbR2g{a11;p-%!QgLK)B zOxbfUi(pzhsbuCxGBk6FDP#0RPN626_I($Qo;ZGhzWMfs%mMoI+aSZnc5a0+bG2w> zdwgm4&zp*i7B>D%H%G$4FMfG12)D3b{1}-HBqY<6w=n2s8b{B_D%uFYtH{l(Gjv9e zWpFy-6fULzp*cl~BJ4!l*}~J{8#NXk`;x5Nxc+^GEA?|AACg+K)(M|zxHsxFUr9^W z8>QdvdWEw!My?R7!O*p>?3Vb|(=N3|J09OD{Yf#{7*(=rbThiBH~Pm^1tz8SQ?S_2 zsL7(bX9dJ9E%uV^(+dSB)^w=MsF&jg*N2Yjo41m`+WsE&JM@CatfiOlPhC?QPlCp7 zkjesJENk4=dSaN^0M0u1TG4#qeAKgyC$GLGD7II&*kr2|#1!BvS`Grg^OIWk%YAqd zvOcmz%SU-HCVg&rbnPaNZ@-T>)?IP3SO z`YKP&>q@U~m`o*wvU{S1o};9b|8*hRw?;H&TJo4a*7;m_)Q!aD3a1rnAWdVgkH=Lu zObSl!m}$JlWj5VNXvuO#F5@@cmhB(M4yEbSXe%Ptp_SH5SxG-pk!2PJGzE6Dd$(C0 z@d~vVd*NT)SU<2GYn`hA?4|dNDwAu?ZjXWSO9CasoBO}LQ2uFAj@4t0$2xTLEHxw3 z9KJCkFq|08Vmgmxahm%mjA%=I%Gs1mlNy$Km`%^o|A2`!bMPtTrP9y*c^+0M7OCcy z*j^fh4AjCI;2fso0|cz3p5Ih7h72bSVc6YE5O%+w*;qWtI~3hL4IzfscqG;j3j4$- zGt%o#6n#5{gEJw#3{=edteC(w|C#XBp!T8k; z1)EnwGqJ26>c-cDOJv5}Snt!0vhVoS>u03BZj_q+20phaQo81-&IAo;URjUJNTP{F zJ1=+YL^+~uVv(VHc>guRDB*Gug-NN7$n25zaX5RGugKeb5qMo|<1CcSE4+{PPcxQG zv3ZU;p_ZeurmcbMiK+xooGWRsM@gr+Dhpr7I*ST8obbMa5|CLQW{h63?CM{F=X{nL zs0Exdc{AnwAx@;9BObf9QiL5^p(iN?W^L~%mn5*ee?M2!d$&oxYIK&9bd1oX&-$gA z3T&To>*_6TDnv)9{*of(wm?U7D)X3u^_3;FijXcEo0S{8x^h(v0jeTdW0Q} zOC0Y|wO&b<-xFprPec9-SKwJYz4Pbz|~nyPrCb5|2|%P;^(%>|XHw4OO3JkE+QD zWRIhqlT(0Yu4KKuvUjKlnW`S~l&?fXH-Bf`2d!J=4UHXDv4xLDnvd2_EWTb3hReh6sXpEI(hmlM{1 gF4ie0tgS$y#z=nxNn#Fpd0bt##g=j86Aowo21S>Ot^fc4 literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/flash.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/flash.gif new file mode 100644 index 0000000000000000000000000000000000000000..dec3f7c7028df98657860529461af29b8793601c GIT binary patch literal 239 zcmVM~p;I&fgwbZVtlRJPxC7uw?yFxEX;uVr4IeWCJ^(5m4hjYVM>G^+2V)FnXE$mS p86yHh03AmHCKD}bWutOkFce4&0zF5CG_Myp4hRT+ig>^g06S0cRV@Gj literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/icons.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca222490188b939d695f5ff8823c42c0394c65f7 GIT binary patch literal 11982 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 z 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 literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/iframe.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/iframe.gif new file mode 100644 index 0000000000000000000000000000000000000000..410c7ad084db698e9f35e3230233aa4040682566 GIT binary patch literal 600 zcmZ?wbhEHb6krfwcoxm@|NsB$<##6SeDUYszh8g<{{H*-%a7k_-3KZc-T3+YPwBiX zzyAIE^Y`z!U%$Wp{QdX;|FQ*Fw;jIy{pasbUw?o3{yVB>Q_sRgx-G9iegFLZcfrha#d9w;%sU=Zx~6K$tw~$%z4`#O^Y@3Z zKV#~)MpSKh@#b63l#}6=>yq2|{`&JLqwny)|NnC)o%r$l&-Y)yKYjo8?#quSuRaGB zt_&<%`RV)bl#YEr{`~p)?RU|v^Y1_Z`u*?Ux8J`*N>>+5JlMAOZr+qr@y$D{mfVhO z+zt#7208-8pDc_F4ABfaAUi>E!oa?@A-bu#r8Qd6oKeb*Lx9UTz)0QBL@+vxY38ii zvqGa87c5+~h&?)zVa3W-D;=U$88}^qMBJ^ERU|z17!;#97+4%Rd1XcXJq#>t8KR;E z7zr5i6BgH5y=gAD)sAQlGB zh8au?j!n~E(Pks?@!j1fR&j*RWY8GF(-=x H6d0@lT&58X literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..acdf4085f3068c4c0a1d6855f4b80dae8bac3068 GIT binary patch literal 325 zcmV-L0lNN2Nk%w1VPpUd0J9GO`>v<{=;ru;boX6P{`2zsmyZ3>&HK5t_;hIbi-G;z z+4`cI{KdfcXj}GCLjV8&A^8LW000jFEC2ui0Av6R000E?@X1N5y*TU5yZ>M)j$|1M z4Ouvb$pHu>IW8BZq|n;U0s@T!VM5~w1_+1X!EiVl!&PITYdjT!ffYfpt{jAfv%qvh zA63WUHSlr7LkeyaV4(pM0f50(II?RD4RtMg4-E+tFhdAy5{3c=0}3Bg9Y8`B2To20 zR%SO62L%9}0H+dzoKB$+2TOwzUrwi{XiBM^4V#>63q3!LsU3u93zH8CdwqY%62;1g z0g8ze$k93lWExp`CUe|K4qOWk17ZeJ0|5pDP6+}};{>bI@lOWj=kf}r2sHp7w9-Ie XK%9UG6W(*AX-vY05F<*&5CH%?Gwy&_ literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/quicktime.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/quicktime.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f10e7aa6b6ab40ee69a1a41a961c092168d6fda GIT binary patch literal 301 zcmV+|0n+|QNk%w1VGsZi0Q4UK+~)L6v+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8!}sO$`q%8%`=C5EEn#1d#z95FHtK5(^#(cp^e+Y!d=4FCrFbY9A3U z4-O0-4kHJPJ2(jk13n5879s!!3Q`V>8VwW`9my3H#|R8ZD+fdx0E-+693cQZ;!k;* literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/realmedia.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/realmedia.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdfe0b9ac05869ae845fdd828eaad97cc0c69dbc GIT binary patch literal 439 zcmV;o0Z9HwNk%w1VI=?(0K^{vQcz8xz}f&njBB06v9GQ`Jv%NdDHCI&z`wqZw$(Lw zuFTBL!Pe#<92tv>h)9OE1Xh}vnVEHSaeb-GByg#tqM_B*)YRkdSdqTu&}n`s(k;lb>H+`#+Q6|3c{>OLTv23;utm>DSfy zuOD3adm!iUuGar)4FAhzel5=UwZ7*6(K(+k@BP_g{o}}@k7u_2k7W2iGwlom!+#Z( z|Hj5w_4MwTo8QaHxm#EFYX1DUOO|}vvgQBb!_ST${rmj+`+Fep|C$j4HGtwz7FGrZ zO$Hs1VIV&_u+2R%#bJV$RKJIcL*N7vss0Y-EsB{gGlSJaTr>sRLKbLj5HMTpyK;)l zJcfpaMYltBZdEK6Kht6+BPy*VtthFMtIoqFC=#Tu$e^eaDXCC7U0vOYOJjNk(;P!VagC#fQ*?7otVO)-#9rK#nB%ry4`E_DHQ Wm01j~^6E13^D1O7+^=wCum%9s<%z=p literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/trans.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/trans.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/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/video.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/img/video.gif new file mode 100644 index 0000000000000000000000000000000000000000..3570104077a3b3585f11403c8d4c3fc9351f35d2 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc$UTx9v<%P?Ok48Ze?YanwpxCkzrwBk(ZYzB_&l;Qw!gmM(Ep^QBwbzIoSdAh>*2n> zz9l6k0Xw#(?);y5^ls9w|LObxXI*si^YfcEYu3*P8J(S-PEJlaNB-yTd}C^Ax@_69 zzP`Ryt5)S5`=P3;TDk9SbaeFk_3NiTjGA~aFd-pf@}tlxQ>GLb7jM|Gp`oFHlaq7F zk|nvhxjsHV=g+oST3Rl6T(N1>rn0iK*Ed>3MMVn>3vF#}**q!otE>Sy|^jDoRUBoBANRc=wyaJged$+}u3x zK}ld>puWET{||NozXdO-0f3nK$V8iNkVNKl+Guy1NeYie$3 zZB}=&Zex!RYq8YfVwgNdMpdFkN|rU!Fha}0m66q>CDxczOhH^pM9qvxw1p`;Rftzu zQJ&9}g>iErlc2ORw;aC_=l*6UJ=st%r*ISVV2jgDT<)w>rXHGL<21Kdo z#uyug^O^t z0hZGrt*x!>$1C!zn`W5@`ts6_uMW)2%<0NUEKIo?SIPPE=}U0}7Z(?JcX!y=*;bF< zCWz-=h7+2ao9)(dOHM;+X=xs9)%!~xc&ICMZdRYdUQ2$^@9y(6X3NCIz{cM7f^Z=Q z1_tQ95kgl8b%R%OiYTIo7LSdE^@}A^8LW002J#EC2ui01p5U000KOz@O0K01zUifeIyT9%!RzMDgehG|mwLz+Eh; z7Z~iE zrX?OfJ^>XeDJK)xJuWOB3_l1N0Ra>g4Gk^=ED0V6LI?>4;Q|6OB{LplLMRLg8U5-E J?0y6R06W6!pgRBn literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/about.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/about.js new file mode 100644 index 0000000..daf4909 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/about.js @@ -0,0 +1,73 @@ +tinyMCEPopup.requireLangPack(); + +function init() { + var ed, tcont; + + tinyMCEPopup.resizeToInnerSize(); + ed = tinyMCEPopup.editor; + + // Give FF some time + window.setTimeout(insertHelpIFrame, 10); + + tcont = document.getElementById('plugintablecontainer'); + document.getElementById('plugins_tab').style.display = 'none'; + + var html = ""; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + + tinymce.each(ed.plugins, function(p, n) { + var info; + + if (!p.getInfo) + return; + + html += ''; + + info = p.getInfo(); + + if (info.infourl != null && info.infourl != '') + html += ''; + else + html += ''; + + if (info.authorurl != null && info.authorurl != '') + html += ''; + else + html += ''; + + html += ''; + html += ''; + + document.getElementById('plugins_tab').style.display = ''; + + }); + + html += ''; + html += '
' + ed.getLang('advanced_dlg.about_plugin') + '' + ed.getLang('advanced_dlg.about_author') + '' + ed.getLang('advanced_dlg.about_version') + '
' + info.longname + '' + info.longname + '' + info.author + '' + info.author + '' + info.version + '
'; + + tcont.innerHTML = html; + + tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; + tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; +} + +function insertHelpIFrame() { + var html; + + if (tinyMCEPopup.getParam('docs_url')) { + html = ''; + document.getElementById('iframecontainer').innerHTML = html; + document.getElementById('help_tab').style.display = 'block'; + document.getElementById('help_tab').setAttribute("aria-hidden", "false"); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/anchor.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/anchor.js new file mode 100644 index 0000000..a3a0186 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/anchor.js @@ -0,0 +1,56 @@ +tinyMCEPopup.requireLangPack(); + +var AnchorDialog = { + init : function(ed) { + var action, elm, f = document.forms[0]; + + this.editor = ed; + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + v = ed.dom.getAttrib(elm, 'name') || ed.dom.getAttrib(elm, 'id'); + + if (v) { + this.action = 'update'; + f.anchorName.value = v; + } + + f.insert.value = ed.getLang(elm ? 'update' : 'insert'); + }, + + update : function() { + var ed = this.editor, elm, name = document.forms[0].anchorName.value, attribName; + + if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { + tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); + return; + } + + tinyMCEPopup.restoreSelection(); + + if (this.action != 'update') + ed.selection.collapse(1); + + var aRule = ed.schema.getElementRule('a'); + if (!aRule || aRule.attributes.name) { + attribName = 'name'; + } else { + attribName = 'id'; + } + + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + if (elm) { + elm.setAttribute(attribName, name); + elm[attribName] = name; + ed.undoManager.add(); + } else { + // create with zero-sized nbsp so that in Webkit where anchor is on last line by itself caret cannot be placed after it + var attrs = {'class' : 'mceItemAnchor'}; + attrs[attribName] = name; + ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', attrs, '\uFEFF')); + ed.nodeChanged(); + } + + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/charmap.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/charmap.js new file mode 100644 index 0000000..cbb4172 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/charmap.js @@ -0,0 +1,363 @@ +/** + * charmap.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +tinyMCEPopup.requireLangPack(); + +var 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'], + ['♠', '♠', true, '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'] +]; + +tinyMCEPopup.onInit.add(function() { + tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); + addKeyboardNavigation(); +}); + +function addKeyboardNavigation(){ + var tableElm, cells, settings; + + cells = tinyMCEPopup.dom.select("a.charmaplink", "charmapgroup"); + + settings ={ + root: "charmapgroup", + items: cells + }; + cells[0].tabindex=0; + tinyMCEPopup.dom.addClass(cells[0], "mceFocus"); + if (tinymce.isGecko) { + cells[0].focus(); + } else { + setTimeout(function(){ + cells[0].focus(); + }, 100); + } + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); +} + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20, i; + var html = '
'+ + ''; + var cols=-1; + + for (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 += '
'; + html = html.replace(/<\/tr>/g, ''); + + return html; +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); + + tinyMCEPopup.editor.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/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/color_picker.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/color_picker.js new file mode 100644 index 0000000..cc891c1 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/color_picker.js @@ -0,0 +1,345 @@ +tinyMCEPopup.requireLangPack(); + +var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; + +var colors = [ + "#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" +]; + +var named = { + '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', + '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', + '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', + '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', + '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', + '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', + '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', + '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', + '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', + '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', + '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', + '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', + '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', + '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', + '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', + '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', + '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', + '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', + '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', + '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', + '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', + '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', + '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' +}; + +var namedLookup = {}; + +function init() { + var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; + + tinyMCEPopup.resizeToInnerSize(); + + generatePicker(); + generateWebColors(); + generateNamedColors(); + + if (inputColor) { + changeFinalColor(inputColor); + + col = convertHexToRGB(inputColor); + + if (col) + updateLight(col.r, col.g, col.b); + } + + for (key in named) { + value = named[key]; + namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); + } +} + +function toHexColor(color) { + var matches, red, green, blue, toInt = parseInt; + + function hex(value) { + value = parseInt(value).toString(16); + + return value.length > 1 ? value : '0' + value; // Padd with leading zero + }; + + color = tinymce.trim(color); + color = color.replace(/^[#]/, '').toLowerCase(); // remove leading '#' + color = namedLookup[color] || color; + + matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/.exec(color); + + if (matches) { + red = toInt(matches[1]); + green = toInt(matches[2]); + blue = toInt(matches[3]); + } else { + matches = /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(color); + + if (matches) { + red = toInt(matches[1], 16); + green = toInt(matches[2], 16); + blue = toInt(matches[3], 16); + } else { + matches = /^([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(color); + + if (matches) { + red = toInt(matches[1] + matches[1], 16); + green = toInt(matches[2] + matches[2], 16); + blue = toInt(matches[3] + matches[3], 16); + } else { + return ''; + } + } + } + + return '#' + hex(red) + hex(green) + hex(blue); +} + +function insertAction() { + var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); + + var hexColor = toHexColor(color); + + if (hexColor === '') { + var text = tinyMCEPopup.editor.getLang('advanced_dlg.invalid_color_value'); + tinyMCEPopup.alert(text + ': ' + color); + } + else { + tinyMCEPopup.restoreSelection(); + + if (f) + f(hexColor); + + tinyMCEPopup.close(); + } +} + +function showColor(color, name) { + if (name) + document.getElementById("colorname").innerHTML = name; + + document.getElementById("preview").style.backgroundColor = color; + document.getElementById("color").value = color.toUpperCase(); +} + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + if (!col) + return col; + + 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 {r : r, g : g, b : b}; + } + + return null; +} + +function generatePicker() { + var el = document.getElementById('light'), h = '', i; + + for (i = 0; i < detail; i++){ + h += '
'; + } + + el.innerHTML = h; +} + +function generateWebColors() { + var el = document.getElementById('webcolors'), h = '', i; + + if (el.className == 'generated') + return; + + // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. + h += '
' + + ''; + + for (i=0; i' + + ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; + if ((i+1) % 18 == 0) + h += ''; + } + + h += '
'; + + el.innerHTML = h; + el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el.firstChild); +} + +function paintCanvas(el) { + tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { + var context; + if (canvas.getContext && (context = canvas.getContext("2d"))) { + context.fillStyle = canvas.getAttribute('data-color'); + context.fillRect(0, 0, 10, 10); + } + }); +} +function generateNamedColors() { + var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; + + if (el.className == 'generated') + return; + + for (n in named) { + v = named[n]; + h += ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; + i++; + } + + el.innerHTML = h; + el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el); +} + +function enableKeyboardNavigation(el) { + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: el, + items: tinyMCEPopup.dom.select('a', el) + }, tinyMCEPopup.dom); +} + +function dechex(n) { + return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); +} + +function computeColor(e) { + var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB, pos = tinyMCEPopup.dom.getPos(e.target); + + x = e.offsetX ? e.offsetX : (e.target ? e.clientX - pos.x : 0); + y = e.offsetY ? e.offsetY : (e.target ? e.clientY - pos.y : 0); + + partWidth = document.getElementById('colors').width / 6; + partDetail = detail / 2; + imHeight = document.getElementById('colors').height; + + r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; + g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); + b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); + + coef = (imHeight - y) / imHeight; + r = 128 + (r - 128) * coef; + g = 128 + (g - 128) * coef; + b = 128 + (b - 128) * coef; + + changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); + updateLight(r, g, b); +} + +function updateLight(r, g, b) { + var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; + + for (i=0; i=0) && (i'); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '180px'; + + e = ed.selection.getNode(); + + this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList')); + + if (e.nodeName == 'IMG') { + f.src.value = ed.dom.getAttrib(e, 'src'); + f.alt.value = ed.dom.getAttrib(e, 'alt'); + f.border.value = this.getAttrib(e, 'border'); + f.vspace.value = this.getAttrib(e, 'vspace'); + f.hspace.value = this.getAttrib(e, 'hspace'); + f.width.value = ed.dom.getAttrib(e, 'width'); + f.height.value = ed.dom.getAttrib(e, 'height'); + f.insert.value = ed.getLang('update'); + this.styleVal = ed.dom.getAttrib(e, 'style'); + selectByValue(f, 'image_list', f.src.value); + selectByValue(f, 'align', this.getAttrib(e, 'align')); + this.updateStyle(); + } + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = typeof(l) === 'function' ? l() : window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + update : function() { + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; + + tinyMCEPopup.restoreSelection(); + + if (f.src.value === '') { + if (ed.selection.getNode().nodeName == 'IMG') { + ed.dom.remove(ed.selection.getNode()); + ed.execCommand('mceRepaint'); + } + + tinyMCEPopup.close(); + return; + } + + if (!ed.settings.inline_styles) { + args = tinymce.extend(args, { + vspace : nl.vspace.value, + hspace : nl.hspace.value, + border : nl.border.value, + align : getSelectValue(f, 'align') + }); + } else + args.style = this.styleVal; + + tinymce.extend(args, { + src : f.src.value.replace(/ /g, '%20'), + alt : f.alt.value, + width : f.width.value, + height : f.height.value + }); + + el = ed.selection.getNode(); + + if (el && el.nodeName == 'IMG') { + ed.dom.setAttribs(el, args); + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); + } else { + tinymce.each(args, function(value, name) { + if (value === "") { + delete args[name]; + } + }); + + ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1}); + ed.undoManager.add(); + } + + tinyMCEPopup.close(); + }, + + updateStyle : function() { + var dom = tinyMCEPopup.dom, st = {}, v, f = document.forms[0]; + + if (tinyMCEPopup.editor.settings.inline_styles) { + tinymce.each(tinyMCEPopup.dom.parseStyle(this.styleVal), function(value, key) { + st[key] = value; + }); + + // Handle align + v = getSelectValue(f, 'align'); + if (v) { + if (v == 'left' || v == 'right') { + st['float'] = v; + delete st['vertical-align']; + } else { + st['vertical-align'] = v; + delete st['float']; + } + } else { + delete st['float']; + delete st['vertical-align']; + } + + // Handle border + v = f.border.value; + if (v || v == '0') { + if (v == '0') + st['border'] = '0'; + else + st['border'] = v + 'px solid black'; + } else + delete st['border']; + + // Handle hspace + v = f.hspace.value; + if (v) { + delete st['margin']; + st['margin-left'] = v + 'px'; + st['margin-right'] = v + 'px'; + } else { + delete st['margin-left']; + delete st['margin-right']; + } + + // Handle vspace + v = f.vspace.value; + if (v) { + delete st['margin']; + st['margin-top'] = v + 'px'; + st['margin-bottom'] = v + 'px'; + } else { + delete st['margin-top']; + delete st['margin-bottom']; + } + + // Merge + st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); + this.styleVal = dom.serializeStyle(st, 'img'); + } + }, + + getAttrib : function(e, at) { + var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; + + if (ed.settings.inline_styles) { + switch (at) { + case 'align': + if (v = dom.getStyle(e, 'float')) + return v; + + if (v = dom.getStyle(e, 'vertical-align')) + return v; + + break; + + case 'hspace': + v = dom.getStyle(e, 'margin-left') + v2 = dom.getStyle(e, 'margin-right'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'vspace': + v = dom.getStyle(e, 'margin-top') + v2 = dom.getStyle(e, 'margin-bottom'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'border': + v = 0; + + tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { + sv = dom.getStyle(e, 'border-' + sv + '-width'); + + // False or not the same as prev + if (!sv || (sv != v && v !== 0)) { + v = 0; + return false; + } + + if (sv) + v = sv; + }); + + if (v) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + } + } + + if (v = dom.getAttrib(e, at)) + return v; + + return ''; + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.width.value = f.height.value = ""; + }, + + updateImageData : function() { + var f = document.forms[0], t = ImageDialog; + + if (f.width.value == "") + f.width.value = t.preloadImg.width; + + if (f.height.value == "") + f.height.value = t.preloadImg.height; + }, + + getImageData : function() { + var f = document.forms[0]; + + this.preloadImg = new Image(); + this.preloadImg.onload = this.updateImageData; + this.preloadImg.onerror = this.resetImageData; + this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); + } +}; + +ImageDialog.preInit(); +tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/link.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/link.js new file mode 100644 index 0000000..b08b2ba --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/link.js @@ -0,0 +1,159 @@ +tinyMCEPopup.requireLangPack(); + +var LinkDialog = { + preInit : function() { + var url; + + if (url = tinyMCEPopup.getParam("external_link_list_url")) + document.write(''); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '180px'; + + this.fillClassList('class_list'); + this.fillFileList('link_list', 'tinyMCELinkList'); + this.fillTargetList('target_list'); + + if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { + f.href.value = ed.dom.getAttrib(e, 'href'); + f.linktitle.value = ed.dom.getAttrib(e, 'title'); + f.insert.value = ed.getLang('update'); + selectByValue(f, 'link_list', f.href.value); + selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); + selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); + } + }, + + update : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); + + tinyMCEPopup.restoreSelection(); + e = ed.dom.getParent(ed.selection.getNode(), 'A'); + + // Remove element if there is no href + if (!f.href.value) { + if (e) { + b = ed.selection.getBookmark(); + ed.dom.remove(e, 1); + ed.selection.moveToBookmark(b); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + return; + } + } + + // Create new anchor elements + if (e == null) { + ed.getDoc().execCommand("unlink", false, null); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); + + tinymce.each(ed.dom.select("a"), function(n) { + if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { + e = n; + + ed.dom.setAttribs(e, { + href : href, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + }); + } else { + ed.dom.setAttribs(e, { + href : href, + title : f.linktitle.value + }); + + if (f.target_list) { + ed.dom.setAttrib(e, 'target', getSelectValue(f, "target_list")); + } + + if (f.class_list) { + ed.dom.setAttrib(e, 'class', getSelectValue(f, "class_list")); + } + } + + // Don't move caret if selection was image + if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { + ed.focus(); + ed.selection.select(e); + ed.selection.collapse(0); + tinyMCEPopup.storeSelection(); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + }, + + checkPrefix : function(n) { + if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) + n.value = 'mailto:' + n.value; + + if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) + n.value = 'http://' + n.value; + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillClassList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { + cl = []; + + tinymce.each(v.split(';'), function(v) { + var p = v.split('='); + + cl.push({'title' : p[0], 'class' : p[1]}); + }); + } else + cl = tinyMCEPopup.editor.dom.getClasses(); + + if (cl.length > 0) { + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + + tinymce.each(cl, function(o) { + lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillTargetList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v; + + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); + + if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { + tinymce.each(v.split(','), function(v) { + v = v.split('='); + lst.options[lst.options.length] = new Option(v[0], v[1]); + }); + } + } +}; + +LinkDialog.preInit(); +tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/source_editor.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/source_editor.js new file mode 100644 index 0000000..d417937 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/js/source_editor.js @@ -0,0 +1,78 @@ +tinyMCEPopup.requireLangPack(); +tinyMCEPopup.onInit.add(onLoadInit); + +function saveContent() { + tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Remove Gecko spellchecking + if (tinymce.isGecko) + document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); + + document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); + + if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { + turnWrapOn(); + document.getElementById('wraped').checked = true; + } + + resizeInputs(); +} + +function setWrap(val) { + var v, n, s = document.getElementById('htmlSource'); + + s.wrap = val; + + if (!tinymce.isIE) { + v = s.value; + n = s.cloneNode(false); + n.setAttribute("wrap", val); + s.parentNode.replaceChild(n, s); + n.value = v; + } +} + +function setWhiteSpaceCss(value) { + var el = document.getElementById('htmlSource'); + tinymce.DOM.setStyle(el, 'white-space', value); +} + +function turnWrapOff() { + if (tinymce.isWebKit) { + setWhiteSpaceCss('pre'); + } else { + setWrap('off'); + } +} + +function turnWrapOn() { + if (tinymce.isWebKit) { + setWhiteSpaceCss('pre-wrap'); + } else { + setWrap('soft'); + } +} + +function toggleWordWrap(elm) { + if (elm.checked) { + turnWrapOn(); + } else { + turnWrapOff(); + } +} + +function resizeInputs() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('htmlSource'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 65) + 'px'; + } +} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de.js new file mode 100644 index 0000000..4bd5419 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.advanced',{"underline_desc":"Unterstrichen (Strg+U)","italic_desc":"Kursiv (Strg+I)","bold_desc":"Fett (Strg+B)",dd:"Definitionsbeschreibung",dt:"Definitionsbegriff",samp:"Beispiel",code:"Code",blockquote:"Zitatblock",h6:"\u00dcberschrift 6",h5:"\u00dcberschrift 5",h4:"\u00dcberschrift 4",h3:"\u00dcberschrift 3",h2:"\u00dcberschrift 2",h1:"\u00dcberschrift 1",pre:"Rohdaten",address:"Adresse",div:"Zusammenh\u00e4ngender Bereich",paragraph:"Absatz",block:"Vorlage",fontdefault:"Schriftart","font_size":"Schriftgr\u00f6\u00dfe","style_select":"Format","anchor_delta_width":"13","more_colors":"Weitere Farben","toolbar_focus":"Zur Werkzeugleiste springen: Alt+Q; Zum Editor springen: Alt-Z; Zum Elementpfad springen: Alt-X",newdocument:"Soll wirklich der ganze Inhalt gel\u00f6scht werden?",path:"Pfad","clipboard_msg":"Kopieren, Ausschneiden und Einf\u00fcgen sind im Mozilla Firefox nicht m\u00f6glich. Mehr \u00fcber dieses Problem erfahren?","blockquote_desc":"Zitatblock","help_desc":"Hilfe","newdocument_desc":"Neues Dokument","image_props_desc":"Bildeigenschaften","paste_desc":"Einf\u00fcgen","copy_desc":"Kopieren","cut_desc":"Ausschneiden","anchor_desc":"Anker einf\u00fcgen/ver\u00e4ndern","visualaid_desc":"Hilfslinien und unsichtbare Elemente ein-/ausblenden","charmap_desc":"Sonderzeichen einf\u00fcgen","backcolor_desc":"Hintergrundfarbe","forecolor_desc":"Textfarbe","custom1_desc":"Benutzerdefinierte Beschreibung","removeformat_desc":"Formatierungen zur\u00fccksetzen","hr_desc":"Trennlinie einf\u00fcgen","sup_desc":"Hochgestellt","sub_desc":"Tiefgestellt","code_desc":"HTML-Quellcode bearbeiten","cleanup_desc":"Quellcode aufr\u00e4umen","image_desc":"Bild einf\u00fcgen/ver\u00e4ndern","unlink_desc":"Link entfernen","link_desc":"Link einf\u00fcgen/ver\u00e4ndern","redo_desc":"Wiederholen (Strg+Y)","undo_desc":"R\u00fcckg\u00e4ngig (Strg+Z)","indent_desc":"Einr\u00fccken","outdent_desc":"Ausr\u00fccken","numlist_desc":"Sortierte Liste","bullist_desc":"Unsortierte Liste","justifyfull_desc":"Blocksatz","justifyright_desc":"Rechtsb\u00fcndig","justifycenter_desc":"Zentriert","justifyleft_desc":"Linksb\u00fcndig","striketrough_desc":"Durchgestrichen","help_shortcut":"F\u00fcr die Toolbar ALT-F10 dr\u00fccken. F\u00fcr die Hilfe ALT-0 dr\u00fccken","rich_text_area":"Rich Text Feld","shortcuts_desc":"Eingabehilfe",toolbar:"Pfeiltasten verwenden um Funktionen auszuw\u00e4hlen","anchor_delta_height":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de_dlg.js new file mode 100644 index 0000000..0ee5af9 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.advanced_dlg',{"link_list":"Linkliste","link_is_external":"Diese Adresse scheint ein externer Link zu sein. Soll das dazu ben\u00f6tigte \"http://\" vorangestellt werden?","link_is_email":"Diese Adresse scheint eine E-Mail Adresse zu sein. Soll das dazu ben\u00f6tigte \"mailto:\" vorangestellt werden?","link_titlefield":"Titel","link_target_blank":"In neuem Fenster \u00f6ffnen","link_target_same":"Im selben Fenster \u00f6ffnen","link_target":"Fenster","link_url":"Adresse","link_title":"Link einf\u00fcgen/ver\u00e4ndern","image_align_right":"Rechts","image_align_left":"Links","image_align_textbottom":"Unten im Text","image_align_texttop":"Oben im Text","image_align_bottom":"Unten","image_align_middle":"Mittig","image_align_top":"Oben","image_align_baseline":"Zeile","image_align":"Ausrichtung","image_hspace":"Horizontaler Abstand","image_vspace":"Vertikaler Abstand","image_dimensions":"Abmessungen","image_alt":"Alternativtext","image_list":"Bilderliste","image_border":"Rahmen","image_src":"Adresse","image_title":"Bild einf\u00fcgen/ver\u00e4ndern","charmap_title":"Sonderzeichen","colorpicker_name":"Name:","colorpicker_color":"Farbe:","colorpicker_named_title":"Benannte Farben","colorpicker_named_tab":"Benannte Farben","colorpicker_palette_title":"Farbpalette","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Farbwahl","colorpicker_picker_tab":"Farbwahl","colorpicker_title":"Farbe","code_wordwrap":"Automatischer Zeilenumbruch","code_title":"HTML-Quellcode bearbeiten","anchor_name":"Name des Ankers","anchor_title":"Anker einf\u00fcgen/ver\u00e4ndern","about_loaded":"Geladene Plugins","about_version":"Version","about_author":"Urheber","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"Lizenzbedingungen","about_help":"Hilfe","about_general":"\u00dcber","about_title":"\u00dcber TinyMCE","charmap_usage":"Navigation mit linken und rechten Pfeiltasten.","anchor_invalid":"Bitte einen g\u00fcltigen Namen f\u00fcr den Anker eingeben!","accessibility_help":"Eingabehilfe","accessibility_usage_title":"Allgemeine Verwendung","invalid_color_value":"Ung\u00fcltige Farbangabe"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en.js new file mode 100644 index 0000000..6e58481 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.advanced',{"underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)",dd:"Definition Description",dt:"Definition Term ",samp:"Code Sample",code:"Code",blockquote:"Block Quote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"DIV",paragraph:"Paragraph",block:"Format",fontdefault:"Font Family","font_size":"Font Size","style_select":"Styles","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","more_colors":"More Colors...","toolbar_focus":"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Are you sure you want clear all contents?",path:"Path","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","blockquote_desc":"Block Quote","help_desc":"Help","newdocument_desc":"New Document","image_props_desc":"Image Properties","paste_desc":"Paste (Ctrl+V)","copy_desc":"Copy (Ctrl+C)","cut_desc":"Cut (Ctrl+X)","anchor_desc":"Insert/Edit Anchor","visualaid_desc":"show/Hide Guidelines/Invisible Elements","charmap_desc":"Insert Special Character","backcolor_desc":"Select Background Color","forecolor_desc":"Select Text Color","custom1_desc":"Your Custom Description Here","removeformat_desc":"Remove Formatting","hr_desc":"Insert Horizontal Line","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"Edit HTML Source","cleanup_desc":"Cleanup Messy Code","image_desc":"Insert/Edit Image","unlink_desc":"Unlink","link_desc":"Insert/Edit Link","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","indent_desc":"Increase Indent","outdent_desc":"Decrease Indent","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","justifyfull_desc":"Align Full","justifyright_desc":"Align Right","justifycenter_desc":"Align Center","justifyleft_desc":"Align Left","striketrough_desc":"Strikethrough","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help",toolbar:"Toolbar"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js new file mode 100644 index 0000000..50cd87e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.advanced_dlg', {"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character", "charmap_usage":"Use left and right arrows to navigate.","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage","invalid_color_value":"Invalid color value","":""}); diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/link.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/link.htm new file mode 100644 index 0000000..4a2459f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/link.htm @@ -0,0 +1,57 @@ + + + + {#advanced_dlg.link_title} + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+
+
+ +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/shortcuts.htm b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/shortcuts.htm new file mode 100644 index 0000000..436091f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/shortcuts.htm @@ -0,0 +1,47 @@ + + + + {#advanced_dlg.accessibility_help} + + + + +

{#advanced_dlg.accessibility_usage_title}

+

Toolbars

+

Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. + Press enter to activate a button and return focus to the editor. + Press escape to return focus to the editor without performing any actions.

+ +

Status Bar

+

To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. + Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.

+ +

Context Menu

+

Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. + To close submenus press the left arrow key. Press escape to close the context menu.

+ +

Keyboard Shortcuts

+ + + + + + + + + + + + + + + + + + + + + +
KeystrokeFunction
Control-BBold
Control-IItalic
Control-ZUndo
Control-YRedo
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/content.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/content.css new file mode 100644 index 0000000..4d63ca9 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/content.css @@ -0,0 +1,50 @@ +body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +body {background:#FFF;} +body.mceForceColors {background:#FFF; color:#000;} +body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table, img, hr, .mceItemAnchor {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} +*[contentEditable]:focus {outline:0} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemAudio {background-image:url(../../img/video.gif)} +.mceItemEmbeddedAudio {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css new file mode 100644 index 0000000..8950ba3 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css @@ -0,0 +1,118 @@ +/* Generic */ +body { +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; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(img/buttons.png) 0 -52px} +#cancel {background:url(img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} +#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} +#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..1e53560e0aa7bb1b9a0373fc2f330acab7d1d51f GIT binary patch literal 3133 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 XtZb~ra4Vor00000NkvXXu0mjf(5kL( literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif new file mode 100644 index 0000000000000000000000000000000000000000..d2f93671ca3090b277e16a67b1aa6cfb6ac4915f GIT binary patch literal 64 zcmZ?wbhEHbjEB<5wG8q|kKzxu41Cw-5|H{*E`4`XOxxoD9Y}F^Z SLTQbO*E^TJI;F+RU=09Vu@yA{ literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif new file mode 100644 index 0000000000000000000000000000000000000000..adfdddccd7cac62a17d68873fa53c248bff8351a GIT binary patch literal 70 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 literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/ui.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/ui.css new file mode 100644 index 0000000..2e8c658 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/default/ui.css @@ -0,0 +1,219 @@ +/* Reset */ +.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} +.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} +.defaultSkin table td {vertical-align:middle} + +/* Containers */ +.defaultSkin table {direction:ltr;background:transparent} +.defaultSkin iframe {display:block;} +.defaultSkin .mceToolbar {height:26px} +.defaultSkin .mceLeft {text-align:left} +.defaultSkin .mceRight {text-align:right} + +/* External */ +.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} +.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} + +/* Layout */ +.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} +.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} +.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} +.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} +.defaultSkin td.mceToolbar {background:#F0F0EE; padding-top:1px; vertical-align:top} +.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} +.defaultSkin .mceStatusbar {background:#F0F0EE; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} +.defaultSkin .mceStatusbar div {float:left; margin:2px} +.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} +.defaultSkin .mceStatusbar a:hover {text-decoration:underline} +.defaultSkin table.mceToolbar {margin-left:3px} +.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} +.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} +.defaultSkin td.mceCenter {text-align:center;} +.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} +.defaultSkin td.mceRight table {margin:0 0 0 auto;} + +/* Button */ +.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} +.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} +.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.defaultSkin .mceButtonLabeled {width:auto} +.defaultSkin .mceButtonLabeled span.mceIcon {float:left} +.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} +.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} + +/* Separator */ +.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} + +/* ListBox */ +.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} +.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} +.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} +.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} +.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} +.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} +.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} +.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} +.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} + +/* SplitButton */ +.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} +.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} +.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} +.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} +.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} +.defaultSkin .mceSplitButton span.mceOpen {display:none} +.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} +.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} +.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} + +/* ColorSplitButton */ +.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} +.defaultSkin .mceColorSplitMenu td {padding:2px} +.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} +.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} +.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} +.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} +.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} + +/* Menu */ +.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8; direction:ltr} +.defaultSkin .mceNoIcons span.mceIcon {width:0;} +.defaultSkin .mceNoIcons a .mceText {padding-left:10px} +.defaultSkin .mceMenu table {background:#FFF} +.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} +.defaultSkin .mceMenu td {height:20px} +.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} +.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} +.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} +.defaultSkin .mceMenu pre.mceText {font-family:Monospace} +.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} +.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} +.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} +.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} +.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} +.defaultSkin .mceMenuItemDisabled .mceText {color:#888} +.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} +.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} +.defaultSkin .mceMenu span.mceMenuLine {display:none} +.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} +.defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal} + +/* Progress,Resize */ +.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} +.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Rtl */ +.mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0} +.mceRtl .mceMenuItem .mceText {text-align: right} + +/* Formats */ +.defaultSkin .mce_formatPreview a {font-size:10px} +.defaultSkin .mce_p span.mceText {} +.defaultSkin .mce_address span.mceText {font-style:italic} +.defaultSkin .mce_pre span.mceText {font-family:monospace} +.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} + +/* Theme */ +.defaultSkin span.mce_bold {background-position:0 0} +.defaultSkin span.mce_italic {background-position:-60px 0} +.defaultSkin span.mce_underline {background-position:-140px 0} +.defaultSkin span.mce_strikethrough {background-position:-120px 0} +.defaultSkin span.mce_undo {background-position:-160px 0} +.defaultSkin span.mce_redo {background-position:-100px 0} +.defaultSkin span.mce_cleanup {background-position:-40px 0} +.defaultSkin span.mce_bullist {background-position:-20px 0} +.defaultSkin span.mce_numlist {background-position:-80px 0} +.defaultSkin span.mce_justifyleft {background-position:-460px 0} +.defaultSkin span.mce_justifyright {background-position:-480px 0} +.defaultSkin span.mce_justifycenter {background-position:-420px 0} +.defaultSkin span.mce_justifyfull {background-position:-440px 0} +.defaultSkin span.mce_anchor {background-position:-200px 0} +.defaultSkin span.mce_indent {background-position:-400px 0} +.defaultSkin span.mce_outdent {background-position:-540px 0} +.defaultSkin span.mce_link {background-position:-500px 0} +.defaultSkin span.mce_unlink {background-position:-640px 0} +.defaultSkin span.mce_sub {background-position:-600px 0} +.defaultSkin span.mce_sup {background-position:-620px 0} +.defaultSkin span.mce_removeformat {background-position:-580px 0} +.defaultSkin span.mce_newdocument {background-position:-520px 0} +.defaultSkin span.mce_image {background-position:-380px 0} +.defaultSkin span.mce_help {background-position:-340px 0} +.defaultSkin span.mce_code {background-position:-260px 0} +.defaultSkin span.mce_hr {background-position:-360px 0} +.defaultSkin span.mce_visualaid {background-position:-660px 0} +.defaultSkin span.mce_charmap {background-position:-240px 0} +.defaultSkin span.mce_paste {background-position:-560px 0} +.defaultSkin span.mce_copy {background-position:-700px 0} +.defaultSkin span.mce_cut {background-position:-680px 0} +.defaultSkin span.mce_blockquote {background-position:-220px 0} +.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} +.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} +.defaultSkin span.mce_forecolorpicker {background-position:-720px 0} +.defaultSkin span.mce_backcolorpicker {background-position:-760px 0} + +/* Plugins */ +.defaultSkin span.mce_advhr {background-position:-0px -20px} +.defaultSkin span.mce_ltr {background-position:-20px -20px} +.defaultSkin span.mce_rtl {background-position:-40px -20px} +.defaultSkin span.mce_emotions {background-position:-60px -20px} +.defaultSkin span.mce_fullpage {background-position:-80px -20px} +.defaultSkin span.mce_fullscreen {background-position:-100px -20px} +.defaultSkin span.mce_iespell {background-position:-120px -20px} +.defaultSkin span.mce_insertdate {background-position:-140px -20px} +.defaultSkin span.mce_inserttime {background-position:-160px -20px} +.defaultSkin span.mce_absolute {background-position:-180px -20px} +.defaultSkin span.mce_backward {background-position:-200px -20px} +.defaultSkin span.mce_forward {background-position:-220px -20px} +.defaultSkin span.mce_insert_layer {background-position:-240px -20px} +.defaultSkin span.mce_insertlayer {background-position:-260px -20px} +.defaultSkin span.mce_movebackward {background-position:-280px -20px} +.defaultSkin span.mce_moveforward {background-position:-300px -20px} +.defaultSkin span.mce_media {background-position:-320px -20px} +.defaultSkin span.mce_nonbreaking {background-position:-340px -20px} +.defaultSkin span.mce_pastetext {background-position:-360px -20px} +.defaultSkin span.mce_pasteword {background-position:-380px -20px} +.defaultSkin span.mce_selectall {background-position:-400px -20px} +.defaultSkin span.mce_preview {background-position:-420px -20px} +.defaultSkin span.mce_print {background-position:-440px -20px} +.defaultSkin span.mce_cancel {background-position:-460px -20px} +.defaultSkin span.mce_save {background-position:-480px -20px} +.defaultSkin span.mce_replace {background-position:-500px -20px} +.defaultSkin span.mce_search {background-position:-520px -20px} +.defaultSkin span.mce_styleprops {background-position:-560px -20px} +.defaultSkin span.mce_table {background-position:-580px -20px} +.defaultSkin span.mce_cell_props {background-position:-600px -20px} +.defaultSkin span.mce_delete_table {background-position:-620px -20px} +.defaultSkin span.mce_delete_col {background-position:-640px -20px} +.defaultSkin span.mce_delete_row {background-position:-660px -20px} +.defaultSkin span.mce_col_after {background-position:-680px -20px} +.defaultSkin span.mce_col_before {background-position:-700px -20px} +.defaultSkin span.mce_row_after {background-position:-720px -20px} +.defaultSkin span.mce_row_before {background-position:-740px -20px} +.defaultSkin span.mce_merge_cells {background-position:-760px -20px} +.defaultSkin span.mce_table_props {background-position:-980px -20px} +.defaultSkin span.mce_row_props {background-position:-780px -20px} +.defaultSkin span.mce_split_cells {background-position:-800px -20px} +.defaultSkin span.mce_template {background-position:-820px -20px} +.defaultSkin span.mce_visualchars {background-position:-840px -20px} +.defaultSkin span.mce_abbr {background-position:-860px -20px} +.defaultSkin span.mce_acronym {background-position:-880px -20px} +.defaultSkin span.mce_attribs {background-position:-900px -20px} +.defaultSkin span.mce_cite {background-position:-920px -20px} +.defaultSkin span.mce_del {background-position:-940px -20px} +.defaultSkin span.mce_ins {background-position:-960px -20px} +.defaultSkin span.mce_pagebreak {background-position:0 -40px} +.defaultSkin span.mce_restoredraft {background-position:-20px -40px} +.defaultSkin span.mce_spellchecker {background-position:-540px -20px} +.defaultSkin span.mce_visualblocks {background-position: -40px -40px} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css new file mode 100644 index 0000000..ee3d369 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css @@ -0,0 +1,24 @@ +body, td, pre { margin:8px;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table, img, hr, .mceItemAnchor {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} +*[contentEditable]:focus {outline:0} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css new file mode 100644 index 0000000..fa3c31a --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css @@ -0,0 +1,106 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +background:#F0F0EE; +color: black; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE; color:#000;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;background-color:transparent;} +a:hover {color:#2B6FB6;background-color:transparent;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;background-color:transparent;} +input.invalid {border:1px solid #EE0000;background-color:transparent;} +input {background:#FFF; border:1px solid #CCC;color:black;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +font-weight:bold; +width:94px; height:23px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#cancel {float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;} +.tabs li.current {font-weight: bold; margin-right:2px;} +.tabs span {float:left; display:block; padding:0px 10px 0 0;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} +#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} +#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css new file mode 100644 index 0000000..86829c5 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css @@ -0,0 +1,106 @@ +/* Reset */ +.highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;} +.highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;} +.highcontrastSkin table td {vertical-align:middle} + +.highcontrastSkin .mceIconOnly {display: block !important;} + +/* External */ +.highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;} +.highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;} + +/* Layout */ +.highcontrastSkin table.mceLayout {border: 1px solid;} +.highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid} +.highcontrastSkin .mceStatusbar a:hover {text-decoration:underline} +.highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;} +.highcontrastSkin .mceStatusbar div {float:left} +.highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0} + +.highcontrastSkin .mceToolbar td { display: inline-block; float: left;} +.highcontrastSkin .mceToolbar tr { display: block;} +.highcontrastSkin .mceToolbar table { display: block; } + +/* Button */ + +.highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;} +.highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em} +.highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} +.highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;} + +/* Separator */ +.highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;} + +/* ListBox */ +.highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceListBox .mceText {padding: 5px 6px; line-height: 2em; width: 15ex; overflow: hidden;} +.highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} +.highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} +.highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} +.highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;} +.highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;} + +.highcontrastSkin .mceListBoxMenu {overflow-y:auto} + +/* SplitButton */ +.highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +.highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;} +.highcontrastSkin .mceSplitButton tr { display: table-row; } +.highcontrastSkin table.mceSplitButton { display: table; } +.highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} +.highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} +.highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; } +.highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;} + +/* Menu */ +.highcontrastSkin .mceNoIcons span.mceIcon {width:0;} +.highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; direction:ltr} +.highcontrastSkin .mceMenu table {background:white; color: black} +.highcontrastSkin .mceNoIcons a .mceText {padding-left:10px} +.highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black} +.highcontrastSkin .mceMenu td {height:2em} +.highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;} +.highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;} +.highcontrastSkin .mceMenu pre.mceText {font-family:Monospace} +.highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;} +.highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px} +.highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid} +.highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px} +.highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";} +.highcontrastSkin .mceMenu span.mceMenuLine {display:none} +.highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"} +.highcontrastSkin .mceMenuItem td, .highcontrastSkin .mceMenuItem th {line-height: normal} + +/* ColorSplitButton */ +.highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000} +.highcontrastSkin .mceColorSplitMenu td {padding:2px} +.highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;} +.highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.highcontrastSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2} +.highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;} +.highcontrastSkin .mceColorPreview {display:none;} +.highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden} + +/* Progress,Resize */ +.highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} +.highcontrastSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Rtl */ +.mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0} +.mceRtl .mceMenuItem .mceText {text-align: right} + +/* Formats */ +.highcontrastSkin .mce_p span.mceText {} +.highcontrastSkin .mce_address span.mceText {font-style:italic} +.highcontrastSkin .mce_pre span.mceText {font-family:monospace} +.highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css new file mode 100644 index 0000000..631fa0e --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css @@ -0,0 +1,48 @@ +body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +body {background:#FFF;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table, img, hr, .mceItemAnchor {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} +*[contentEditable]:focus {outline:0} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemAudio {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css new file mode 100644 index 0000000..84d2fe9 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css @@ -0,0 +1,118 @@ +/* Generic */ +body { +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; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(../default/img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(../default/img/buttons.png) 0 -52px} +#cancel {background:url(../default/img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} +#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} +#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..13a5cb03097c004f7b37658654a9250748cf073c GIT binary patch literal 2766 zcmd^B`#;nBAK!9c(dCSc_`04XBu+J597MXvt(oeZlcJpHIOSO7atc#AMWG$3$V7)q zNx38nEwRmIE*oapX3E%2Y_rQ}@3ZgU@qIsD@7L?`e7_#g=kxt|zu!N+{|XHbG)7n; zU@(~Rf&KpB+Imzw{S0-qnWxWD!C*SD&>&2J76Jgq`yNnO3$>r8@B|Y69x0pfIh#Ow z)WjyX^8T)+6I-}NwZreI-$r>-HeZJQv#zX#Th_uMwsMIrlO4mNj{|cbX#CdxSrSA1 zi7x6G7Jj7hJB9?EBN7TrO5@0TC%zA`m*~?n<~POISNRA}Ix(kW@s(5astLYgTBw@h z%VrlKo=`C@ST1R1m9LYgOf7Md z%vzvMe5Z_y2DwWEoJHD{xNkz(%My(67Mb6qJc(v%ez|*GL}7^sxZ0gBO!Bo{;Q&WM zV~hKzM04L20BA!600h)@pk@MPCs0oSH5X{4K+yx#GXN3-jT}guz%o@MqX6}sMoQL5 zDbQRgH1}A|FIDkNfw)Q|r2+XcBpuQyW`K$hDQ1Cc9;n4YEdkIH;ALod*EG}Dz-$rp zodRS-8tD*F2^9QBm7ql>XjO|zDiH~iGQlzzD86d`M;8Iw0Wf$N3>*f7!C)X53}FF1 zT0@Toj5C077L3FL<|Sw<4{-A#&RxJIKpX-MAm?_cBlxb#&;M-FLuSz*n4d&h` zXWyvinw0!TAZh`kHX!Z*ViJ&afdz_MOab5f!Qzm5fd-Zs&>|hkCV+ej$T>j02*z+= z>_u@$tA>DwJ(UpDP?lurK+A9mzvO(D-+gFH)8MEW*O2c>3^gu}@HCz3w3$-%Bg0iD72j)nmts zO~01P6^cappH!;k{M1!%*t$nQ=-$~$cX+fEkj^3P+$d^La54PkS=(gpNkdn~8?D*hW^hb50#Qbv(Vr z7mux=@03*OzkBFr1euY0!)>k{MMqGw8F#U zRe``TW;?0PDm5oCUDqnyR2D|VTUKrljh??&VAFx_Y8>n0){SLYN4rN@58&~EY<8F( z0{QSBO|7FRtIxB?ykG0dfo2c-Y&e&zlYMnqkV9vq+=EwnBv2HB%MeBD4xS7LeKIpT_! z`x2_k`zl`LzeQ$W8QpB(KQ+0LVyEJr9M?0CO4qCq-VU);<`uj}<}S1&Q7xSe=5T(8 ziLmqu&AMuP>etg&fo)XY<9~c4ufJu@Ux>Osj0^B-);#sZ?RMt%g}dL*c}ZebdsbpF zCGfuwrDfcoU0*mJ)RD4V;PPr$+Lrfm`b7p-cJd8)xqdLm^ZH#<*JQfYJ~PoB*LK5| zH$C3CzsVSRfseg&M51H8?1)k+yOYwqQqn)B#!aMev)#63aXG;9DDJn_0c)Gxymon< zymu+j@mLckYTb1Up+$oES-Qj(fgx}5+7lCfvmr6-7IAsgPaDgPES=EUr(Q2%O-m}?RmP5S6{I{NuN(T6$1*`X7IJXi>l zhX)mey1{@?Zefvr;ZbWC>l|x544h)bavSVvqawV&>mHYcaIE7arJsyhy0aAZ28%Ea^Z`=aTvh4miaaN0)5vL*wCb?j}Dsf4O@AD!~!zsLr>lt6x7K z3`4aaD)%xv?5(p|tKkpFdnS6dqgrLbo&zQ4gEPu=g5tj(#rWP>nDR~6@jTSz^oix< mOkD9tMJf;J-L)*xtX8`HcJ}PmJwolr6m}pW*#DJZbk@H_2$Vel literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc57f2bc2d63a3ad6fbf98b663f336539f011ec GIT binary patch literal 651 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 O0000 + + {#advanced_dlg.code_title} + + + + +
+
+ +
+ +
+ +
+ + + +
+ + +
+
+ + diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template.js new file mode 100644 index 0000000..4b3209c --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template.js @@ -0,0 +1 @@ +(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.contentCSS.push(d+"/skins/"+f.skin+"/content.css");c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})})});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template_src.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template_src.js new file mode 100644 index 0000000..35c19a6 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/editor_template_src.js @@ -0,0 +1,84 @@ +/** + * editor_template_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var DOM = tinymce.DOM; + + // Tell it to load theme specific language pack(s) + tinymce.ThemeManager.requireLangPack('simple'); + + tinymce.create('tinymce.themes.SimpleTheme', { + init : function(ed, url) { + var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; + + t.editor = ed; + ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css"); + + ed.onInit.add(function() { + ed.onNodeChange.add(function(ed, cm) { + tinymce.each(states, function(c) { + cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); + }); + }); + }); + + DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); + }, + + renderUI : function(o) { + var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc; + + n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n); + n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'}); + n = tb = DOM.add(n, 'tbody'); + + // Create iframe container + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'}); + + // Create toolbar container + n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'}); + + // Create toolbar + tb = t.toolbar = cf.createToolbar("tools1"); + tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'})); + tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'})); + tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'})); + tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'})); + tb.add(cf.createSeparator()); + tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'})); + tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'})); + tb.add(cf.createSeparator()); + tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'})); + tb.add(cf.createSeparator()); + tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'})); + tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'})); + tb.renderTo(n); + + return { + iframeContainer : ic, + editorContainer : ed.id + '_container', + sizeContainer : sc, + deltaHeight : -20 + }; + }, + + getInfo : function() { + return { + longname : 'Simple theme', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + version : tinymce.majorVersion + "." + tinymce.minorVersion + } + } + }); + + tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme); +})(); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/img/icons.gif b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/img/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fcbcb5dedf16a5fa1d15c2aa127bceb612f1e71 GIT binary patch literal 806 zcmZ?wbhEHbJi#Es@KuxH{{08bHy>kQU|4+kcV*u?6Yu2z|Nk2X_I-c9E~4fBsnb_x z&7Ngzq1inB@Woqi-rnfiGF7yw9zM z^p;~=3MY4TT)2AY!iC=7fBwej_wPS(UDm1P!}|}9?`#au+qhx#R?Fl=KuakHia%Lc z85lGfbU;Rd{N%v)|G<<24;`ug6HAIt=2*?Yu%d)ZG@><(acbwmDSj%f4MMZ#%vkt3 z%+g~)i8kP^LLB_(WJHBo z)4eilyozQ8a&qqSt%<6xpa0;xA7k;M?mchbzI*>+`RnL~M?L!{MDwZt;o_B2F2$0=pQSpQ!u@RcUGT{(44KaY91N#ws_nDH9G%Qf=ZF z5o_THWH`G~`GwyilS^z$ZvV~I`dh4Lx_8c>?R@8gr-07UIgFjp0y#A&c{B)cE>2kS zL5I1;i$zoEA)6qV`HGJvVWE!{8MZ6ST|PC}d%Kid7{KiD{l18xziSGKuWtj9AkWy-*`}#c~0`Lrjq> z-;O-o=3A#@&dst%_SasuJq0xZW;OwR3vM!diY%Es?;J~Pp}LYununP(i|XxU>#u=* zSvNC^0?cJ=S?=UK4&2DdcCO^BsHxjWc4vR-Z64x&8r#>V9!JMd4O!Z*d@mNrgX=jUy;0|T>ZntHjDU$=-I8y`|tN~Y9 literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/de.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/de.js new file mode 100644 index 0000000..59bf788 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/de.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.simple',{"cleanup_desc":"Quellcode aufr\u00e4umen","redo_desc":"Wiederholen (Strg+Y)","undo_desc":"R\u00fcckg\u00e4ngig (Strg+Z)","numlist_desc":"Nummerierung","bullist_desc":"Aufz\u00e4hlung","striketrough_desc":"Durchgestrichen","underline_desc":"Unterstrichen (Strg+U)","italic_desc":"Kursiv (Strg+I)","bold_desc":"Fett (Strg+B)"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/en.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/en.js new file mode 100644 index 0000000..088ed0f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/langs/en.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.simple',{"cleanup_desc":"Cleanup Messy Code","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","striketrough_desc":"Strikethrough","underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)"}); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/content.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/content.css new file mode 100644 index 0000000..783b170 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/content.css @@ -0,0 +1,25 @@ +body, td, pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +body { + background-color: #FFFFFF; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB; +} + +/* 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/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/ui.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/ui.css new file mode 100644 index 0000000..32feae6 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/default/ui.css @@ -0,0 +1,32 @@ +/* Reset */ +.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} + +/* Containers */ +.defaultSimpleSkin {position:relative} +.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;} +.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;} +.defaultSimpleSkin .mceToolbar {height:24px;} + +/* Layout */ +.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px} +.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} + +/* Button */ +.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px} +.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} +.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +/* Separator */ +.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px} + +/* Theme */ +.defaultSimpleSkin span.mce_bold {background-position:0 0} +.defaultSimpleSkin span.mce_italic {background-position:-60px 0} +.defaultSimpleSkin span.mce_underline {background-position:-140px 0} +.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0} +.defaultSimpleSkin span.mce_undo {background-position:-160px 0} +.defaultSimpleSkin span.mce_redo {background-position:-100px 0} +.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0} +.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} +.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css new file mode 100644 index 0000000..e10558f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css @@ -0,0 +1,17 @@ +body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} + +body {background: #FFF;} +.mceVisualAid {border: 1px dashed #BBB;} + +/* IE */ + +* 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/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..527e3495a653e57d76bf7e55316793d17dda497a GIT binary patch literal 5102 zcmd^Ci96I^7ypWw?8;J!C`Gc9QubX!7+c8}rXowpTC!y=vhPca?365N$TIeQ$u=`g z7%`X;V+>~bzVrJ#-t*jZ&pr2fKKGn^&V9~vZo*x2BQEx{>;M38nHcL^F{BiObs@}* z`J{#WLxwovXYBAC060$l$4o$8!D#?sw|K0lclYii-vHm|k9_^aO!V}`{GR!GKKAwi zfM8^yH4JKv6VxCt?&+GwM`W1#S_weJtaOti_){-Si=W`V9WVZ2Ucj=G&%l61xW6Qx zIXOAvt$?KrXCnI?8&>>da`dP8#6ikZ*e9=Xj!Y3TOdSEKH%uWB{D5|7vhEi^+mI=uFz2#0P{IPZ3_WyP0q)8IE|RbRP5}{x z2f1NP!2Jwy0j82vKX1B3cwNuxb$DV7!1VZ0{n)%cIrDj8dcu&mZD20F_l+P$K~x|}=gXx@k6>Qpl6&#z^PNTmmnMl1(^x`y}el%5+)I}ziC z{+nV%ZRP-}B2yQ-P25`SrTJGZPx>e8=e;E=m0n2DO}o-_X%ci_#>h~ZH8IzKuTM0Y z!ct|+A3S80mwAc^uuzL3L4$(Us`#(&g1vdn3IGLcQB-!%*n8~-# z(8-gNhLb*47jZHb`6|X|FQyM5-M#AB)G}nmuJ*sd7Ge=tWvnn(eD^+kp_{h<=L73y zDXYOJx6iEduBxoEdgLhS*nG;fS}6Yj<-3-0Pq*enlU1E%T=^-L7kO$U(SjzXr8OTj zr_MeSdPII)w;u45Zy{6EJbT=3atLR%p1sbz7sSaGD-him50g5Rf12$y>`c(4Pd?@RJM(g;u(Uk1qVh}SVkL(S(PjvmQsHF% zs@Bj(*?Oho#P6&so65qwo7TeCu!>vdah0%gU#QmSa0glfs{`T=!b0z}Wyv?^mDXM{ zj)!Ny2g`_iaaF~>h`iQ)`P<0+%Rp&(4ow7}q)}P%K}}EjwzA!KD`JMH7TZdW|3N{3 z`H3~DvTR~_;v)a{mE|kKUsUe2D0(=0Rc2*p*;g4?SymZswyD1=8NeMVk=#0c zwL3k?%w8Sn54MXzP`_X1ZoC#iX`OsDGL^ zd}qk>_HnP{ip0v(-lx5vF0)=1zieu@VMfTaGHdyA<;$%*x9;?f43B&qnaRDDuc0`r zw3fe?KbwzfcDWaPPo}B7>4%3&J@(!g2SQV;&zpN{4yE=s_a1yVtSPLyGy|`Jm+_Ug zn5Uap70tj9Uw4`Ynkt&ld|jPmMb$PvZF=Pja}$C!_tYW?>22w+e!hA~(_rI@o9C_) zxhE3-yx|%DP1~D`d7}jctyevJSvYx^{TT1qobpQ3si7;~j|;8yr;K1iu$Jf1#Q3BH z)2Jc2Y)!d*;ogP*Htg*HlK+FH&`DBZ{`dSYd^xI)ph|d5h(i|-s}x@;a!`Igj_B9> zW4St^#ZjE8;DxCUx6reQgf*^Rlz%9nYF9J+wYfB?lI*%Iq`9y8tawFpMg97s(xQX& z@b!-7{^lVIgm01a8;suTi=aCg3QhoJ5to=?%n6Y?k@t^L4nkjwwUdtIx9evFG=5F}<%s89tU)Ll=IH%;BxHopOTFHL# z_Gc#)v#$kBp!J?(^pEtj^cVACiWX{hvbV2EYgWoVQAb|?sq#~+SI*O6c-p?u-o)GV zoSK|;t*VdrFANn=j9V^T=2!_6%8~DX;1}{?v}^B8nP7$7Ntv5j+IQm3Z)E(_;gv2I ze0yp4RM4el_K+@-F4zV63Dt@CIXy>dQS)76X|vF@t<=_QArd{xr8286F_IPUTkmk) zS;)UxB$yW{_EbsZW}9MkTIzd$-AZw@^d{H_?5}6wP_@UKdU}sfQnS2hCfk75_xIJu z9c0;?bib@a?@7%{v(>{q>^$2?5(d?>s*0|T;D^5tqTXLG*e(X~C%aBAr8Sktn%c>V z*#B*-exg>d?jM3;UlBNdHP)83TKz|2ll0SRiz>Wbc5QguA2Nw474wy#Qqu4@WO@V~OT7HyJw!rH-DRl6vaGdX8doDVop`xn0#eK|k z(i8W0QMTwlcUEQg-)wFlu6bkw7sj>$Pue#?$!Cv9q2SR?dM%&Y)qk{llnsoI+|q)6 zhVDU+psIw)g+|xe1D^?ka9HcU%GNaMek+-#Iq(Z*!(?MN?K$m1F`;}XYt<%H;tsMX zPao8nKlR7=F;6nn*e-H6&9?lW7Maw5TBXcf-8ACvJO7JbxE&U z7DqmTA&YX|L1m~Wj&x$k!Wr^T@5#LUKGDAfpco~J-X z-67;Q5jyY~iHn*_hwYBNEzB%@6)ty(c0qk?3R`FHAzeeeQ!UTuq`R|_Gutuf4#j1w-pKDw~i7P2D< z&P*4nX)Lr6Lw(6TWD-VjA^e#nZFC4eA0$brX|-r|-qXhG%5n!qvy8Kub*@T zl@KS;Mr77E(PQ*fQVNgW@s!+@p;)fi&7vEcYHG_`&uBPmnckTD*ySQ2`bYXut&pI6 z_`&q%?C3 zL<7Jf$dEVyc%c9Q8!iBFGY0^KeAAqJ3;}={xO)d`z`%eYh#JiuMDNsfW1=$<(dmeo zjP95WM1J$1l2&YH-E;|jIjipXkD;|WEa?w!-}cqFV)$|~e5s^$xdgu0`J3=-Vxw&w z*E+V2nAz@{CUpMB{~E`2PHpwf{u@M-#+S$=3%e74_NG_%k!y$Zf6230(!vG>jXT0@ zQWkKBD|iY9x4*ta!{QHDwhjtf(8ch@lGepy_(H?L@-N2uQ~0)tjbD=+0}K1zvkVjX zeiX51?%&Yje((Ihp1JK2%>KyY?kI*hvwAR%B~LEx&0zP(76>cb^ko8V2~SK&K zhZgtxQ9FG|29P*_-Wgih9Yhf(m-i-?h~t>;(FObndTSO-M6Qvr|LB;_gMJiY5WPLI z%qL(;yWI9`%6K1(3Q7(n;XqFi2emX?T!M z21(7}!4Q3a5TtI4U6L8WDoG=3?&A|zCaLN{(cA-zZgEJoBj3+qz1VjeXFz>+S_q3%Ha5;mvltEk0 z0I@mXY5{${dec;X@b$bxp z9RrC|)SYo~Z-z#k2KN_0G6p0sfm9+m{{oy329Ym8bR>w5rp-swkufx642VghGpsLV zfa_J@<_~aZ7~Go&NhpxA1I~ni(;>9q!Qf0NZ9WD(+@ue@p!NmO2Lh@6FQ{;5TB{2k z@raIiLhE`Aj>gePV!^R^N`noh!Is)&M{TsD!Ck=LIkdTQ5Lr3ckUh|l1I||*p_&en zje`w21K)GDrW!Y=8jp~TjF;a|x}gsMOhAB@xiv%meO2x_!p66W8|!3F z3K<7F$K0Opu&RXCgY0kj(}Md=k40Ax3**GROT%0zW&NB3QY@Ac&kyGl^e-&ALU@lcY9Q}1h&TWo z+k?8hnE8OA{@y=VwBtoF@ihygu@)0b$2x5Lov1td z-k(2Ze}N=k@O+&25t3H|iTZ-W?aUDy#Sicgc12CnBuq5L+a-$MlL@I3Y8rf~(>P;3 z6|)Hzvs3&!*8B$J{E8Z)sCX_~-HCM8E*6rI;^47^s=UobI%jJMp zUEHb>8saG^lr1R4=HWje>a6xd&1c<7%aN7wAskl%AhM|DwH^LGE<~=j0xyL1Sf`8F zffz3*Ycx-kPN=ks(AiKa(byk%<5z5p{T<`)uilX3XZL^m(C70?&g>>B^n3^&aS>j9 z(=a=hH}sEs46p9_z0MHG2c9n8K7X{?dLX>Or_5^-R}=tu3__0%m^4q(9!oU$T2(;h zNEfnimp*HOZcw1o*@LAD3YkNR4wn4n!2NCwOMU}OG@k+IaKgNZV*bJaAt7uzSt@b9 zI%mY~Pg3{HjIBCfO5aNUj=q~RUy9^Of6ie-JM#Qs73~!#+PX12@5|%LBP$yl8|!N} z(<+WeX4cottl1cv*%Xu$t)~l`4PMZ6FIm&W3$-3l_^?6o_l`b`;8X`NC zCSjT;Go-{Vy}Ran$)Ua?Ci?hcquG{?heOssk(AxT=;)W4uiuZYVX$@4afkW;MwkRe zg#{4hP)@|byaFde!CYEWl9lzz>a&*5*_D^tDmPctYVAn%wGT@|gM)()rq-0of86@S zpW$YCMNq)NG9$`LhM%M70yp9Oe27W3YD3n< zV?=oxR(68L_JS3@&Ti7CH)#u-q^YxN7b22`Or8ynbtoJ~GYNN6M}36p0QHtFr;sN(-`SjCLE z^;=~`c}nHAqS=&+**WhTU?amp#_E%kugb=cbTvjcRPdpJo_T*OLJ~E+ z!ioz{$NIZL-zNH7DRMHiRe7{kW|Putvu{sV*4mj)KM`Q#@$FtzjJr`TWl&lobv$g0 zKk0a>J=E{+oZtaA(2AEuGZ)*O-YVuT>7N}ZloloSuk}6lP(mKk+94U@XrwtnRBxAs zm^c~xa2y+x-0}0iUT9JlG=jv-)(>n)f262E!2209 VmjT$ODWe$zObpERYjs_s{s;8{A&me4 literal 0 HcmV?d00001 diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css new file mode 100644 index 0000000..021d650 --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css @@ -0,0 +1,35 @@ +/* Reset */ +.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} + +/* Containers */ +.o2k7SimpleSkin {position:relative} +.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;} +.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;} +.o2k7SimpleSkin .mceToolbar {height:26px;} + +/* Layout */ +.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; } +.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} +.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px} +.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} + +/* Button */ +.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} +.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px} +.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} +.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px} +.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +/* Separator */ +.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} + +/* Theme */ +.o2k7SimpleSkin span.mce_bold {background-position:0 0} +.o2k7SimpleSkin span.mce_italic {background-position:-60px 0} +.o2k7SimpleSkin span.mce_underline {background-position:-140px 0} +.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0} +.o2k7SimpleSkin span.mce_undo {background-position:-160px 0} +.o2k7SimpleSkin span.mce_redo {background-position:-100px 0} +.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0} +.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} +.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce.js new file mode 100644 index 0000000..208dfcc --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce.js @@ -0,0 +1 @@ +(function(e){var a=/^\s*|\s*$/g,b,d="B".replace(/A(.)|B/,"$1")==="$1";var c={majorVersion:"3",minorVersion:"5.10",releaseDate:"2013-10-24",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isIE11=g.indexOf("Trident/")!=-1&&(g.indexOf("rv:")!=-1||o.appName.indexOf("Netscape")!=-1);s.isOpera=e.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName)||s.isIE11;s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isIE7=s.isIE&&/MSIE [7]/.test(g);s.isIE8=s.isIE&&/MSIE [8]/.test(g);s.isIE9=s.isIE&&/MSIE [9]/.test(g);s.isGecko=!s.isWebKit&&!s.isIE11&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);s.isIOS5=s.isIDevice&&g.match(/AppleWebKit\/(\d*)/)[1]>=534;if(e.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m0?b:[f.scope]);if(e===false){break}}a.inDispatch=false;return e}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,i,d,c,h;e=tinymce.trim(e);g=f.settings=g||{};if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^[\w\-]*:?\/\//.test(e)){h=g.base_uri?g.base_uri.path:new tinymce.util.URI(location.href).directory;e=((g.base_uri&&g.base_uri.protocol)||"http")+"://mce_host"+f.toAbsPath(h,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});c=g.base_uri;if(c){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host==="mce_host"){f.port=c.port}if(!f.host||f.host==="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var d=this,f;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:d});if((b.host!="mce_host"&&d.host!=b.host&&b.host)||d.port!=b.port||d.protocol!=b.protocol){return b.getURI()}var c=d.getURI(),e=b.getURI();if(c==e||(c.charAt(c.length-1)=="/"&&c.substr(0,c.length-1)==e)){return c}f=d.toRelPath(d.path,b.path);if(b.query){f+="?"+b.query}if(b.anchor){f+="#"+b.anchor}return f},toAbsolute:function(b,c){b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f===1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length===0||f[c]==="."){continue}if(f[c]===".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!==0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(c,e,d){var b=new Date();b.setTime(b.getTime()-1000);this.set(c,"",b,e,d)}})})();(function(){function serialize(o,quote){var i,v,t,name;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&Object.prototype.toString.call(o)==="[object Array]"){for(i=0,v="[";i0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(name in o){if(o.hasOwnProperty(name)){v+=typeof o[name]!="function"?(v.length>1?","+quote:quote)+name+quote+":"+serialize(o[name],quote):""}}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(a){a.VK={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(b){return b.shiftKey||b.ctrlKey||b.altKey},metaKeyPressed:function(b){return a.isMac?b.metaKey:b.ctrlKey&&!b.altKey}}})(tinymce);tinymce.util.Quirks=function(a){var j=tinymce.VK,f=j.BACKSPACE,k=j.DELETE,e=a.dom,m=a.selection,I=a.settings,x=a.parser,p=a.serializer,F=tinymce.each;function B(O,N){try{a.getDoc().execCommand(O,false,N)}catch(M){}}function o(){var M=a.getDoc().documentMode;return M?M:6}function A(M){return M.isDefaultPrevented()}function K(){function M(S){var O,Q,N,T,P,R,U;function V(){if(P.nodeType==3){if(S&&R==P.length){return true}if(!S&&R===0){return true}}}O=m.getRng();var W=[O.startContainer,O.startOffset,O.endContainer,O.endOffset];if(!O.collapsed){S=true}P=O[(S?"start":"end")+"Container"];R=O[(S?"start":"end")+"Offset"];if(P.nodeType==3){Q=e.getParent(O.startContainer,e.isBlock);if(S){Q=e.getNext(Q,e.isBlock)}if(Q&&(V()||!O.collapsed)){N=e.create("em",{id:"__mceDel"});F(tinymce.grep(Q.childNodes),function(X){N.appendChild(X)});Q.appendChild(N)}}O=e.createRng();O.setStart(W[0],W[1]);O.setEnd(W[2],W[3]);m.setRng(O);a.getDoc().execCommand(S?"ForwardDelete":"Delete",false,null);if(N){T=m.getBookmark();while(U=e.get("__mceDel")){e.remove(U,true)}m.moveToBookmark(T)}}a.onKeyDown.add(function(N,P){var O;O=P.keyCode==k;if(!A(P)&&(O||P.keyCode==f)&&!j.modifierPressed(P)){P.preventDefault();M(O)}});a.addCommand("Delete",function(){M()})}function r(){function M(P){var O=e.create("body");var Q=P.cloneContents();O.appendChild(Q);return m.serializer.serialize(O,{format:"html"})}function N(O){var Q=M(O);var R=e.createRng();R.selectNode(a.getBody());var P=M(R);return Q===P}a.onKeyDown.add(function(P,R){var Q=R.keyCode,O;if(!A(R)&&(Q==k||Q==f)){O=P.selection.isCollapsed();if(O&&!e.isEmpty(P.getBody())){return}if(tinymce.isIE&&!O){return}if(!O&&!N(P.selection.getRng())){return}P.setContent("");P.selection.setCursorLocation(P.getBody(),0);P.nodeChanged()}})}function J(){a.onKeyDown.add(function(M,N){if(!A(N)&&N.keyCode==65&&j.metaKeyPressed(N)){N.preventDefault();M.execCommand("SelectAll")}})}function L(){if(!a.settings.content_editable){e.bind(a.getDoc(),"focusin",function(M){m.setRng(m.getRng())});e.bind(a.getDoc(),"mousedown",function(M){if(M.target==a.getDoc().documentElement){a.getWin().focus();m.setRng(m.getRng())}})}}function C(){a.onKeyDown.add(function(M,P){if(!A(P)&&P.keyCode===f){if(m.isCollapsed()&&m.getRng(true).startOffset===0){var O=m.getNode();var N=O.previousSibling;if(N&&N.nodeName&&N.nodeName.toLowerCase()==="hr"){e.remove(N);tinymce.dom.Event.cancel(P)}}}})}function z(){if(!Range.prototype.getClientRects){a.onMouseDown.add(function(N,O){if(!A(O)&&O.target.nodeName==="HTML"){var M=N.getBody();M.blur();setTimeout(function(){M.focus()},0)}})}}function h(){a.onClick.add(function(M,N){N=N.target;if(/^(IMG|HR)$/.test(N.nodeName)){m.getSel().setBaseAndExtent(N,0,N,1)}if(N.nodeName=="A"&&e.hasClass(N,"mceItemAnchor")){m.select(N)}M.nodeChanged()})}function c(){function N(){var P=e.getAttribs(m.getStart().cloneNode(false));return function(){var Q=m.getStart();if(Q!==a.getBody()){e.setAttrib(Q,"style",null);F(P,function(R){Q.setAttributeNode(R.cloneNode(true))})}}}function M(){return !m.isCollapsed()&&e.getParent(m.getStart(),e.isBlock)!=e.getParent(m.getEnd(),e.isBlock)}function O(P,Q){Q.preventDefault();return false}a.onKeyPress.add(function(P,R){var Q;if(!A(R)&&(R.keyCode==8||R.keyCode==46)&&M()){Q=N();P.getDoc().execCommand("delete",false,null);Q();R.preventDefault();return false}});e.bind(a.getDoc(),"cut",function(Q){var P;if(!A(Q)&&M()){P=N();a.onKeyUp.addToTop(O);setTimeout(function(){P();a.onKeyUp.remove(O)},0)}})}function b(){var N,M;e.bind(a.getDoc(),"selectionchange",function(){if(M){clearTimeout(M);M=0}M=window.setTimeout(function(){var O=m.getRng();if(!N||!tinymce.dom.RangeUtils.compareRanges(O,N)){a.nodeChanged();N=O}},50)})}function y(){document.body.setAttribute("role","application")}function u(){a.onKeyDown.add(function(M,O){if(!A(O)&&O.keyCode===f){if(m.isCollapsed()&&m.getRng(true).startOffset===0){var N=m.getNode().previousSibling;if(N&&N.nodeName&&N.nodeName.toLowerCase()==="table"){return tinymce.dom.Event.cancel(O)}}}})}function D(){if(o()>7){return}B("RespectVisibilityInDesign",true);a.contentStyles.push(".mceHideBrInPre pre br {display: none}");e.addClass(a.getBody(),"mceHideBrInPre");x.addNodeFilter("pre",function(M,O){var P=M.length,R,N,S,Q;while(P--){R=M[P].getAll("br");N=R.length;while(N--){S=R[N];Q=S.prev;if(Q&&Q.type===3&&Q.value.charAt(Q.value-1)!="\n"){Q.value+="\n"}else{S.parent.insert(new tinymce.html.Node("#text",3),S,true).value="\n"}}}});p.addNodeFilter("pre",function(M,O){var P=M.length,R,N,S,Q;while(P--){R=M[P].getAll("br");N=R.length;while(N--){S=R[N];Q=S.prev;if(Q&&Q.type==3){Q.value=Q.value.replace(/\r?\n$/,"")}}}})}function g(){e.bind(a.getBody(),"mouseup",function(O){var N,M=m.getNode();if(M.nodeName=="IMG"){if(N=e.getStyle(M,"width")){e.setAttrib(M,"width",N.replace(/[^0-9%]+/g,""));e.setStyle(M,"width","")}if(N=e.getStyle(M,"height")){e.setAttrib(M,"height",N.replace(/[^0-9%]+/g,""));e.setStyle(M,"height","")}}})}function d(){a.onKeyDown.add(function(S,T){var R,M,N,P,Q,U,O;R=T.keyCode==k;if(!A(T)&&(R||T.keyCode==f)&&!j.modifierPressed(T)){M=m.getRng();N=M.startContainer;P=M.startOffset;O=M.collapsed;if(N.nodeType==3&&N.nodeValue.length>0&&((P===0&&!O)||(O&&P===(R?0:1)))){U=N.previousSibling;if(U&&U.nodeName=="IMG"){return}nonEmptyElements=S.schema.getNonEmptyElements();T.preventDefault();Q=e.create("br",{id:"__tmp"});N.parentNode.insertBefore(Q,N);S.getDoc().execCommand(R?"ForwardDelete":"Delete",false,null);N=m.getRng().startContainer;U=N.previousSibling;if(U&&U.nodeType==1&&!e.isBlock(U)&&e.isEmpty(U)&&!nonEmptyElements[U.nodeName.toLowerCase()]){e.remove(U)}e.remove("__tmp")}}})}function H(){a.onKeyDown.add(function(Q,R){var O,N,S,M,P;if(A(R)||R.keyCode!=j.BACKSPACE){return}O=m.getRng();N=O.startContainer;S=O.startOffset;M=e.getRoot();P=N;if(!O.collapsed||S!==0){return}while(P&&P.parentNode&&P.parentNode.firstChild==P&&P.parentNode!=M){P=P.parentNode}if(P.tagName==="BLOCKQUOTE"){Q.formatter.toggle("blockquote",null,P);O=e.createRng();O.setStart(N,0);O.setEnd(N,0);m.setRng(O)}})}function G(){function M(){a._refreshContentEditable();B("StyleWithCSS",false);B("enableInlineTableEditing",false);if(!I.object_resizing){B("enableObjectResizing",false)}}if(!I.readonly){a.onBeforeExecCommand.add(M);a.onMouseDown.add(M)}}function t(){function M(N,O){F(e.select("a"),function(R){var P=R.parentNode,Q=e.getRoot();if(P.lastChild===R){while(P&&!e.isBlock(P)){if(P.parentNode.lastChild!==P||P===Q){return}P=P.parentNode}e.add(P,"br",{"data-mce-bogus":1})}})}a.onExecCommand.add(function(N,O){if(O==="CreateLink"){M(N)}});a.onSetContent.add(m.onSetContent.add(M))}function n(){if(I.forced_root_block){a.onInit.add(function(){B("DefaultParagraphSeparator",I.forced_root_block)})}}function q(){function M(O,N){if(!O||!N.initial){a.execCommand("mceRepaint")}}a.onUndo.add(M);a.onRedo.add(M);a.onSetContent.add(M)}function i(){a.onKeyDown.add(function(N,O){var M;if(!A(O)&&O.keyCode==f){M=N.getDoc().selection.createRange();if(M&&M.item){O.preventDefault();N.undoManager.beforeChange();e.remove(M.item(0));N.undoManager.add()}}})}function s(){var M;if(o()>=10){M="";F("p div h1 h2 h3 h4 h5 h6".split(" "),function(N,O){M+=(O>0?",":"")+N+":empty"});a.contentStyles.push(M+"{padding-right: 1px !important}")}}function v(){var O,N,ae,M,Z,ac,aa,ad,P,Q,ab,X,W,Y=document,U=a.getDoc();if(!I.object_resizing||I.webkit_fake_resize===false){return}B("enableObjectResizing",false);ab={n:[0.5,0,0,-1],e:[1,0.5,1,0],s:[0.5,1,0,1],w:[0,0.5,-1,0],nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};function S(ai){var ah,ag;ah=ai.screenX-ac;ag=ai.screenY-aa;X=ah*Z[2]+ad;W=ag*Z[3]+P;X=X<5?5:X;W=W<5?5:W;if(j.modifierPressed(ai)||(ae.nodeName=="IMG"&&Z[2]*Z[3]!==0)){X=Math.round(W/Q);W=Math.round(X*Q)}e.setStyles(M,{width:X,height:W});if(Z[2]<0&&M.clientWidth<=X){e.setStyle(M,"left",O+(ad-X))}if(Z[3]<0&&M.clientHeight<=W){e.setStyle(M,"top",N+(P-W))}}function af(){function ag(ah,ai){if(ai){if(ae.style[ah]||!a.schema.isValid(ae.nodeName.toLowerCase(),ah)){e.setStyle(ae,ah,ai)}else{e.setAttrib(ae,ah,ai)}}}ag("width",X);ag("height",W);e.unbind(U,"mousemove",S);e.unbind(U,"mouseup",af);if(Y!=U){e.unbind(Y,"mousemove",S);e.unbind(Y,"mouseup",af)}e.remove(M);R(ae)}function R(aj){var ah,ai,ag;T();ah=e.getPos(aj);O=ah.x;N=ah.y;ai=aj.offsetWidth;ag=aj.offsetHeight;if(ae!=aj){ae=aj;X=W=0}F(ab,function(am,ak){var al;al=e.get("mceResizeHandle"+ak);if(!al){al=e.add(U.documentElement,"div",{id:"mceResizeHandle"+ak,"class":"mceResizeHandle",style:"cursor:"+ak+"-resize; margin:0; padding:0"});e.bind(al,"mousedown",function(an){an.preventDefault();af();ac=an.screenX;aa=an.screenY;ad=ae.clientWidth;P=ae.clientHeight;Q=P/ad;Z=am;M=ae.cloneNode(true);e.addClass(M,"mceClonedResizable");e.setStyles(M,{left:O,top:N,margin:0});U.documentElement.appendChild(M);e.bind(U,"mousemove",S);e.bind(U,"mouseup",af);if(Y!=U){e.bind(Y,"mousemove",S);e.bind(Y,"mouseup",af)}})}else{e.show(al)}e.setStyles(al,{left:(ai*am[0]+O)-(al.offsetWidth/2),top:(ag*am[1]+N)-(al.offsetHeight/2)})});if(!tinymce.isOpera&&ae.nodeName=="IMG"){ae.setAttribute("data-mce-selected","1")}}function T(){if(ae){ae.removeAttribute("data-mce-selected")}for(var ag in ab){e.hide("mceResizeHandle"+ag)}}a.contentStyles.push(".mceResizeHandle {position: absolute;border: 1px solid black;background: #FFF;width: 5px;height: 5px;z-index: 10000}.mceResizeHandle:hover {background: #000}img[data-mce-selected] {outline: 1px solid black}img.mceClonedResizable, table.mceClonedResizable {position: absolute;outline: 1px dashed black;opacity: .5;z-index: 10000}");function V(){var ag=e.getParent(m.getNode(),"table,img");F(e.select("img[data-mce-selected]"),function(ah){ah.removeAttribute("data-mce-selected")});if(ag){R(ag)}else{T()}}a.onNodeChange.add(V);e.bind(U,"selectionchange",V);a.serializer.addAttributeFilter("data-mce-selected",function(ag,ah){var ai=ag.length;while(ai--){ag[ai].attr(ah,null)}})}function E(){if(o()<9){x.addNodeFilter("noscript",function(M){var N=M.length,O,P;while(N--){O=M[N];P=O.firstChild;if(P){O.attr("data-mce-innertext",P.value)}}});p.addNodeFilter("noscript",function(M){var N=M.length,O,Q,P;while(N--){O=M[N];Q=M[N].firstChild;if(Q){Q.value=tinymce.html.Entities.decode(Q.value)}else{P=O.attributes.map["data-mce-innertext"];if(P){O.attr("data-mce-innertext",null);Q=new tinymce.html.Node("#text",3);Q.value=P;Q.raw=true;O.append(Q)}}}})}}function l(){a.contentStyles.push("body {min-height: 100px}");a.onClick.add(function(M,N){if(N.target.nodeName=="HTML"){a.execCommand("SelectAll");a.selection.collapse(true);a.nodeChanged()}})}u();H();r();if(tinymce.isWebKit){d();K();L();h();n();if(tinymce.isIDevice){b()}else{v();J()}}if(tinymce.isIE&&!tinymce.isIE11){C();y();D();g();i();s();E()}if(tinymce.isIE11){l()}if(tinymce.isGecko&&!tinymce.isIE11){C();z();c();G();t();q()}if(tinymce.isOpera){v()}};(function(j){var a,g,d,k=/[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#x|#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':""","'":"'","<":"<",">":">","&":"&"};d={"<":"<",">":">","&":"&",""":'"',"'":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,m.length===2?16:10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : \uFEFF".split(" ");for(g=0;g1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(s){var z={},q,n,x,r,v=d.url_converter,y=d.url_converter_scope||this;function p(D,G){var F,C,B,E;if(z["border-image"]==="none"){delete z["border-image"]}F=z[D+"-top"+G];if(!F){return}C=z[D+"-right"+G];if(F!=C){return}B=z[D+"-bottom"+G];if(C!=B){return}E=z[D+"-left"+G];if(B!=E){return}z[D+G]=E;delete z[D+"-top"+G];delete z[D+"-right"+G];delete z[D+"-bottom"+G];delete z[D+"-left"+G]}function u(C){var D=z[C],B;if(!D||D.indexOf(" ")<0){return}D=D.split(" ");B=D.length;while(B--){if(D[B]!==D[0]){return false}}z[C]=D[0];return true}function A(D,C,B,E){if(!u(C)){return}if(!u(B)){return}if(!u(E)){return}z[D]=z[C]+" "+z[B]+" "+z[E];delete z[C];delete z[B];delete z[E]}function t(B){r=true;return a[B]}function i(C,B){if(r){C=C.replace(/\uFEFF[0-9]/g,function(D){return a[D]})}if(!B){C=C.replace(/\\([\'\";:])/g,"$1")}return C}function o(C,B,F,E,G,D){G=G||D;if(G){G=i(G);return"'"+G.replace(/\'/g,"\\'")+"'"}B=i(B||F||E);if(v){B=v.call(y,B,"style")}return"url('"+B.replace(/\'/g,"\\'")+"')"}if(s){s=s.replace(/\\[\"\';:\uFEFF]/g,t).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(B){return B.replace(/[;:]/g,t)});while(q=b.exec(s)){n=q[1].replace(l,"").toLowerCase();x=q[2].replace(l,"");if(n&&x.length>0){if(n==="font-weight"&&x==="700"){x="bold"}else{if(n==="color"||n==="background-color"){x=x.toLowerCase()}}x=x.replace(k,c);x=x.replace(h,o);z[n]=r?i(x,true):x}b.lastIndex=q.index+q[0].length}p("border","");p("border","-width");p("border","-color");p("border","-style");p("padding","");p("margin","");A("border","border-width","border-style","border-color");if(z.border==="medium none"){delete z.border}}return z},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,v;x=f.styles[t];if(x){for(u=0,s=x.length;u0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(r)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(f){var a={},e=f.makeMap,g=f.each;function d(j,i){return j.split(i||",")}function h(m,l){var j,k={};function i(n){return n.replace(/[A-Z]+/g,function(o){return i(m[o])})}for(j in m){if(m.hasOwnProperty(j)){m[j]=i(m[j])}}i(l).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(q,o,n,p){n=d(n,"|");k[o]={attributes:e(n),attributesOrder:n,children:e(p,"|",{"#comment":{}})}});return k}function b(){var i=a.html5;if(!i){i=a.html5=h({A:"id|accesskey|class|dir|draggable|item|hidden|itemprop|role|spellcheck|style|subject|title|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"#|a|abbr|area|audio|b|bdo|br|button|canvas|cite|code|command|datalist|del|dfn|em|embed|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|meta|meter|noscript|object|output|progress|q|ruby|samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video|wbr",C:"#|a|abbr|area|address|article|aside|audio|b|bdo|blockquote|br|button|canvas|cite|code|command|datalist|del|details|dfn|dialog|div|dl|em|embed|fieldset|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|menu|meta|meter|nav|noscript|ol|object|output|p|pre|progress|q|ruby|samp|script|section|select|small|span|strong|style|sub|sup|svg|table|textarea|time|ul|var|video"},"html[A|manifest][body|head]head[A][base|command|link|meta|noscript|script|style|title]title[A][#]base[A|href|target][]link[A|href|rel|media|type|sizes][]meta[A|http-equiv|name|content|charset][]style[A|type|media|scoped][#]script[A|charset|type|src|defer|async][#]noscript[A][C]body[A][C]section[A][C]nav[A][C]article[A][C]aside[A][C]h1[A][B]h2[A][B]h3[A][B]h4[A][B]h5[A][B]h6[A][B]hgroup[A][h1|h2|h3|h4|h5|h6]header[A][C]footer[A][C]address[A][C]p[A][B]br[A][]pre[A][B]dialog[A][dd|dt]blockquote[A|cite][C]ol[A|start|reversed][li]ul[A][li]li[A|value][C]dl[A][dd|dt]dt[A][B]dd[A][C]a[A|href|target|ping|rel|media|type][B]em[A][B]strong[A][B]small[A][B]cite[A][B]q[A|cite][B]dfn[A][B]abbr[A][B]code[A][B]var[A][B]samp[A][B]kbd[A][B]sub[A][B]sup[A][B]i[A][B]b[A][B]mark[A][B]progress[A|value|max][B]meter[A|value|min|max|low|high|optimum][B]time[A|datetime][B]ruby[A][B|rt|rp]rt[A][B]rp[A][B]bdo[A][B]span[A][B]ins[A|cite|datetime][B]del[A|cite|datetime][B]figure[A][C|legend|figcaption]figcaption[A][C]img[A|alt|src|height|width|usemap|ismap][]iframe[A|name|src|height|width|sandbox|seamless][]embed[A|src|height|width|type][]object[A|data|type|height|width|usemap|name|form|classid][param]param[A|name|value][]details[A|open][C|legend]command[A|type|label|icon|disabled|checked|radiogroup][]menu[A|type|label][C|li]legend[A][C|B]div[A][C]source[A|src|type|media][]audio[A|src|autobuffer|autoplay|loop|controls][source]video[A|src|autobuffer|autoplay|loop|controls|width|height|poster][source]hr[A][]form[A|accept-charset|action|autocomplete|enctype|method|name|novalidate|target][C]fieldset[A|disabled|form|name][C|legend]label[A|form|for][B]input[A|type|accept|alt|autocomplete|autofocus|checked|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|height|list|max|maxlength|min|multiple|pattern|placeholder|readonly|required|size|src|step|width|files|value|name][]button[A|autofocus|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|name|value|type][B]select[A|autofocus|disabled|form|multiple|name|size][option|optgroup]datalist[A][B|option]optgroup[A|disabled|label][option]option[A|disabled|selected|label|value][]textarea[A|autofocus|disabled|form|maxlength|name|placeholder|readonly|required|rows|cols|wrap][]keygen[A|autofocus|challenge|disabled|form|keytype|name][]output[A|for|form|name][B]canvas[A|width|height][]map[A|name][B|C]area[A|shape|coords|href|alt|target|media|rel|ping|type][]mathml[A][]svg[A][]table[A|border][caption|colgroup|thead|tfoot|tbody|tr]caption[A][C]colgroup[A|span][col]col[A|span][]thead[A][tr]tfoot[A][tr]tbody[A][tr]tr[A][th|td]th[A|headers|rowspan|colspan|scope][B]td[A|headers|rowspan|colspan][C]wbr[A][]")}return i}function c(){var i=a.html4;if(!i){i=a.html4=h({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]")}return i}f.html.Schema=function(A){var u=this,s={},k={},j=[],D,y;var o,q,z,r,v,n,p={};function m(F,E,H){var G=A[F];if(!G){G=a[F];if(!G){G=e(E," ",e(E.toUpperCase()," "));G=f.extend(G,H);a[F]=G}}else{G=e(G,",",e(G.toUpperCase()," "))}return G}A=A||{};y=A.schema=="html5"?b():c();if(A.verify_html===false){A.valid_elements="*[*]"}if(A.valid_styles){D={};g(A.valid_styles,function(F,E){D[E]=f.explode(F)})}o=m("whitespace_elements","pre script noscript style textarea");q=m("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr");z=m("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr");r=m("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls");n=m("non_empty_elements","td th iframe video audio object script",z);textBlockElementsMap=m("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside nav figure");v=m("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex samp option datalist select optgroup",textBlockElementsMap);function i(E){return new RegExp("^"+E.replace(/([?+*])/g,".$1")+"$")}function C(L){var K,G,Z,V,aa,F,I,U,X,Q,Y,ac,O,J,W,E,S,H,ab,ad,P,T,N=/^([#+\-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,R=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,M=/[*?+]/;if(L){L=d(L);if(s["@"]){S=s["@"].attributes;H=s["@"].attributesOrder}for(K=0,G=L.length;K=0){for(U=A.length-1;U>=V;U--){T=A[U];if(T.valid){n.end(T.name)}}A.length=V}}function p(U,T,Y,X,W){var Z,V;T=T.toLowerCase();Y=T in H?T:j(Y||X||W||"");if(v&&!z&&T.indexOf("data-")!==0){Z=P[T];if(!Z&&F){V=F.length;while(V--){Z=F[V];if(Z.pattern.test(T)){break}}if(V===-1){Z=null}}if(!Z){return}if(Z.validValues&&!(Y in Z.validValues)){return}}N.map[T]=Y;N.push({name:T,value:Y})}l=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([A-Za-z0-9\\-\\:\\.]+)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g");D=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;K={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};M=e.getShortEndedElements();J=c.self_closing_elements||e.getSelfClosingElements();H=e.getBoolAttrs();v=c.validate;s=c.remove_internals;y=c.fix_self_closing;q=a.isIE;o=/^:/;while(g=l.exec(E)){if(G0&&A[A.length-1].name===I){u(I)}if(!v||(m=e.getElementRule(I))){k=true;if(v){P=m.attributes;F=m.attributePatterns}if(R=g[8]){z=R.indexOf("data-mce-type")!==-1;if(z&&s){k=false}N=[];N.map={};R.replace(D,p)}else{N=[];N.map={}}if(v&&!z){S=m.attributesRequired;L=m.attributesDefault;f=m.attributesForced;if(f){Q=f.length;while(Q--){t=f[Q];r=t.name;h=t.value;if(h==="{$uid}"){h="mce_"+x++}N.map[r]=h;N.push({name:r,value:h})}}if(L){Q=L.length;while(Q--){t=L[Q];r=t.name;if(!(r in N.map)){h=t.value;if(h==="{$uid}"){h="mce_"+x++}N.map[r]=h;N.push({name:r,value:h})}}}if(S){Q=S.length;while(Q--){if(S[Q] in N.map){break}}if(Q===-1){k=false}}if(N.map["data-mce-bogus"]){k=false}}if(k){n.start(I,N,O)}}else{k=false}if(B=K[I]){B.lastIndex=G=g.index+g[0].length;if(g=B.exec(E)){if(k){C=E.substr(G,g.index-G)}G=g.index+g[0].length}else{C=E.substr(G);G=E.length}if(k&&C.length>0){n.text(C,true)}if(k){n.end(I)}l.lastIndex=G;continue}if(!O){if(!R||R.indexOf("/")!=R.length-1){A.push({name:I,valid:k})}else{if(k){n.end(I)}}}}else{if(I=g[1]){n.comment(I)}else{if(I=g[2]){n.cdata(I)}else{if(I=g[3]){n.doctype(I)}else{if(I=g[4]){n.pi(I,g[5])}}}}}}G=g.index+g[0].length}if(G=0;Q--){I=A[Q];if(I.valid){n.end(I.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h1){x.reverse();A=o=f.filterNode(x[0].clone());for(u=0;u0){Q.value=l;Q=Q.prev}else{O=Q.prev;Q.remove();Q=O}}}function H(O){var P,l={};for(P in O){if(P!=="li"&&P!="p"){l[P]=O[P]}}return l}n=new b.html.SaxParser({validate:z,self_closing_elements:H(h.getSelfClosingElements()),cdata:function(l){B.append(K("#cdata",4)).value=l},text:function(P,l){var O;if(!L){P=P.replace(k," ");if(B.lastChild&&o[B.lastChild.name]){P=P.replace(E,"")}}if(P.length!==0){O=K("#text",3);O.raw=!!l;B.append(O).value=P}},comment:function(l){B.append(K("#comment",8)).value=l},pi:function(l,O){B.append(K(l,7)).value=O;I(B)},doctype:function(O){var l;l=B.append(K("#doctype",10));l.value=O;I(B)},start:function(l,W,P){var U,R,Q,O,S,X,V,T;Q=z?h.getElementRule(l):{};if(Q){U=K(Q.outputName||l,1);U.attributes=W;U.shortEnded=P;B.append(U);T=p[B.name];if(T&&p[U.name]&&!T[U.name]){M.push(U)}R=d.length;while(R--){S=d[R].name;if(S in W.map){F=c[S];if(F){F.push(U)}else{c[S]=[U]}}}if(o[l]){I(U)}if(!P){B=U}if(!L&&s[l]){L=true}}},end:function(l){var S,P,R,O,Q;P=z?h.getElementRule(l):{};if(P){if(o[l]){if(!L){S=B.firstChild;if(S&&S.type===3){R=S.value.replace(E,"");if(R.length>0){S.value=R;S=S.next}else{O=S.next;S.remove();S=O}while(S&&S.type===3){R=S.value;O=S.next;if(R.length===0||y.test(R)){S.remove();S=O}S=O}}S=B.lastChild;if(S&&S.type===3){R=S.value.replace(t,"");if(R.length>0){S.value=R;S=S.prev}else{O=S.prev;S.remove();S=O}while(S&&S.type===3){R=S.value;O=S.prev;if(R.length===0||y.test(R)){S.remove();S=O}S=O}}}}if(L&&s[l]){L=false}if(P.removeEmpty||P.paddEmpty){if(B.isEmpty(u)){if(P.paddEmpty){B.empty().append(new a("#text","3")).value="\u00a0"}else{if(!B.attributes.map.name&&!B.attributes.map.id){Q=B.parent;B.empty().remove();B=Q;return}}}}B=B.parent}}},h);J=B=new a(m.context||g.root_name,11);n.parse(v);if(z&&M.length){if(!m.context){j(M)}else{m.invalid=true}}if(q&&J.name=="body"){G()}if(!m.invalid){for(N in i){F=e[N];A=i[N];x=A.length;while(x--){if(!A[x].parent){A.splice(x,1)}}for(D=0,C=F.length;D0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("")},comment:function(h){c.push("")},pi:function(h,i){if(i){c.push("")}else{c.push("")}if(a){c.push("\n")}},doctype:function(h){c.push("",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n=8;k.boxModel=!e.isIE||o.compatMode=="CSS1Compat"||k.stdMode;k.hasOuterHTML="outerHTML" in o.createElement("a");k.settings=l=e.extend({keep_values:false,hex_colors:1},l);k.schema=l.schema;k.styles=new e.html.Styles({url_converter:l.url_converter,url_converter_scope:l.url_converter_scope},l.schema);if(e.isIE6){try{o.execCommand("BackgroundImageCache",false,true)}catch(m){k.cssFlicker=true}}k.fixDoc(o);k.events=l.ownEvents?new e.dom.EventUtils(l.proxy):e.dom.Event;e.addUnload(k.destroy,k);n=l.schema?l.schema.getBlockElements():{};k.isBlock=function(q){if(!q){return false}var p=q.nodeType;if(p){return !!(p===1&&n[q.nodeName])}return !!n[q]}},fixDoc:function(k){var j=this.settings,i;if(b&&!e.isIE11&&j.schema){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(l){k.createElement(l)});for(i in j.schema.getCustomElements()){k.createElement(i)}}},clone:function(k,i){var j=this,m,l;if(!b||e.isIE11||k.nodeType!==1||i){return k.cloneNode(i)}l=j.doc;if(!i){m=l.createElement(k.nodeName);g(j.getAttribs(k),function(n){j.setAttrib(m,n.nodeName,j.getAttrib(k,n.nodeName))});return m}return m.firstChild},getRoot:function(){var i=this,j=i.settings;return(j&&i.get(j.root_element))||i.doc.body},getViewPort:function(j){var k,i;j=!j?this.win:j;k=j.document;i=this.boxModel?k.documentElement:k.body;return{x:j.pageXOffset||i.scrollLeft,y:j.pageYOffset||i.scrollTop,w:j.innerWidth||i.clientWidth,h:j.innerHeight||i.clientHeight}},getRect:function(l){var k,i=this,j;l=i.get(l);k=i.getPos(l);j=i.getSize(l);return{x:k.x,y:k.y,w:j.w,h:j.h}},getSize:function(l){var j=this,i,k;l=j.get(l);i=j.getStyle(l,"width");k=j.getStyle(l,"height");if(i.indexOf("px")===-1){i=0}if(k.indexOf("px")===-1){k=0}return{w:parseInt(i,10)||l.offsetWidth||l.clientWidth,h:parseInt(k,10)||l.offsetHeight||l.clientHeight}},getParent:function(k,j,i){return this.getParents(k,j,i,false)},getParents:function(s,m,k,q){var j=this,i,l=j.settings,p=[];s=j.get(s);q=q===undefined;if(l.strict_root){k=k||j.getRoot()}if(d(m,"string")){i=m;if(m==="*"){m=function(o){return o.nodeType==1}}else{m=function(o){return j.is(o,i)}}}while(s){if(s==k||!s.nodeType||s.nodeType===9){break}if(!m||m(s)){if(q){p.push(s)}else{return s}}s=s.parentNode}return q?p:null},get:function(i){var j;if(i&&this.doc&&typeof(i)=="string"){j=i;i=this.doc.getElementById(i);if(i&&i.id!==j){return this.doc.getElementsByName(j)[1]}}return i},getNext:function(j,i){return this._findSib(j,i,"nextSibling")},getPrev:function(j,i){return this._findSib(j,i,"previousSibling")},select:function(k,j){var i=this;return e.dom.Sizzle(k,i.get(j)||i.get(i.settings.root_element)||i.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(c.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return e.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(l,o,i,k,m){var j=this;return this.run(l,function(r){var q,n;q=d(o,"string")?j.doc.createElement(o):o;j.setAttribs(q,i);if(k){if(k.nodeType){q.appendChild(k)}else{j.setHTML(q,k)}}return !m?r.appendChild(q):q})},create:function(k,i,j){return this.add(this.doc.createElement(k),k,i,j,1)},createHTML:function(q,i,m){var p="",l=this,j;p+="<"+q;for(j in i){if(i.hasOwnProperty(j)){p+=" "+j+'="'+l.encode(i[j])+'"'}}if(typeof(m)!="undefined"){return p+">"+m+""}return p+" />"},remove:function(i,j){return this.run(i,function(l){var m,k=l.parentNode;if(!k){return null}if(j){while(m=l.firstChild){if(!e.isIE||m.nodeType!==3||m.nodeValue){k.insertBefore(m,l)}else{l.removeChild(m)}}}return k.removeChild(l)})},setStyle:function(l,i,j){var k=this;return k.run(l,function(o){var n,m;n=o.style;i=i.replace(/-(\D)/g,function(q,p){return p.toUpperCase()});if(k.pixelStyles.test(i)&&(e.is(j,"number")||/^[\-0-9\.]+$/.test(j))){j+="px"}switch(i){case"opacity":if(b&&!e.isIE11){n.filter=j===""?"":"alpha(opacity="+(j*100)+")";if(!l.currentStyle||!l.currentStyle.hasLayout){n.display="inline-block"}}n[i]=n["-moz-opacity"]=n["-khtml-opacity"]=j||"";break;case"float":(b&&!e.isIE11)?n.styleFloat=j:n.cssFloat=j;break;default:n[i]=j||""}if(k.settings.update_styles){k.setAttrib(o,"data-mce-style")}})},getStyle:function(l,i,k){l=this.get(l);if(!l){return}if(this.doc.defaultView&&k){i=i.replace(/[A-Z]/g,function(m){return"-"+m});try{return this.doc.defaultView.getComputedStyle(l,null).getPropertyValue(i)}catch(j){return null}}i=i.replace(/-(\D)/g,function(n,m){return m.toUpperCase()});if(i=="float"){i=b?"styleFloat":"cssFloat"}if(l.currentStyle&&k){return l.currentStyle[i]}return l.style?l.style[i]:undefined},setStyles:function(l,m){var j=this,k=j.settings,i;i=k.update_styles;k.update_styles=0;g(m,function(o,p){j.setStyle(l,p,o)});k.update_styles=i;if(k.update_styles){j.setAttrib(l,k.cssText)}},removeAllAttribs:function(i){return this.run(i,function(l){var k,j=l.attributes;for(k=j.length-1;k>=0;k--){l.removeAttributeNode(j.item(k))}})},setAttrib:function(k,l,i){var j=this;if(!k||!l){return}if(j.settings.strict){l=l.toLowerCase()}return this.run(k,function(p){var o=j.settings;var m=p.getAttribute(l);if(i!==null){switch(l){case"style":if(!d(i,"string")){g(i,function(q,r){j.setStyle(p,r,q)});return}if(o.keep_values){if(i&&!j._isRes(i)){p.setAttribute("data-mce-style",i,2)}else{p.removeAttribute("data-mce-style",2)}}p.style.cssText=i;break;case"class":p.className=i||"";break;case"src":case"href":if(o.keep_values){if(o.url_converter){i=o.url_converter.call(o.url_converter_scope||j,i,l,p)}j.setAttrib(p,"data-mce-"+l,i,2)}break;case"shape":p.setAttribute("data-mce-style",i);break}}if(d(i)&&i!==null&&i.length!==0){p.setAttribute(l,""+i,2)}else{p.removeAttribute(l,2)}if(tinyMCE.activeEditor&&m!=i){var n=tinyMCE.activeEditor;n.onSetAttrib.dispatch(n,p,l,i)}})},setAttribs:function(j,k){var i=this;return this.run(j,function(l){g(k,function(m,o){i.setAttrib(l,o,m)})})},getAttrib:function(m,o,k){var i,j=this,l;m=j.get(m);if(!m||m.nodeType!==1){return k===l?false:k}if(!d(k)){k=""}if(/^(src|href|style|coords|shape)$/.test(o)){i=m.getAttribute("data-mce-"+o);if(i){return i}}if(b&&j.props[o]){i=m[j.props[o]];i=i&&i.nodeValue?i.nodeValue:i}if(!i){i=m.getAttribute(o,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(o)){if(m[j.props[o]]===true&&i===""){return o}return i?o:""}if(m.nodeName==="FORM"&&m.getAttributeNode(o)){return m.getAttributeNode(o).nodeValue}if(o==="style"){i=i||m.style.cssText;if(i){i=j.serializeStyle(j.parseStyle(i),m.nodeName);if(j.settings.keep_values&&!j._isRes(i)){m.setAttribute("data-mce-style",i)}}}if(f&&o==="class"&&i){i=i.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(o){case"rowspan":case"colspan":if(i===1){i=""}break;case"size":if(i==="+0"||i===20||i===0){i=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(i===0){i=""}break;case"hspace":if(i===-1){i=""}break;case"maxlength":case"tabindex":if(i===32768||i===2147483647||i==="32768"){i=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(i===65535){return o}return k;case"shape":i=i.toLowerCase();break;default:if(o.indexOf("on")===0&&i){i=e._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+i)}}}return(i!==l&&i!==null&&i!=="")?""+i:k},getPos:function(q,l){var j=this,i=0,p=0,m,o=j.doc,k;q=j.get(q);l=l||o.body;if(q){if(q.getBoundingClientRect){q=q.getBoundingClientRect();m=j.boxModel?o.documentElement:o.body;i=q.left+(o.documentElement.scrollLeft||o.body.scrollLeft)-m.clientTop;p=q.top+(o.documentElement.scrollTop||o.body.scrollTop)-m.clientLeft;return{x:i,y:p}}k=q;while(k&&k!=l&&k.nodeType){i+=k.offsetLeft||0;p+=k.offsetTop||0;k=k.offsetParent}k=q.parentNode;while(k&&k!=l&&k.nodeType){i-=k.scrollLeft||0;p-=k.scrollTop||0;k=k.parentNode}}return{x:i,y:p}},parseStyle:function(i){return this.styles.parse(i)},serializeStyle:function(j,i){return this.styles.serialize(j,i)},addStyle:function(j){var k=this.doc,i;styleElm=k.getElementById("mceDefaultStyles");if(!styleElm){styleElm=k.createElement("style"),styleElm.id="mceDefaultStyles";styleElm.type="text/css";i=k.getElementsByTagName("head")[0];if(i.firstChild){i.insertBefore(styleElm,i.firstChild)}else{i.appendChild(styleElm)}}if(styleElm.styleSheet){styleElm.styleSheet.cssText+=j}else{styleElm.appendChild(k.createTextNode(j))}},loadCSS:function(i){var k=this,l=k.doc,j;if(!i){i=""}j=l.getElementsByTagName("head")[0];g(i.split(","),function(m){var n;if(k.files[m]){return}k.files[m]=true;n=k.create("link",{rel:"stylesheet",href:e._addVer(m)});if(b&&!e.isIE11&&l.documentMode&&l.recalc){n.onload=function(){if(l.recalc){l.recalc()}n.onload=null}}j.appendChild(n)})},addClass:function(i,j){return this.run(i,function(k){var l;if(!j){return 0}if(this.hasClass(k,j)){return k.className}l=this.removeClass(k,j);return k.className=(l!=""?(l+" "):"")+j})},removeClass:function(k,l){var i=this,j;return i.run(k,function(n){var m;if(i.hasClass(n,l)){if(!j){j=new RegExp("(^|\\s+)"+l+"(\\s+|$)","g")}m=n.className.replace(j," ");m=e.trim(m!=" "?m:"");n.className=m;if(!m){n.removeAttribute("class");n.removeAttribute("className")}return m}return n.className})},hasClass:function(j,i){j=this.get(j);if(!j||!i){return false}return(" "+j.className+" ").indexOf(" "+i+" ")!==-1},show:function(i){return this.setStyle(i,"display","block")},hide:function(i){return this.setStyle(i,"display","none")},isHidden:function(i){i=this.get(i);return !i||i.style.display=="none"||this.getStyle(i,"display")=="none"},uniqueId:function(i){return(!i?"mce_":i)+(this.counter++)},setHTML:function(k,j){var i=this;return i.run(k,function(m){if(b){while(m.firstChild){m.removeChild(m.firstChild)}try{m.innerHTML="
"+j;m.removeChild(m.firstChild)}catch(l){var n=i.create("div");n.innerHTML="
"+j;g(e.grep(n.childNodes),function(p,o){if(o&&m.canHaveHTML){m.appendChild(p)}})}}else{m.innerHTML=j}return j})},getOuterHTML:function(k){var j,i=this;k=i.get(k);if(!k){return null}if(k.nodeType===1&&i.hasOuterHTML){return k.outerHTML}j=(k.ownerDocument||i.doc).createElement("body");j.appendChild(k.cloneNode(true));return j.innerHTML},setOuterHTML:function(l,j,m){var i=this;function k(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){i.insertAfter(s.cloneNode(true),p);s=s.previousSibling}i.remove(p)}return this.run(l,function(o){o=i.get(o);if(o.nodeType==1){m=m||o.ownerDocument||i.doc;if(b){try{if(b&&o.nodeType==1){o.outerHTML=j}else{k(o,j,m)}}catch(n){k(o,j,m)}}else{k(o,j,m)}}})},decode:h.decode,encode:h.encodeAllRaw,insertAfter:function(i,j){j=this.get(j);return this.run(i,function(l){var k,m;k=j.parentNode;m=j.nextSibling;if(m){k.insertBefore(l,m)}else{k.appendChild(l)}return l})},replace:function(m,l,i){var j=this;if(d(l,"array")){m=m.cloneNode(true)}return j.run(l,function(k){if(i){g(e.grep(k.childNodes),function(n){m.appendChild(n)})}return k.parentNode.replaceChild(m,k)})},rename:function(l,i){var k=this,j;if(l.nodeName!=i.toUpperCase()){j=k.create(i);g(k.getAttribs(l),function(m){k.setAttrib(j,m.nodeName,k.getAttrib(l,m.nodeName))});k.replace(j,l,1)}return j||l},findCommonAncestor:function(k,i){var l=k,j;while(l){j=i;while(j&&l!=j){j=j.parentNode}if(l==j){break}l=l.parentNode}if(!l&&k.ownerDocument){return k.ownerDocument.documentElement}return l},toHex:function(i){var k=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(i);function j(l){l=parseInt(l,10).toString(16);return l.length>1?l:"0"+l}if(k){i="#"+j(k[1])+j(k[2])+j(k[3]);return i}return i},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(i){g(i.imports,function(s){q(s)});g(i.cssRules||i.rules,function(t){switch(t.type||1){case 1:if(t.selectorText){g(t.selectorText.split(","),function(r){r=r.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(r)||!/\.[\w\-]+$/.test(r)){return}l=r;r=e._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",r);if(p&&!(r=p(r,l))){return}if(!o[r]){j.push({"class":r});o[r]=1}})}break;case 3:try{q(t.styleSheet)}catch(s){}break}})}try{g(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(l,k,j){var i=this,m;if(i.doc&&typeof(l)==="string"){l=i.get(l)}if(!l){return false}j=j||this;if(!l.nodeType&&(l.length||l.length===0)){m=[];g(l,function(o,n){if(o){if(typeof(o)=="string"){o=i.doc.getElementById(o)}m.push(k.call(j,o,n))}});return m}return k.call(j,l)},getAttribs:function(j){var i;j=this.get(j);if(!j){return[]}if(b){i=[];if(j.nodeName=="OBJECT"){return j.attributes}if(j.nodeName==="OPTION"&&this.getAttrib(j,"selected")){i.push({specified:1,nodeName:"selected"})}j.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(k){i.push({specified:1,nodeName:k})});return i}return j.attributes},isEmpty:function(m,k){var r=this,o,n,q,j,l,p=0;m=m.firstChild;if(m){j=new e.dom.TreeWalker(m,m.parentNode);k=k||r.schema?r.schema.getNonEmptyElements():null;do{q=m.nodeType;if(q===1){if(m.getAttribute("data-mce-bogus")){continue}l=m.nodeName.toLowerCase();if(k&&k[l]){if(l==="br"){p++;continue}return false}n=r.getAttribs(m);o=m.attributes.length;while(o--){l=m.attributes[o].nodeName;if(l==="name"||l==="data-mce-bookmark"){return false}}}if(q==8){return false}if((q===3&&!a.test(m.nodeValue))){return false}}while(m=j.next())}return p<=1},destroy:function(j){var i=this;i.win=i.doc=i.root=i.events=i.frag=null;if(!j){e.removeUnload(i.destroy)}},createRng:function(){var i=this.doc;return i.createRange?i.createRange():new e.dom.Range(this)},nodeIndex:function(m,n){var i=0,k,l,j;if(m){for(k=m.nodeType,m=m.previousSibling,l=m;m;m=m.previousSibling){j=m.nodeType;if(n&&j==3){if(j==k||!m.nodeValue.length){continue}}i++;k=j}}return i},split:function(m,l,p){var q=this,i=q.createRng(),n,k,o;function j(v){var t,s=v.childNodes,u=v.nodeType;function x(A){var z=A.previousSibling&&A.previousSibling.nodeName=="SPAN";var y=A.nextSibling&&A.nextSibling.nodeName=="SPAN";return z&&y}if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=s.length-1;t>=0;t--){j(s[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){var r=e.trim(v.nodeValue).length;if(!q.isBlock(v.parentNode)||r>0||r===0&&x(v)){return}}else{if(u==1){s=v.childNodes;if(s.length==1&&s[0]&&s[0].nodeType==1&&s[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(s[0],v)}if(s.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}q.remove(v)}return v}if(m&&l){i.setStart(m.parentNode,q.nodeIndex(m));i.setEnd(l.parentNode,q.nodeIndex(l));n=i.extractContents();i=q.createRng();i.setStart(l.parentNode,q.nodeIndex(l)+1);i.setEnd(m.parentNode,q.nodeIndex(m)+1);k=i.extractContents();o=m.parentNode;o.insertBefore(j(n),m);if(p){o.replaceChild(p,l)}else{o.insertBefore(l,m)}o.insertBefore(j(k),m);q.remove(m);return p||l}},bind:function(l,i,k,j){return this.events.add(l,i,k,j||this)},unbind:function(k,i,j){return this.events.remove(k,i,j)},fire:function(k,j,i){return this.events.fire(k,j,i)},getContentEditable:function(j){var i;if(j.nodeType!=1){return null}i=j.getAttribute("data-mce-contenteditable");if(i&&i!=="inherit"){return i}return j.contentEditable!=="inherit"?j.contentEditable:null},_findSib:function(l,i,j){var k=this,m=i;if(l){if(d(m,"string")){m=function(n){return k.is(n,i)}}for(l=l[j];l;l=l[j]){if(m(l)){return l}}}return null},_isRes:function(i){return/^(top|left|bottom|right|width|height)/i.test(i)||/;\s*(top|left|bottom|right|width|height)/i.test(i)}});e.DOM=new e.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var O=this,e=c.doc,U=0,F=1,j=2,E=true,S=false,W="startOffset",h="startContainer",Q="endContainer",A="endOffset",k=tinymce.extend,n=c.nodeIndex;k(O,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:E,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:J,setEndBefore:K,setEndAfter:u,collapse:B,selectNode:y,selectNodeContents:G,compareBoundaryPoints:v,deleteContents:p,extractContents:I,cloneContents:d,insertNode:D,surroundContents:N,cloneRange:L,toStringIE:T});function x(){return e.createDocumentFragment()}function q(X,t){C(E,X,t)}function s(X,t){C(S,X,t)}function g(t){q(t.parentNode,n(t))}function J(t){q(t.parentNode,n(t)+1)}function K(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function B(t){if(t){O[Q]=O[h];O[A]=O[W]}else{O[h]=O[Q];O[W]=O[A]}O.collapsed=E}function y(t){g(t);u(t)}function G(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(aa,t){var ad=O[h],Y=O[W],ac=O[Q],X=O[A],ab=t.startContainer,af=t.startOffset,Z=t.endContainer,ae=t.endOffset;if(aa===0){return H(ad,Y,ab,af)}if(aa===1){return H(ac,X,ab,af)}if(aa===2){return H(ac,X,Z,ae)}if(aa===3){return H(ad,Y,Z,ae)}}function p(){l(j)}function I(){return l(U)}function d(){return l(F)}function D(aa){var X=this[h],t=this[W],Z,Y;if((X.nodeType===3||X.nodeType===4)&&X.nodeValue){if(!t){X.parentNode.insertBefore(aa,X)}else{if(t>=X.nodeValue.length){c.insertAfter(aa,X)}else{Z=X.splitText(t);X.parentNode.insertBefore(aa,Z)}}}else{if(X.childNodes.length>0){Y=X.childNodes[t]}if(Y){X.insertBefore(aa,Y)}else{X.appendChild(aa)}}}function N(X){var t=O.extractContents();O.insertNode(X);X.appendChild(t);O.selectNode(X)}function L(){return k(new b(c),{startContainer:O[h],startOffset:O[W],endContainer:O[Q],endOffset:O[A],collapsed:O.collapsed,commonAncestorContainer:O.commonAncestorContainer})}function P(t,X){var Y;if(t.nodeType==3){return t}if(X<0){return t}Y=t.firstChild;while(Y&&X>0){--X;Y=Y.nextSibling}if(Y){return Y}return t}function m(){return(O[h]==O[Q]&&O[W]==O[A])}function H(Z,ab,X,aa){var ac,Y,t,ad,af,ae;if(Z==X){if(ab==aa){return 0}if(ab0){O.collapse(X)}}else{O.collapse(X)}O.collapsed=m();O.commonAncestorContainer=c.findCommonAncestor(O[h],O[Q])}function l(ad){var ac,Z=0,af=0,X,ab,Y,aa,t,ae;if(O[h]==O[Q]){return f(ad)}for(ac=O[Q],X=ac.parentNode;X;ac=X,X=X.parentNode){if(X==O[h]){return r(ac,ad)}++Z}for(ac=O[h],X=ac.parentNode;X;ac=X,X=X.parentNode){if(X==O[Q]){return V(ac,ad)}++af}ab=af-Z;Y=O[h];while(ab>0){Y=Y.parentNode;ab--}aa=O[Q];while(ab<0){aa=aa.parentNode;ab++}for(t=Y.parentNode,ae=aa.parentNode;t!=ae;t=t.parentNode,ae=ae.parentNode){Y=t;aa=ae}return o(Y,aa,ad)}function f(ac){var ae,af,t,Y,Z,ad,aa,X,ab;if(ac!=j){ae=x()}if(O[W]==O[A]){return ae}if(O[h].nodeType==3){af=O[h].nodeValue;t=af.substring(O[W],O[A]);if(ac!=F){Y=O[h];X=O[W];ab=O[A]-O[W];if(X===0&&ab>=Y.nodeValue.length-1){Y.parentNode.removeChild(Y)}else{Y.deleteData(X,ab)}O.collapse(E)}if(ac==j){return}if(t.length>0){ae.appendChild(e.createTextNode(t))}return ae}Y=P(O[h],O[W]);Z=O[A]-O[W];while(Y&&Z>0){ad=Y.nextSibling;aa=z(Y,ac);if(ae){ae.appendChild(aa)}--Z;Y=ad}if(ac!=F){O.collapse(E)}return ae}function r(ad,aa){var ac,ab,X,t,Z,Y;if(aa!=j){ac=x()}ab=i(ad,aa);if(ac){ac.appendChild(ab)}X=n(ad);t=X-O[W];if(t<=0){if(aa!=F){O.setEndBefore(ad);O.collapse(S)}return ac}ab=ad.previousSibling;while(t>0){Z=ab.previousSibling;Y=z(ab,aa);if(ac){ac.insertBefore(Y,ac.firstChild)}--t;ab=Z}if(aa!=F){O.setEndBefore(ad);O.collapse(S)}return ac}function V(ab,aa){var ad,X,ac,t,Z,Y;if(aa!=j){ad=x()}ac=R(ab,aa);if(ad){ad.appendChild(ac)}X=n(ab);++X;t=O[A]-X;ac=ab.nextSibling;while(ac&&t>0){Z=ac.nextSibling;Y=z(ac,aa);if(ad){ad.appendChild(Y)}--t;ac=Z}if(aa!=F){O.setStartAfter(ab);O.collapse(E)}return ad}function o(ab,t,ae){var Y,ag,aa,ac,ad,X,af,Z;if(ae!=j){ag=x()}Y=R(ab,ae);if(ag){ag.appendChild(Y)}aa=ab.parentNode;ac=n(ab);ad=n(t);++ac;X=ad-ac;af=ab.nextSibling;while(X>0){Z=af.nextSibling;Y=z(af,ae);if(ag){ag.appendChild(Y)}af=Z;--X}Y=i(t,ae);if(ag){ag.appendChild(Y)}if(ae!=F){O.setStartAfter(ab);O.collapse(E)}return ag}function i(ac,ad){var Y=P(O[Q],O[A]-1),ae,ab,aa,t,X,Z=Y!=O[Q];if(Y==ac){return M(Y,Z,S,ad)}ae=Y.parentNode;ab=M(ae,S,S,ad);while(ae){while(Y){aa=Y.previousSibling;t=M(Y,Z,S,ad);if(ad!=j){ab.insertBefore(t,ab.firstChild)}Z=E;Y=aa}if(ae==ac){return ab}Y=ae.previousSibling;ae=ae.parentNode;X=M(ae,S,S,ad);if(ad!=j){X.appendChild(ab)}ab=X}}function R(ac,ad){var Z=P(O[h],O[W]),aa=Z!=O[h],ae,ab,Y,t,X;if(Z==ac){return M(Z,aa,E,ad)}ae=Z.parentNode;ab=M(ae,S,E,ad);while(ae){while(Z){Y=Z.nextSibling;t=M(Z,aa,E,ad);if(ad!=j){ab.appendChild(t)}aa=E;Z=Y}if(ae==ac){return ab}Z=ae.nextSibling;ae=ae.parentNode;X=M(ae,S,E,ad);if(ad!=j){X.appendChild(ab)}ab=X}}function M(t,aa,ad,ae){var Z,Y,ab,X,ac;if(aa){return z(t,ae)}if(t.nodeType==3){Z=t.nodeValue;if(ad){X=O[W];Y=Z.substring(X);ab=Z.substring(0,X)}else{X=O[A];Y=Z.substring(0,X);ab=Z.substring(X)}if(ae!=F){t.nodeValue=ab}if(ae==j){return}ac=c.clone(t,S);ac.nodeValue=Y;return ac}if(ae==j){return}return c.clone(t,S)}function z(X,t){if(t!=j){return t==F?c.clone(X,E):X}X.parentNode.removeChild(X)}function T(){return c.create("body",null,d()).outerText}return O}a.Range=b;b.prototype.toString=function(){return this.toStringIE()}})(tinymce.dom);(function(){function a(d){var b=this,h=d.dom,c=true,f=false;function e(i,j){var k,t=0,q,n,m,l,o,r,p=-1,s;k=i.duplicate();k.collapse(j);s=k.parentElement();if(s.ownerDocument!==d.dom.doc){return}while(s.contentEditable==="false"){s=s.parentNode}if(!s.hasChildNodes()){return{node:s,inside:1}}m=s.children;q=m.length-1;while(t<=q){r=Math.floor((t+q)/2);l=m[r];k.moveToElementText(l);p=k.compareEndPoints(j?"StartToStart":"EndToEnd",i);if(p>0){q=r-1}else{if(p<0){t=r+1}else{return{node:l}}}}if(p<0){if(!l){k.moveToElementText(s);k.collapse(true);l=s;n=true}else{k.collapse(false)}o=0;while(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)!==0){if(k.move("character",1)===0||s!=k.parentElement()){break}o++}}else{k.collapse(true);o=0;while(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)!==0){if(k.move("character",-1)===0||s!=k.parentElement()){break}o++}}return{node:l,position:p,offset:o,inside:n}}function g(){var i=d.getRng(),r=h.createRng(),l,k,p,q,m,j;l=i.item?i.item(0):i.parentElement();if(l.ownerDocument!=h.doc){return r}k=d.isCollapsed();if(i.item){r.setStart(l.parentNode,h.nodeIndex(l));r.setEnd(r.startContainer,r.startOffset+1);return r}function o(A){var u=e(i,A),s,y,z=0,x,v,t;s=u.node;y=u.offset;if(u.inside&&!s.hasChildNodes()){r[A?"setStart":"setEnd"](s,0);return}if(y===v){r[A?"setStartBefore":"setEndAfter"](s);return}if(u.position<0){x=u.inside?s.firstChild:s.nextSibling;if(!x){r[A?"setStartAfter":"setEndAfter"](s);return}if(!y){if(x.nodeType==3){r[A?"setStart":"setEnd"](x,0)}else{r[A?"setStartBefore":"setEndBefore"](x)}return}while(x){t=x.nodeValue;z+=t.length;if(z>=y){s=x;z-=y;z=t.length-z;break}x=x.nextSibling}}else{x=s.previousSibling;if(!x){return r[A?"setStartBefore":"setEndBefore"](s)}if(!y){if(s.nodeType==3){r[A?"setStart":"setEnd"](x,s.nodeValue.length)}else{r[A?"setStartAfter":"setEndAfter"](x)}return}while(x){z+=x.nodeValue.length;if(z>=y){s=x;z-=y;break}x=x.previousSibling}}r[A?"setStart":"setEnd"](s,z)}try{o(true);if(!k){o()}}catch(n){if(n.number==-2147024809){m=b.getBookmark(2);p=i.duplicate();p.collapse(true);l=p.parentElement();if(!k){p=i.duplicate();p.collapse(false);q=p.parentElement();q.innerHTML=q.innerHTML}l.innerHTML=l.innerHTML;b.moveToBookmark(m);i=d.getRng();o(true);if(!k){o()}}else{throw n}}return r}this.getBookmark=function(m){var j=d.getRng(),o,i,l={};function n(u){var t,p,s,r,q=[];t=u.parentNode;p=h.getRoot().parentNode;while(t!=p&&t.nodeType!==9){s=t.children;r=s.length;while(r--){if(u===s[r]){q.push(r);break}}u=t;t=t.parentNode}return q}function k(q){var p;p=e(j,q);if(p){return{position:p.position,offset:p.offset,indexes:n(p.node),inside:p.inside}}}if(m===2){if(!j.item){l.start=k(true);if(!d.isCollapsed()){l.end=k()}}else{l.start={ctrl:true,indexes:n(j.item(0))}}}return l};this.moveToBookmark=function(k){var j,i=h.doc.body;function m(o){var r,q,n,p;r=h.getRoot();for(q=o.length-1;q>=0;q--){p=r.children;n=o[q];if(n<=p.length-1){r=p[n]}}return r}function l(r){var n=k[r?"start":"end"],q,p,o;if(n){q=n.position>0;p=i.createTextRange();p.moveToElementText(m(n.indexes));offset=n.offset;if(offset!==o){p.collapse(n.inside||q);p.moveStart("character",q?-offset:offset)}else{p.collapse(r)}j.setEndPoint(r?"StartToStart":"EndToStart",p);if(r){j.collapse(true)}}}if(k.start){if(k.start.ctrl){j=i.createControlRange();j.addElement(m(k.start.indexes));j.select()}else{j=i.createTextRange();l(true);l();j.select()}}};this.addRange=function(i){var n,l,k,p,v,q,t,s=d.dom.doc,m=s.body,r,u;function j(C){var y,B,x,A,z;x=h.create("a");y=C?k:v;B=C?p:q;A=n.duplicate();if(y==s||y==s.documentElement){y=m;B=0}if(y.nodeType==3){y.parentNode.insertBefore(x,y);A.moveToElementText(x);A.moveStart("character",B);h.remove(x);n.setEndPoint(C?"StartToStart":"EndToEnd",A)}else{z=y.childNodes;if(z.length){if(B>=z.length){h.insertAfter(x,z[z.length-1])}else{y.insertBefore(x,z[B])}A.moveToElementText(x)}else{if(y.canHaveHTML){y.innerHTML="\uFEFF";x=y.firstChild;A.moveToElementText(x);A.collapse(f)}}n.setEndPoint(C?"StartToStart":"EndToEnd",A);h.remove(x)}}k=i.startContainer;p=i.startOffset;v=i.endContainer;q=i.endOffset;n=m.createTextRange();if(k==v&&k.nodeType==1){if(p==q&&!k.hasChildNodes()){if(k.canHaveHTML){t=k.previousSibling;if(t&&!t.hasChildNodes()&&h.isBlock(t)){t.innerHTML="\uFEFF"}else{t=null}k.innerHTML="\uFEFF\uFEFF";n.moveToElementText(k.lastChild);n.select();h.doc.selection.clear();k.innerHTML="";if(t){t.innerHTML=""}return}else{p=h.nodeIndex(k);k=k.parentNode}}if(p==q-1){try{u=k.childNodes[p];l=m.createControlRange();l.addElement(u);l.select();r=d.getRng();if(r.item&&u===r.item(0)){return}}catch(o){}}}j(true);j();n.select()};this.getRangeAt=g}tinymce.dom.TridentSelection=a})();(function(){var n=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i="sizcache",o=0,r=Object.prototype.toString,h=false,g=true,q=/\\/g,u=/\r\n/g,x=/\W/;[0,0].sort(function(){g=false;return 0});var d=function(C,e,F,G){F=F||[];e=e||document;var I=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!C||typeof C!=="string"){return F}var z,K,N,y,J,M,L,E,B=true,A=d.isXML(e),D=[],H=C;do{n.exec("");z=n.exec(H);if(z){H=z[3];D.push(z[1]);if(z[2]){y=z[3];break}}}while(z);if(D.length>1&&j.exec(C)){if(D.length===2&&k.relative[D[0]]){K=s(D[0]+D[1],e,G)}else{K=k.relative[D[0]]?[e]:d(D.shift(),e);while(D.length){C=D.shift();if(k.relative[C]){C+=D.shift()}K=s(C,K,G)}}}else{if(!G&&D.length>1&&e.nodeType===9&&!A&&k.match.ID.test(D[0])&&!k.match.ID.test(D[D.length-1])){J=d.find(D.shift(),e,A);e=J.expr?d.filter(J.expr,J.set)[0]:J.set[0]}if(e){J=G?{expr:D.pop(),set:l(G)}:d.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&e.parentNode?e.parentNode:e,A);K=J.expr?d.filter(J.expr,J.set):J.set;if(D.length>0){N=l(K)}else{B=false}while(D.length){M=D.pop();L=M;if(!k.relative[M]){M=""}else{L=D.pop()}if(L==null){L=e}k.relative[M](N,L,A)}}else{N=D=[]}}if(!N){N=K}if(!N){d.error(M||C)}if(r.call(N)==="[object Array]"){if(!B){F.push.apply(F,N)}else{if(e&&e.nodeType===1){for(E=0;N[E]!=null;E++){if(N[E]&&(N[E]===true||N[E].nodeType===1&&d.contains(e,N[E]))){F.push(K[E])}}}else{for(E=0;N[E]!=null;E++){if(N[E]&&N[E].nodeType===1){F.push(K[E])}}}}}else{l(N,F)}if(y){d(y,I,F,G);d.uniqueSort(F)}return F};d.uniqueSort=function(y){if(p){h=g;y.sort(p);if(h){for(var e=1;e0};d.find=function(E,e,F){var D,z,B,A,C,y;if(!E){return[]}for(z=0,B=k.order.length;z":function(D,y){var C,B=typeof y==="string",z=0,e=D.length;if(B&&!x.test(y)){y=y.toLowerCase();for(;z=0)){if(!z){e.push(C)}}else{if(z){y[B]=false}}}}return false},ID:function(e){return e[1].replace(q,"")},TAG:function(y,e){return y[1].replace(q,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){d.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var y=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(y[1]+(y[2]||1))-0;e[3]=y[3]-0}else{if(e[2]){d.error(e[0])}}e[0]=o++;return e},ATTR:function(B,y,z,e,C,D){var A=B[1]=B[1].replace(q,"");if(!D&&k.attrMap[A]){B[1]=k.attrMap[A]}B[4]=(B[4]||B[5]||"").replace(q,"");if(B[2]==="~="){B[4]=" "+B[4]+" "}return B},PSEUDO:function(B,y,z,e,C){if(B[1]==="not"){if((n.exec(B[3])||"").length>1||/^\w/.test(B[3])){B[3]=d(B[3],null,null,y)}else{var A=d.filter(B[3],y,z,true^C);if(!z){e.push.apply(e,A)}return false}}else{if(k.match.POS.test(B[0])||k.match.CHILD.test(B[0])){return true}}return B},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(z,y,e){return !!d(e[3],z).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(z){var e=z.getAttribute("type"),y=z.type;return z.nodeName.toLowerCase()==="input"&&"text"===y&&(e===y||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(y){var e=y.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===y.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(y){var e=y.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===y.type},button:function(y){var e=y.nodeName.toLowerCase();return e==="input"&&"button"===y.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(y,e){return e===0},last:function(z,y,e,A){return y===A.length-1},even:function(y,e){return e%2===0},odd:function(y,e){return e%2===1},lt:function(z,y,e){return ye[3]-0},nth:function(z,y,e){return e[3]-0===y},eq:function(z,y,e){return e[3]-0===y}},filter:{PSEUDO:function(z,E,D,F){var e=E[1],y=k.filters[e];if(y){return y(z,D,E,F)}else{if(e==="contains"){return(z.textContent||z.innerText||b([z])||"").indexOf(E[3])>=0}else{if(e==="not"){var A=E[3];for(var C=0,B=A.length;C=0)}}},ID:function(y,e){return y.nodeType===1&&y.getAttribute("id")===e},TAG:function(y,e){return(e==="*"&&y.nodeType===1)||!!y.nodeName&&y.nodeName.toLowerCase()===e},CLASS:function(y,e){return(" "+(y.className||y.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(C,A){var z=A[1],e=d.attr?d.attr(C,z):k.attrHandle[z]?k.attrHandle[z](C):C[z]!=null?C[z]:C.getAttribute(z),D=e+"",B=A[2],y=A[4];return e==null?B==="!=":!B&&d.attr?e!=null:B==="="?D===y:B==="*="?D.indexOf(y)>=0:B==="~="?(" "+D+" ").indexOf(y)>=0:!y?D&&e!==false:B==="!="?D!==y:B==="^="?D.indexOf(y)===0:B==="$="?D.substr(D.length-y.length)===y:B==="|="?D===y||D.substr(0,y.length+1)===y+"-":false},POS:function(B,y,z,C){var e=y[2],A=k.setFilters[e];if(A){return A(B,z,y,C)}}}};var j=k.match.POS,c=function(y,e){return"\\"+(e-0+1)};for(var f in k.match){k.match[f]=new RegExp(k.match[f].source+(/(?![^\[]*\])(?![^\(]*\))/.source));k.leftMatch[f]=new RegExp(/(^(?:.|\r|\n)*?)/.source+k.match[f].source.replace(/\\(\d+)/g,c))}k.match.globalPOS=j;var l=function(y,e){y=Array.prototype.slice.call(y,0);if(e){e.push.apply(e,y);return e}return y};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(v){l=function(B,A){var z=0,y=A||[];if(r.call(B)==="[object Array]"){Array.prototype.push.apply(y,B)}else{if(typeof B.length==="number"){for(var e=B.length;z";e.insertBefore(y,e.firstChild);if(document.getElementById(z)){k.find.ID=function(B,C,D){if(typeof C.getElementById!=="undefined"&&!D){var A=C.getElementById(B[1]);return A?A.id===B[1]||typeof A.getAttributeNode!=="undefined"&&A.getAttributeNode("id").nodeValue===B[1]?[A]:undefined:[]}};k.filter.ID=function(C,A){var B=typeof C.getAttributeNode!=="undefined"&&C.getAttributeNode("id");return C.nodeType===1&&B&&B.nodeValue===A}}e.removeChild(y);e=y=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){k.find.TAG=function(y,C){var B=C.getElementsByTagName(y[1]);if(y[1]==="*"){var A=[];for(var z=0;B[z];z++){if(B[z].nodeType===1){A.push(B[z])}}B=A}return B}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){k.attrHandle.href=function(y){return y.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=d,A=document.createElement("div"),z="__sizzle__";A.innerHTML="

";if(A.querySelectorAll&&A.querySelectorAll(".TEST").length===0){return}d=function(L,C,G,K){C=C||document;if(!K&&!d.isXML(C)){var J=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(L);if(J&&(C.nodeType===1||C.nodeType===9)){if(J[1]){return l(C.getElementsByTagName(L),G)}else{if(J[2]&&k.find.CLASS&&C.getElementsByClassName){return l(C.getElementsByClassName(J[2]),G)}}}if(C.nodeType===9){if(L==="body"&&C.body){return l([C.body],G)}else{if(J&&J[3]){var F=C.getElementById(J[3]);if(F&&F.parentNode){if(F.id===J[3]){return l([F],G)}}else{return l([],G)}}}try{return l(C.querySelectorAll(L),G)}catch(H){}}else{if(C.nodeType===1&&C.nodeName.toLowerCase()!=="object"){var D=C,E=C.getAttribute("id"),B=E||z,N=C.parentNode,M=/^\s*[+~]/.test(L);if(!E){C.setAttribute("id",B)}else{B=B.replace(/'/g,"\\$&")}if(M&&N){C=C.parentNode}try{if(!M||N){return l(C.querySelectorAll("[id='"+B+"'] "+L),G)}}catch(I){}finally{if(!E){D.removeAttribute("id")}}}}}return e(L,C,G,K)};for(var y in e){d[y]=e[y]}A=null})()}(function(){var e=document.documentElement,z=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(z){var B=!z.call(document.createElement("div"),"div"),y=false;try{z.call(document.documentElement,"[test!='']:sizzle")}catch(A){y=true}d.matchesSelector=function(D,F){F=F.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!d.isXML(D)){try{if(y||!k.match.PSEUDO.test(F)&&!/!=/.test(F)){var C=z.call(D,F);if(C||!B||D.document&&D.document.nodeType!==11){return C}}}catch(E){}}return d(F,null,null,[D]).length>0}}})();(function(){var e=document.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}k.order.splice(1,0,"CLASS");k.find.CLASS=function(y,z,A){if(typeof z.getElementsByClassName!=="undefined"&&!A){return z.getElementsByClassName(y[1])}};e=null})();function a(y,D,C,G,E,F){for(var A=0,z=G.length;A0){B=e;break}}}e=e[y]}G[A]=B}}}if(document.documentElement.contains){d.contains=function(y,e){return y!==e&&(y.contains?y.contains(e):true)}}else{if(document.documentElement.compareDocumentPosition){d.contains=function(y,e){return !!(y.compareDocumentPosition(e)&16)}}else{d.contains=function(){return false}}}d.isXML=function(e){var y=(e?e.ownerDocument||e:0).documentElement;return y?y.nodeName!=="HTML":false};var s=function(z,e,D){var C,E=[],B="",F=e.nodeType?[e]:e;while((C=k.match.PSEUDO.exec(z))){B+=C[0];z=z.replace(k.match.PSEUDO,"")}z=k.relative[z]?z+"*":z;for(var A=0,y=F.length;A"+(i.item?i.item(0).outerHTML:i.htmlText);m.removeChild(m.firstChild)}else{m.innerHTML=i.toString()}}if(/^\s/.test(m.innerHTML)){j=" "}if(/\s+$/.test(m.innerHTML)){l=" "}h.getInner=true;h.content=g.isCollapsed()?"":j+g.serializer.serialize(m,h)+l;g.onGetContent.dispatch(g,h);return h.content},setContent:function(h,j){var o=this,g=o.getRng(),k,l=o.win.document,n,m;j=j||{format:"html"};j.set=true;h=j.content=h;if(!j.no_events){o.onBeforeSetContent.dispatch(o,j)}h=j.content;if(g.insertNode){h+='_';if(g.startContainer==l&&g.endContainer==l){l.body.innerHTML=h}else{g.deleteContents();if(l.body.childNodes.length===0){l.body.innerHTML=h}else{if(g.createContextualFragment){g.insertNode(g.createContextualFragment(h))}else{n=l.createDocumentFragment();m=l.createElement("div");n.appendChild(m);m.outerHTML=h;g.insertNode(n)}}}k=o.dom.get("__caret");g=l.createRange();g.setStartBefore(k);g.setEndBefore(k);o.setRng(g);o.dom.remove("__caret");try{o.setRng(g)}catch(i){}}else{if(g.item){l.execCommand("Delete",false,null);g=o.getRng()}if(/^\s+/.test(h)){g.pasteHTML('_'+h);o.dom.remove("__mce_tmp")}else{g.pasteHTML(h)}}if(!j.no_events){o.onSetContent.dispatch(o,j)}},getStart:function(){var i=this,h=i.getRng(),j,g,l,k;if(h.duplicate||h.item){if(h.item){return h.item(0)}l=h.duplicate();l.collapse(1);j=l.parentElement();if(j.ownerDocument!==i.dom.doc){j=i.dom.getRoot()}g=k=h.parentElement();while(k=k.parentNode){if(k==j){j=g;break}}return j}else{j=h.startContainer;if(j.nodeType==1&&j.hasChildNodes()){j=j.childNodes[Math.min(j.childNodes.length-1,h.startOffset)]}if(j&&j.nodeType==3){return j.parentNode}return j}},getEnd:function(){var h=this,g=h.getRng(),j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}g=g.duplicate();g.collapse(0);j=g.parentElement();if(j.ownerDocument!==h.dom.doc){j=h.dom.getRoot()}if(j&&j.nodeName=="BODY"){return j.lastChild||j}return j}else{j=g.endContainer;i=g.endOffset;if(j.nodeType==1&&j.hasChildNodes()){j=j.childNodes[i>0?i-1:i]}if(j&&j.nodeType==3){return j.parentNode}return j}},getBookmark:function(s,v){var y=this,n=y.dom,h,k,j,o,i,p,q,m="\uFEFF",x;function g(z,A){var t=0;e(n.select(z),function(C,B){if(C==A){t=B}});return t}function u(t){function z(E){var A,D,C,B=E?"start":"end";A=t[B+"Container"];D=t[B+"Offset"];if(A.nodeType==1&&A.nodeName=="TR"){C=A.childNodes;A=C[Math.min(E?D:D-1,C.length-1)];if(A){D=E?0:A.childNodes.length;t["set"+(E?"Start":"End")](A,D)}}}z(true);z();return t}function l(){var z=y.getRng(true),t=n.getRoot(),A={};function B(E,J){var D=E[J?"startContainer":"endContainer"],I=E[J?"startOffset":"endOffset"],C=[],F,H,G=0;if(D.nodeType==3){if(v){for(F=D.previousSibling;F&&F.nodeType==3;F=F.previousSibling){I+=F.nodeValue.length}}C.push(I)}else{H=D.childNodes;if(I>=H.length&&H.length){G=1;I=Math.max(0,H.length-1)}C.push(y.dom.nodeIndex(H[I],v)+G)}for(;D&&D!=t;D=D.parentNode){C.push(y.dom.nodeIndex(D,v))}return C}A.start=B(z,true);if(!y.isCollapsed()){A.end=B(z)}return A}if(s==2){if(y.tridentSel){return y.tridentSel.getBookmark(s)}return l()}if(s){h=y.getRng();if(h.setStart){h={startContainer:h.startContainer,startOffset:h.startOffset,endContainer:h.endContainer,endOffset:h.endOffset}}return{rng:h}}h=y.getRng();j=n.uniqueId();o=tinyMCE.activeEditor.selection.isCollapsed();x="overflow:hidden;line-height:0px";if(h.duplicate||h.item){if(!h.item){k=h.duplicate();try{h.collapse();h.pasteHTML(''+m+"");if(!o){k.collapse(false);h.moveToElementText(k.parentElement());if(h.compareEndPoints("StartToEnd",k)===0){k.move("character",-1)}k.pasteHTML(''+m+"")}}catch(r){return null}}else{p=h.item(0);i=p.nodeName;return{name:i,index:g(i,p)}}}else{p=y.getNode();i=p.nodeName;if(i=="IMG"){return{name:i,index:g(i,p)}}k=u(h.cloneRange());if(!o){k.collapse(false);k.insertNode(n.create("span",{"data-mce-type":"bookmark",id:j+"_end",style:x},m))}h=u(h);h.collapse(true);h.insertNode(n.create("span",{"data-mce-type":"bookmark",id:j+"_start",style:x},m))}y.moveToBookmark({id:j,keep:1});return{id:j}},moveToBookmark:function(q){var v=this,n=v.dom,l,j,g,i,u,k,x,r,s;function h(C){var t=q[C?"start":"end"],z,A,B,y;if(t){B=t[0];for(A=u,z=t.length-1;z>=1;z--){y=A.childNodes;if(t[z]>y.length-1){return}A=y[t[z]]}if(A.nodeType===3){B=Math.min(t[0],A.nodeValue.length)}if(A.nodeType===1){B=Math.min(t[0],A.childNodes.length)}if(C){g.setStart(A,B)}else{g.setEnd(A,B)}}return true}function m(D){var y=n.get(q.id+"_"+D),C,t,A,B,z=q.keep;if(y){C=y.parentNode;if(D=="start"){if(!z){t=n.nodeIndex(y)}else{C=y.firstChild;t=1}k=x=C;r=s=t}else{if(!z){t=n.nodeIndex(y)}else{C=y.firstChild;t=1}x=C;s=t}if(!z){B=y.previousSibling;A=y.nextSibling;e(d.grep(y.childNodes),function(E){if(E.nodeType==3){E.nodeValue=E.nodeValue.replace(/\uFEFF/g,"")}});while(y=n.get(q.id+"_"+D)){n.remove(y,1)}if(B&&A&&B.nodeType==A.nodeType&&B.nodeType==3&&!d.isOpera){t=B.nodeValue.length;B.appendData(A.nodeValue);n.remove(A);if(D=="start"){k=x=B;r=s=t}else{x=B;s=t}}}}}function o(t){if(n.isBlock(t)&&!t.innerHTML&&!b){t.innerHTML='
'}return t}if(q){if(q.start){g=n.createRng();u=n.getRoot();if(v.tridentSel){return v.tridentSel.moveToBookmark(q)}if(h(true)&&h()){v.setRng(g)}}else{if(q.id){m("start");m("end");if(k){g=n.createRng();g.setStart(o(k),r);g.setEnd(o(x),s);v.setRng(g)}}else{if(q.name){v.select(n.select(q.name)[q.index])}else{if(q.rng){g=q.rng;if(g.startContainer){i=v.dom.createRng();try{i.setStart(g.startContainer,g.startOffset);i.setEnd(g.endContainer,g.endOffset)}catch(p){}g=i}v.setRng(g)}}}}}},select:function(l,k){var j=this,m=j.dom,h=m.createRng(),g;function i(n,p){var o=new a(n,n);do{if(n.nodeType==3&&d.trim(n.nodeValue).length!==0){if(p){h.setStart(n,0)}else{h.setEnd(n,n.nodeValue.length)}return}if(n.nodeName=="BR"){if(p){h.setStartBefore(n)}else{h.setEndBefore(n)}return}}while(n=(p?o.next():o.prev()))}if(l){g=m.nodeIndex(l);h.setStart(l.parentNode,g);h.setEnd(l.parentNode,g+1);if(k){i(l,1);i(l)}j.setRng(h)}return l},isCollapsed:function(){var g=this,i=g.getRng(),h=g.getSel();if(!i||i.item){return false}if(i.compareEndPoints){return i.compareEndPoints("StartToEnd",i)===0}return !h||i.collapsed},collapse:function(g){var i=this,h=i.getRng(),j;if(h.item){j=h.item(0);h=i.win.document.body.createTextRange();h.moveToElementText(j)}h.collapse(!!g);i.setRng(h)},getSel:function(){var h=this,g=this.win;return g.getSelection?g.getSelection():g.document.selection},getRng:function(m){var h=this,j,g,l,k=h.win.document;if(m&&h.tridentSel){return h.tridentSel.getRangeAt(0)}try{if(j=h.getSel()){g=j.rangeCount>0?j.getRangeAt(0):(j.createRange?j.createRange():k.createRange())}}catch(i){}if(d.isIE&&!d.isIE11&&g&&g.setStart&&k.selection.createRange().item){l=k.selection.createRange().item(0);g=k.createRange();g.setStartBefore(l);g.setEndAfter(l)}if(!g){g=k.createRange?k.createRange():k.body.createTextRange()}if(g.setStart&&g.startContainer.nodeType===9&&g.collapsed){l=h.dom.getRoot();g.setStart(l,0);g.setEnd(l,0)}if(h.selectedRange&&h.explicitRange){if(g.compareBoundaryPoints(g.START_TO_START,h.selectedRange)===0&&g.compareBoundaryPoints(g.END_TO_END,h.selectedRange)===0){g=h.explicitRange}else{h.selectedRange=null;h.explicitRange=null}}return g},setRng:function(k,g){var j,i=this;if(!i.tridentSel){j=i.getSel();if(j){i.explicitRange=k;try{j.removeAllRanges()}catch(h){}j.addRange(k);if(g===false&&j.extend){j.collapse(k.endContainer,k.endOffset);j.extend(k.startContainer,k.startOffset)}i.selectedRange=j.rangeCount>0?j.getRangeAt(0):null}}else{if(k.cloneRange){try{i.tridentSel.addRange(k);return}catch(h){}}try{k.select()}catch(h){}}},setNode:function(h){var g=this;g.setContent(g.dom.getOuterHTML(h));return h},getNode:function(){var i=this,h=i.getRng(),j=i.getSel(),m,l=h.startContainer,g=h.endContainer;function k(q,o){var p=q;while(q&&q.nodeType===3&&q.length===0){q=o?q.nextSibling:q.previousSibling}return q||p}if(!h){return i.dom.getRoot()}if(h.setStart){m=h.commonAncestorContainer;if(!h.collapsed){if(h.startContainer==h.endContainer){if(h.endOffset-h.startOffset<2){if(h.startContainer.hasChildNodes()){m=h.startContainer.childNodes[h.startOffset]}}}if(l.nodeType===3&&g.nodeType===3){if(l.length===h.startOffset){l=k(l.nextSibling,true)}else{l=l.parentNode}if(h.endOffset===0){g=k(g.previousSibling,false)}else{g=g.parentNode}if(l&&l===g){return l}}}if(m&&m.nodeType==3){return m.parentNode}return m}return h.item?h.item(0):h.parentElement()},getSelectedBlocks:function(p,h){var o=this,k=o.dom,m,l,i,j=[];m=k.getParent(p||o.getStart(),k.isBlock);l=k.getParent(h||o.getEnd(),k.isBlock);if(m){j.push(m)}if(m&&l&&m!=l){i=m;var g=new a(m,k.getRoot());while((i=g.next())&&i!=l){if(k.isBlock(i)){j.push(i)}}}if(l&&m!=l){j.push(l)}return j},isForward:function(){var i=this.dom,g=this.getSel(),j,h;if(!g||g.anchorNode==null||g.focusNode==null){return true}j=i.createRng();j.setStart(g.anchorNode,g.anchorOffset);j.collapse(true);h=i.createRng();h.setStart(g.focusNode,g.focusOffset);h.collapse(true);return j.compareBoundaryPoints(j.START_TO_START,h)<=0},normalize:function(){var h=this,g,m,l,j,i;function k(p){var o,r,n,s=h.dom,u=s.getRoot(),q,t,v;function y(z,A){var B=new a(z,s.getParent(z.parentNode,s.isBlock)||u);while(z=B[A?"prev":"next"]()){if(z.nodeName==="BR"){return true}}}function x(B,z){var C,A;z=z||o;C=new a(z,s.getParent(z.parentNode,s.isBlock)||u);while(q=C[B?"prev":"next"]()){if(q.nodeType===3&&q.nodeValue.length>0){o=q;r=B?q.nodeValue.length:0;m=true;return}if(s.isBlock(q)||t[q.nodeName.toLowerCase()]){return}A=q}if(l&&A){o=A;m=true;r=0}}o=g[(p?"start":"end")+"Container"];r=g[(p?"start":"end")+"Offset"];t=s.schema.getNonEmptyElements();if(o.nodeType===9){o=s.getRoot();r=0}if(o===u){if(p){q=o.childNodes[r>0?r-1:0];if(q){v=q.nodeName.toLowerCase();if(t[q.nodeName]||q.nodeName=="TABLE"){return}}}if(o.hasChildNodes()){o=o.childNodes[Math.min(!p&&r>0?r-1:r,o.childNodes.length-1)];r=0;if(o.hasChildNodes()&&!/TABLE/.test(o.nodeName)){q=o;n=new a(o,u);do{if(q.nodeType===3&&q.nodeValue.length>0){r=p?0:q.nodeValue.length;o=q;m=true;break}if(t[q.nodeName.toLowerCase()]){r=s.nodeIndex(q);o=q.parentNode;if(q.nodeName=="IMG"&&!p){r++}m=true;break}}while(q=(p?n.next():n.prev()))}}}if(l){if(o.nodeType===3&&r===0){x(true)}if(o.nodeType===1){q=o.childNodes[r];if(q&&q.nodeName==="BR"&&!y(q)&&!y(q,true)){x(true,o.childNodes[r])}}}if(p&&!l&&o.nodeType===3&&r===o.nodeValue.length){x(false)}if(m){g["set"+(p?"Start":"End")](o,r)}}if(d.isIE){return}g=h.getRng();l=g.collapsed;k(true);if(!l){k()}if(m){if(l){g.collapse(true)}h.setRng(g,h.isForward())}},selectorChanged:function(g,j){var h=this,i;if(!h.selectorChangedData){h.selectorChangedData={};i={};h.editor.onNodeChange.addToTop(function(l,k,o){var p=h.dom,m=p.getParents(o,null,p.getRoot()),n={};e(h.selectorChangedData,function(r,q){e(m,function(s){if(p.is(s,q)){if(!i[q]){e(r,function(t){t(true,{node:s,selector:q,parents:m})});i[q]=r}n[q]=r;return false}})});e(i,function(r,q){if(!n[q]){delete i[q];e(r,function(s){s(false,{node:o,selector:q,parents:m})})}})})}if(!h.selectorChangedData[g]){h.selectorChangedData[g]=[]}h.selectorChangedData[g].push(j);return h},scrollIntoView:function(k){var j,h,g=this,i=g.dom;h=i.getViewPort(g.editor.getWin());j=i.getPos(k).y;if(jh.y+h.h){g.editor.getWin().scrollTo(0,j0){p.setEndPoint("StartToStart",o)}else{p.setEndPoint("EndToEnd",o)}p.select()}}else{l()}}function l(){var p=n.selection.createRange();if(o&&!p.item&&p.compareEndPoints("StartToEnd",p)===0){o.select()}h.unbind(n,"mouseup",l);h.unbind(n,"mousemove",m);o=k=0}n.documentElement.unselectable=true;h.bind(n,["mousedown","contextmenu"],function(p){if(p.target.nodeName==="HTML"){if(k){l()}g=n.documentElement;if(g.scrollHeight>g.clientHeight){return}k=1;o=j(p.x,p.y);if(o){h.bind(n,"mouseup",l);h.bind(n,"mousemove",m);h.win.focus();o.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";e.remove_trailing_brs="remove_trailing_brs" in e?e.remove_trailing_brs:true;h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/(?:^|\s)mce(Item\w+|Selected)(?!\S)/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addAttributeFilter("data-mce-expando",function(j,l,k){var m=j.length;while(m--){j[m].attr(l,null)}});c.addNodeFilter("noscript",function(j){var k=j.length,l;while(k--){l=j[k].firstChild;if(l){l.value=a.html.Entities.decode(l.value)}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// "}}else{if(o.length>0){n.firstChild.value=""}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select,map").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(a.trim(m.getInner?o.innerHTML:i.getOuterHTML(o)),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],e={},d=[],g=0,f;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=document.createElement("script");s.id=n;s.type="text/javascript";s.src=a._addVer(m);if(!a.isIE||a.isIE11){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==f){j.push(m);l[m]=c}if(q){if(!e[m]){e[m]=[]}e[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(e[r],function(s){s.func.call(s.scope)});e[r]=f}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,s){var i=d.startContainer,l=d.startOffset,t=d.endContainer,m=d.endOffset,j,g,o,h,r,q,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(u){s([u])});return}function f(u){var v;v=u[0];if(v.nodeType===3&&v===i&&l>=v.nodeValue.length){u.splice(0,1)}v=u[u.length-1];if(m===0&&u.length>0&&v===t&&v.nodeType===3){u.splice(u.length-1,1)}return u}function p(x,v,u){var y=[];for(;x&&x!=u;x=x[v]){y.push(x)}return y}function n(v,u){do{if(v.parentNode==u){return v}v=v.parentNode}while(v)}function k(x,v,y){var u=y?"nextSibling":"previousSibling";for(h=x,r=h.parentNode;h&&h!=v;h=r){r=h.parentNode;q=p(h==x?h:h[u],u);if(q.length){if(!y){q.reverse()}s(f(q))}}}if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[l]}if(t.nodeType==1&&t.hasChildNodes()){t=t.childNodes[Math.min(m-1,t.childNodes.length-1)]}if(i==t){return s(f([i]))}j=c.findCommonAncestor(i,t);for(h=i;h;h=h.parentNode){if(h===t){return k(i,j,true)}if(h===j){break}}for(h=t;h;h=h.parentNode){if(h===i){return k(t,j)}if(h===j){break}}g=n(i,j)||i;o=n(t,j)||t;k(i,g,true);q=p(g==i?g:g.nextSibling,"nextSibling",o==t?o.nextSibling:o);if(q.length){s(f(q))}k(t,o)};this.split=function(e){var h=e.startContainer,d=e.startOffset,i=e.endContainer,g=e.endOffset;function f(j,k){return j.splitText(k)}if(h==i&&h.nodeType==3){if(d>0&&dd){g=g-d;h=i=f(i,g).previousSibling;g=i.nodeValue.length;d=0}else{g=0}}}else{if(h.nodeType==3&&d>0&&d0&&g=m.length){r=0}}t=m[r];f.setAttrib(g,"tabindex","-1");f.setAttrib(t.id,"tabindex","0");f.get(t.id).focus();if(e.actOnFocus){e.onAction(t.id)}if(s){a.cancel(s)}};p=function(z){var v=37,u=39,y=38,A=40,r=27,t=14,s=13,x=32;switch(z.keyCode){case v:if(i){q.moveFocus(-1)}a.cancel(z);break;case u:if(i){q.moveFocus(1)}a.cancel(z);break;case y:if(o){q.moveFocus(-1)}a.cancel(z);break;case A:if(o){q.moveFocus(1)}a.cancel(z);break;case r:if(e.onCancel){e.onCancel();a.cancel(z)}break;case t:case s:case x:if(e.onAction){e.onAction(g);a.cancel(z)}break}};c(m,function(t,r){var s,u;if(!t.id){t.id=f.uniqueId("_mce_item_")}u=f.get(t.id);if(l){f.bind(u,"blur",h);s="-1"}else{s=(r===0?"0":"-1")}u.setAttribute("tabindex",s);f.bind(u,"focus",k)});if(m[0]){g=m[0].id}f.setAttrib(n,"tabindex","-1");var j=f.get(n);f.bind(j,"focus",d);f.bind(j,"keydown",p)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.offsetWidth,j.max_width):g.offsetWidth;k=j.max_height?Math.min(g.offsetHeight,j.max_height):g.offsetHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeightv){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return false}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.get("menu_"+g.id);h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){if(typeof h.settings.style=="function"){h.settings.style=h.settings.style()}c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='';if(e.image&&!(this.editor&&this.editor.forcedHighContrastMode)){d+=''+a.encode(e.title)+''+(c?''+c+"":"")}else{d+=''+(c?''+c+"":"")}d+='";d+="";return d},postRender:function(){var d=this,e=d.settings,c;if(b.isIE&&d.editor){b.dom.Event.add(d.id,"mousedown",function(f){var g=d.editor.selection.getNode().nodeName;c=g==="IMG"?d.editor.selection.getBookmark():null})}b.dom.Event.add(d.id,"click",function(f){if(!d.isDisabled()){if(b.isIE&&d.editor&&c!==null){d.editor.selection.moveToBookmark(c)}return e.onclick.call(e.scope,f)}});b.dom.Event.add(d.id,"keydown",function(f){if(!d.isDisabled()&&f.keyCode==b.VK.SPACEBAR){b.dom.Event.cancel(f);return e.onclick.call(e.scope,f)}})}})})(tinymce);(function(e){var d=e.DOM,b=e.dom.Event,f=e.each,a=e.util.Dispatcher,c;e.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(j,i,g){var h=this;h.parent(j,i,g);h.items=[];h.onChange=new a(h);h.onPostRender=new a(h);h.onAdd=new a(h);h.onRenderMenu=new e.util.Dispatcher(this);h.classPrefix="mceListBox";h.marked={}},select:function(h){var g=this,j,i;g.marked={};if(h==c){return g.selectByIndex(-1)}if(h&&typeof(h)=="function"){i=h}else{i=function(k){return k==h}}if(h!=g.selectedValue){f(g.items,function(l,k){if(i(l.value)){j=1;g.selectByIndex(k);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(g){var i=this,j,k,h;i.marked={};if(g!=i.selectedIndex){j=d.get(i.id+"_text");h=d.get(i.id+"_voiceDesc");k=i.items[g];if(k){i.selectedValue=k.value;i.selectedIndex=g;d.setHTML(j,d.encode(k.title));d.setHTML(h,i.settings.title+" - "+k.title);d.removeClass(j,"mceTitle");d.setAttrib(i.id,"aria-valuenow",k.title)}else{d.setHTML(j,d.encode(i.settings.title));d.setHTML(h,d.encode(i.settings.title));d.addClass(j,"mceTitle");i.selectedValue=i.selectedIndex=null;d.setAttrib(i.id,"aria-valuenow",i.settings.title)}j=0}},mark:function(g){this.marked[g]=true},add:function(j,g,i){var h=this;i=i||{};i=e.extend(i,{title:j,value:g});h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var j="",g=this,i=g.settings,k=g.classPrefix;j='';j+="";j+="";j+="";return j},showMenu:function(){var h=this,j,i=d.get(this.id),g;if(h.isDisabled()||h.items.length===0){return}if(h.menu&&h.menu.isMenuVisible){return h.hideMenu()}if(!h.isMenuRendered){h.renderMenu();h.isMenuRendered=true}j=d.getPos(i);g=h.menu;g.settings.offset_x=j.x;g.settings.offset_y=j.y;g.settings.keyboard_focus=!e.isOpera;f(h.items,function(k){if(g.items[k.id]){g.items[k.id].setSelected(0)}});f(h.items,function(k){if(g.items[k.id]&&h.marked[k.value]){g.items[k.id].setSelected(1)}if(k.value===h.selectedValue){g.items[k.id].setSelected(1)}});g.showMenu(0,i.clientHeight);b.add(d.doc,"mousedown",h.hideMenu,h);d.addClass(h.id,h.classPrefix+"Selected")},hideMenu:function(h){var g=this;if(g.menu&&g.menu.isMenuVisible){d.removeClass(g.id,g.classPrefix+"Selected");if(h&&h.type=="mousedown"&&(h.target.id==g.id+"_text"||h.target.id==g.id+"_open")){return}if(!h||!d.getParent(h.target,".mceMenu")){d.removeClass(g.id,g.classPrefix+"Selected");b.remove(d.doc,"mousedown",g.hideMenu,g);g.menu.hideMenu()}}},renderMenu:function(){var h=this,g;g=h.settings.control_manager.createDropMenu(h.id+"_menu",{menu_line:1,"class":h.classPrefix+"Menu mceNoIcons",max_width:250,max_height:150});g.onHideMenu.add(function(){h.hideMenu();h.focus()});g.add({title:h.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(h.settings.onselect("")!==false){h.select("")}}});f(h.items,function(i){if(i.value===c){g.add({title:i.title,role:"option","class":"mceMenuItemTitle",onclick:function(){if(h.settings.onselect("")!==false){h.select("")}}})}else{i.id=d.uniqueId();i.role="option";i.onclick=function(){if(h.settings.onselect(i.value)!==false){h.select(i.value)}};g.add(i)}});h.onRenderMenu.dispatch(h,g);h.menu=g},postRender:function(){var g=this,h=g.classPrefix;b.add(g.id,"click",g.showMenu,g);b.add(g.id,"keydown",function(i){if(i.keyCode==32){g.showMenu(i);b.cancel(i)}});b.add(g.id,"focus",function(){if(!g._focused){g.keyDownHandler=b.add(g.id,"keydown",function(i){if(i.keyCode==40){g.showMenu();b.cancel(i)}});g.keyPressHandler=b.add(g.id,"keypress",function(j){var i;if(j.keyCode==13){i=g.selectedValue;g.selectedValue=null;b.cancel(j);g.settings.onselect(i)}})}g._focused=1});b.add(g.id,"blur",function(){b.remove(g.id,"keydown",g.keyDownHandler);b.remove(g.id,"keypress",g.keyPressHandler);g._focused=0});if(e.isIE6||!d.boxModel){b.add(g.id,"mouseover",function(){if(!d.hasClass(g.id,h+"Disabled")){d.addClass(g.id,h+"Hover")}});b.add(g.id,"mouseout",function(){if(!d.hasClass(g.id,h+"Disabled")){d.removeClass(g.id,h+"Hover")}})}g.onPostRender.dispatch(g,d.get(g.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(e){var d=e.DOM,b=e.dom.Event,f=e.each,a=e.util.Dispatcher,c;e.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(h,g){this.parent(h,g);this.classPrefix="mceNativeListBox"},setDisabled:function(g){d.get(this.id).disabled=g;this.setAriaProperty("disabled",g)},isDisabled:function(){return d.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==c){return g.selectByIndex(-1)}if(h&&typeof(h)=="function"){i=h}else{i=function(k){return k==h}}if(h!=g.selectedValue){f(g.items,function(l,k){if(i(l.value)){j=1;g.selectByIndex(k);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(g){d.get(this.id).selectedIndex=g+1;this.selectedValue=this.items[g]?this.items[g].value:null},add:function(k,h,g){var j,i=this;g=g||{};g.value=h;if(i.isRendered()){d.add(d.get(this.id),"option",g,k)}j={title:k,value:h,attribs:g};i.items.push(j);i.onAdd.dispatch(i,j)},getLength:function(){return this.items.length},renderHTML:function(){var i,g=this;i=d.createHTML("option",{value:""},"-- "+g.settings.title+" --");f(g.items,function(h){i+=d.createHTML("option",{value:h.value},h.title)});i=d.createHTML("select",{id:g.id,"class":"mceNativeListBox","aria-labelledby":g.id+"_aria"},i);i+=d.createHTML("span",{id:g.id+"_aria",style:"display: none"},g.settings.title);return i},postRender:function(){var h=this,i,j=true;h.rendered=true;function g(l){var k=h.items[l.target.selectedIndex-1];if(k&&(k=k.value)){h.onChange.dispatch(h,k);if(h.settings.onselect){h.settings.onselect(k)}}}b.add(h.id,"change",g);b.add(h.id,"keydown",function(q){var n,p=37,m=39,l=38,r=40,k=13,o=32;b.remove(h.id,"change",i);j=false;n=b.add(h.id,"blur",function(){if(j){return}j=true;b.add(h.id,"change",g);b.remove(h.id,"blur",n)});if(q.keyCode==k||q.keyCode==o){g(q);return b.cancel(q)}else{if(q.keyCode==r||q.keyCode==l){q.stopImmediatePropagation()}}});h.onPostRender.dispatch(h,d.get(h.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.firstChild.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+=""+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'');i+=""+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";i+="";i=b.createHTML("table",{role:"presentation","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("div",{id:f.id,role:"button",tabindex:"0","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.extend({colors:"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",grid_width:8,default_color:"#888888"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.firstChild.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.keyboardNav=new d.ui.KeyboardNavigation({root:f.id+"_menu",items:c.select("a",f.id+"_menu"),onCancel:function(){f.hideMenu();f.focus()}});f.keyboardNav.focus();f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0;f.onHideMenu.dispatch();f.keyboardNav.destroy()}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(m){m=m.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");var i={href:"javascript:;",style:{backgroundColor:"#"+m},title:p.editor.getLang("colors."+m,m),"data-mce-color":"#"+m};if(!d.isIE){i.role="option"}g=c.add(g,"a",i);if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+m;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return false});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){var f=this;f.parent();a.clear(f.id+"_menu");a.clear(f.id+"_more");c.remove(f.id+"_menu");if(f.keyboardNav){f.keyboardNav.destroy()}}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('
');i.push("");i.push('");j(e,function(h){i.push(h.renderHTML())});i.push("");i.push("
");return i.join("")},focus:function(){var e=this;d.get(e.id).focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){if(b.isWebKit){d.get(f.editor.id+"_ifr").focus()}f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,""))}}if(c.stdMode){f+=''+k.renderHTML()+""}else{f+=""+k.renderHTML()+""}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,""))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,""));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},""+f+"")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){if(this.lookup[d]){return this.lookup[d].instance}else{return undefined}},dependencies:function(e){var d;if(this.lookup[e]){d=this.lookup[e].dependencies}return d||[]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(f,e,d){this.items.push(e);this.lookup[f]={instance:e,dependencies:d};this.onAdd.dispatch(this,f,e);return e},createUrl:function(d,e){if(typeof e==="object"){return e}else{return{prefix:d.prefix,resource:e,suffix:d.suffix}}},addComponents:function(f,d){var e=this.urls[f];b.each(d,function(g){b.ScriptLoader.add(e+"/"+g)})},load:function(j,f,d,h){var g=this,e=f;function i(){var k=g.dependencies(j);b.each(k,function(m){var l=g.createUrl(f,m);g.load(l.resource,l,undefined,undefined)});if(d){if(h){d.call(h)}else{d.call(b.ScriptLoader)}}}if(g.urls[j]){return}if(typeof f==="object"){e=f.prefix+f.resource+f.suffix}if(e.indexOf("/")!==0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}g.urls[j]=e.substring(0,e.lastIndexOf("/"));if(g.lookup[j]){i()}else{b.ScriptLoader.add(e,i,h)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(x){var v=this,o,n=j.ScriptLoader,u,l=[],r;function q(t){var s=t.id;if(!s){s=t.name;if(s&&!k.get(s)){s=t.name}else{s=k.uniqueId()}t.setAttribute("id",s)}return s}function m(z,A,t){var y=z[A];if(!y){return}if(j.is(y,"string")){t=y.replace(/\.\w+$/,"");t=t?j.resolve(t):0;y=j.resolve(y)}return y.apply(t||this,Array.prototype.slice.call(arguments,2))}function p(t,s){return s.constructor===RegExp?s.test(t.className):k.hasClass(t,s)}v.settings=x;i.bind(window,"ready",function(){var s,t;m(x,"onpageload");switch(x.mode){case"exact":s=x.elements||"";if(s.length>0){g(e(s),function(y){if(k.get(y)){r=new j.Editor(y,x);l.push(r);r.render(1)}else{g(document.forms,function(z){g(z.elements,function(A){if(A.name===y){y="mce_editor_"+c++;k.setAttrib(A,"id",y);r=new j.Editor(y,x);l.push(r);r.render(1)}})})}})}break;case"textareas":case"specific_textareas":g(k.select("textarea"),function(y){if(x.editor_deselector&&p(y,x.editor_deselector)){return}if(!x.editor_selector||p(y,x.editor_selector)){r=new j.Editor(q(y),x);l.push(r);r.render(1)}});break;default:if(x.types){g(x.types,function(y){g(k.select(y.selector),function(A){var z=new j.Editor(q(A),j.extend({},x,y));l.push(z);z.render(1)})})}else{if(x.selector){g(k.select(x.selector),function(z){var y=new j.Editor(q(z),x);l.push(y);y.render(1)})}}}if(x.oninit){s=t=0;g(l,function(y){t++;if(!y.initialized){y.onInit.add(function(){s++;if(s==t){m(x,"oninit")}})}else{s++}if(s==t){m(x,"oninit")}})}})},get:function(l){if(l===a){return this.editors}if(!this.editors.hasOwnProperty(l)){return a}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l':"",visual:n,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",apply_source_formatting:n,directionality:"ltr",forced_root_block:"p",hidden_input:n,padd_empty_editor:n,render_ui:n,indentation:"30px",fix_table_elements:n,inline_styles:n,convert_fonts_to_spans:n,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",validate:n,entity_encoding:"named",url_converter:m.convertURL,url_converter_scope:m,ie7_compat:n},o);m.id=m.editorId=p;m.isNotDirty=false;m.plugins={};m.documentBaseURI=new k.util.URI(o.document_base_url||k.documentBaseURL,{base_uri:tinyMCE.baseURI});m.baseURI=k.baseURI;m.contentCSS=[];m.contentStyles=[];m.setupEvents();m.execCommands={};m.queryStateCommands={};m.queryValueCommands={};m.execCallback("setup",m)},render:function(o){var p=this,q=p.settings,r=p.id,m=k.ScriptLoader;if(!j.domLoaded){j.add(window,"ready",function(){p.render()});return}tinyMCE.settings=q;if(!p.getElement()){return}if(k.isIDevice&&!k.isIOS5){return}if(!/TEXTAREA|INPUT/i.test(p.getElement().nodeName)&&q.hidden_input&&l.getParent(r,"form")){l.insertAfter(l.create("input",{type:"hidden",name:r}),r)}if(!q.content_editable){p.orgVisibility=p.getElement().style.visibility;p.getElement().style.visibility="hidden"}if(k.WindowManager){p.windowManager=new k.WindowManager(p)}if(q.encoding=="xml"){p.onGetContent.add(function(s,t){if(t.save){t.content=l.encode(t.content)}})}if(q.add_form_submit_trigger){p.onSubmit.addToTop(function(){if(p.initialized){p.save();p.isNotDirty=1}})}if(q.add_unload_trigger){p._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(p.initialized&&!p.destroyed&&!p.isHidden()){p.save({format:"raw",no_events:true})}})}k.addUnload(p.destroy,p);if(q.submit_patch){p.onBeforeRenderUI.add(function(){var s=p.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){p.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){k.triggerSave();p.isNotDirty=1;return p.formElement._mceOldSubmit(p.formElement)}}s=null})}function n(){if(q.language&&q.language_load!==false){m.add(k.baseURL+"/langs/"+q.language+".js")}if(q.theme&&typeof q.theme!="function"&&q.theme.charAt(0)!="-"&&!h.urls[q.theme]){h.load(q.theme,"themes/"+q.theme+"/editor_template"+k.suffix+".js")}i(g(q.plugins),function(t){if(t&&!c.urls[t]){if(t.charAt(0)=="-"){t=t.substr(1,t.length);var s=c.dependencies(t);i(s,function(v){var u={prefix:"plugins/",resource:v,suffix:"/editor_plugin"+k.suffix+".js"};v=c.createUrl(u,v);c.load(v.resource,v)})}else{if(t=="safari"){return}c.load(t,{prefix:"plugins/",resource:t,suffix:"/editor_plugin"+k.suffix+".js"})}}});m.loadQueue(function(){if(!p.removed){p.init()}})}n()},init:function(){var q,G=this,H=G.settings,D,y,z,C=G.getElement(),p,m,E,v,B,F,x,r=[];k.add(G);H.aria_label=H.aria_label||l.getAttrib(C,"aria-label",G.getLang("aria.rich_text_area"));if(H.theme){if(typeof H.theme!="function"){H.theme=H.theme.replace(/-/,"");p=h.get(H.theme);G.theme=new p();if(G.theme.init){G.theme.init(G,h.urls[H.theme]||k.documentBaseURL.replace(/\/$/,""))}}else{G.theme=H.theme}}function A(s){var t=c.get(s),o=c.urls[s]||k.documentBaseURL.replace(/\/$/,""),n;if(t&&k.inArray(r,s)===-1){i(c.dependencies(s),function(u){A(u)});n=new t(G,o);G.plugins[s]=n;if(n.init){n.init(G,o);r.push(s)}}}i(g(H.plugins.replace(/\-/g,"")),A);if(H.popup_css!==false){if(H.popup_css){H.popup_css=G.documentBaseURI.toAbsolute(H.popup_css)}else{H.popup_css=G.baseURI.toAbsolute("themes/"+H.theme+"/skins/"+H.skin+"/dialog.css")}}if(H.popup_css_add){H.popup_css+=","+G.documentBaseURI.toAbsolute(H.popup_css_add)}G.controlManager=new k.ControlManager(G);G.onBeforeRenderUI.dispatch(G,G.controlManager);if(H.render_ui&&G.theme){G.orgDisplay=C.style.display;if(typeof H.theme!="function"){D=H.width||C.style.width||C.offsetWidth;y=H.height||C.style.height||C.offsetHeight;z=H.min_height||100;F=/^[0-9\.]+(|px)$/i;if(F.test(""+D)){D=Math.max(parseInt(D,10)+(p.deltaWidth||0),100)}if(F.test(""+y)){y=Math.max(parseInt(y,10)+(p.deltaHeight||0),z)}p=G.theme.renderUI({targetNode:C,width:D,height:y,deltaWidth:H.delta_width,deltaHeight:H.delta_height});l.setStyles(p.sizeContainer||p.editorContainer,{width:D,height:y});y=(p.iframeHeight||y)+(typeof(y)=="number"?(p.deltaHeight||0):"");if(y';if(H.document_base_url!=k.documentBaseURL){G.iframeHTML+=''}if(k.isIE8){if(H.ie7_compat){G.iframeHTML+=''}else{G.iframeHTML+=''}}G.iframeHTML+='';for(x=0;x'}G.contentCSS=[];v=H.body_id||"tinymce";if(v.indexOf("=")!=-1){v=G.getParam("body_id","","hash");v=v[G.id]||v}B=H.body_class||"";if(B.indexOf("=")!=-1){B=G.getParam("body_class","","hash");B=B[G.id]||""}G.iframeHTML+='
";if(k.relaxedDomain&&(b||(k.isOpera&&parseFloat(opera.version())<11))){E='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+G.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody();})()'}q=l.add(p.iframeContainer,"iframe",{id:G.id+"_ifr",src:E||'javascript:""',frameBorder:"0",allowTransparency:"true",title:H.aria_label,style:{width:"100%",height:y,display:"block"}});G.contentAreaContainer=p.iframeContainer;if(p.editorContainer){l.get(p.editorContainer).style.display=G.orgDisplay}C.style.visibility=G.orgVisibility;l.get(G.id).style.display="none";l.setAttrib(G.id,"aria-hidden",true);if(!k.relaxedDomain||!E){G.initContentBody()}C=q=p=null},initContentBody:function(){var n=this,p=n.settings,q=l.get(n.id),r=n.getDoc(),o,m,s;if((!b||!k.relaxedDomain)&&!p.content_editable){r.open();r.write(n.iframeHTML);r.close();if(k.relaxedDomain){r.domain=k.relaxedDomain}}if(p.content_editable){l.addClass(q,"mceContentBody");n.contentDocument=r=p.content_document||document;n.contentWindow=p.content_window||window;n.bodyElement=q;p.content_document=p.content_window=null}m=n.getBody();m.disabled=true;if(!p.readonly){m.contentEditable=n.getParam("content_editable_state",true)}m.disabled=false;n.schema=new k.html.Schema(p);n.dom=new k.dom.DOMUtils(r,{keep_values:true,url_converter:n.convertURL,url_converter_scope:n,hex_colors:p.force_hex_style_colors,class_filter:p.class_filter,update_styles:true,root_element:p.content_editable?n.id:null,schema:n.schema});n.parser=new k.html.DomParser(p,n.schema);n.parser.addAttributeFilter("src,href,style",function(t,u){var v=t.length,y,A=n.dom,z,x;while(v--){y=t[v];z=y.attr(u);x="data-mce-"+u;if(!y.attributes.map[x]){if(u==="style"){y.attr(x,A.serializeStyle(A.parseStyle(z),y.name))}else{y.attr(x,n.convertURL(z,u,y.name))}}}});n.parser.addNodeFilter("script",function(t,u){var v=t.length,x;while(v--){x=t[v];x.attr("type","mce-"+(x.attr("type")||"text/javascript"))}});n.parser.addNodeFilter("#cdata",function(t,u){var v=t.length,x;while(v--){x=t[v];x.type=8;x.name="#comment";x.value="[CDATA["+x.value+"]]"}});n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(u,v){var x=u.length,y,t=n.schema.getNonEmptyElements();while(x--){y=u[x];if(y.isEmpty(t)){y.empty().append(new k.html.Node("br",1)).shortEnded=true}}});n.serializer=new k.dom.Serializer(p,n.dom,n.schema);n.selection=new k.dom.Selection(n.dom,n.getWin(),n.serializer,n);n.formatter=new k.Formatter(n);n.undoManager=new k.UndoManager(n);n.forceBlocks=new k.ForceBlocks(n);n.enterKey=new k.EnterKey(n);n.editorCommands=new k.EditorCommands(n);n.onExecCommand.add(function(t,u){if(!/^(FontName|FontSize)$/.test(u)){n.nodeChanged()}});n.serializer.onPreProcess.add(function(t,u){return n.onPreProcess.dispatch(n,u,t)});n.serializer.onPostProcess.add(function(t,u){return n.onPostProcess.dispatch(n,u,t)});n.onPreInit.dispatch(n);if(!p.browser_spellcheck&&!p.gecko_spellcheck){r.body.spellcheck=false}if(!p.readonly){n.bindNativeEvents()}n.controlManager.onPostRender.dispatch(n,n.controlManager);n.onPostRender.dispatch(n);n.quirks=k.util.Quirks(n);if(p.directionality){m.dir=p.directionality}if(p.nowrap){m.style.whiteSpace="nowrap"}if(p.protect){n.onBeforeSetContent.add(function(t,u){i(p.protect,function(v){u.content=u.content.replace(v,function(x){return""})})})}n.onSetContent.add(function(){n.addVisual(n.getBody())});if(p.padd_empty_editor){n.onPostProcess.add(function(t,u){u.content=u.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/,"")})}n.load({initial:true,format:"html"});n.startContent=n.getContent({format:"raw"});n.initialized=true;n.onInit.dispatch(n);n.execCallback("setupcontent_callback",n.id,m,r);n.execCallback("init_instance_callback",n);n.focus(true);n.nodeChanged({initial:true});if(n.contentStyles.length>0){s="";i(n.contentStyles,function(t){s+=t+"\r\n"});n.dom.addStyle(s)}i(n.contentCSS,function(t){n.dom.loadCSS(t)});if(p.auto_focus){setTimeout(function(){var t=k.get(p.auto_focus);t.selection.select(t.getBody(),1);t.selection.collapse(1);t.getBody().focus();t.getWin().focus()},100)}q=r=m=null},focus:function(p){var o,u=this,t=u.selection,q=u.settings.content_editable,n,r,s=u.getDoc(),m;if(!p){if(u.bookmark){t.moveToBookmark(u.bookmark);u.bookmark=null}n=t.getRng();if(n.item){r=n.item(0)}u._refreshContentEditable();if(!q){u.getWin().focus()}if(k.isGecko||q){m=u.getBody();if(m.setActive&&!k.isIE11){m.setActive()}else{m.focus()}if(q){t.normalize()}}if(r&&r.ownerDocument==s){n=s.body.createControlRange();n.addElement(r);n.select()}}if(k.activeEditor!=u){if((o=k.activeEditor)!=null){o.onDeactivate.dispatch(o,u)}u.onActivate.dispatch(u,o)}k._setActive(u)},execCallback:function(q){var m=this,p=m.settings[q],o;if(!p){return}if(m.callbackLookup&&(o=m.callbackLookup[q])){p=o.func;o=o.scope}if(d(p,"string")){o=p.replace(/\.\w+$/,"");o=o?k.resolve(o):0;p=k.resolve(p);m.callbackLookup=m.callbackLookup||{};m.callbackLookup[q]={func:p,scope:o}}return p.apply(o||m,Array.prototype.slice.call(arguments,1))},translate:function(m){var o=this.settings.language||"en",n=k.i18n;if(!m){return""}return n[o+"."+m]||m.replace(/\{\#([^\}]+)\}/g,function(q,p){return n[o+"."+p]||"{#"+p+"}"})},getLang:function(o,m){return k.i18n[(this.settings.language||"en")+"."+o]||(d(m)?m:"{#"+o+"}")},getParam:function(t,q,m){var r=k.trim,p=d(this.settings[t])?this.settings[t]:q,s;if(m==="hash"){s={};if(d(p,"string")){i(p.indexOf("=")>0?p.split(/[;,](?![^=;,]*(?:[;,]|$))/):p.split(","),function(n){n=n.split("=");if(n.length>1){s[r(n[0])]=r(n[1])}else{s[r(n[0])]=r(n)}})}else{s=p}return s}return p},nodeChanged:function(q){var m=this,n=m.selection,p;if(m.initialized){q=q||{};p=n.getStart()||m.getBody();p=b&&p.ownerDocument!=m.getDoc()?m.getBody():p;q.parents=[];m.dom.getParent(p,function(o){if(o.nodeName=="BODY"){return true}q.parents.push(o)});m.onNodeChange.dispatch(m,q?q.controlManager||m.controlManager:m.controlManager,p,n.isCollapsed(),q)}},addButton:function(n,o){var m=this;m.buttons=m.buttons||{};m.buttons[n]=o},addCommand:function(m,o,n){this.execCommands[m]={func:o,scope:n||this}},addQueryStateHandler:function(m,o,n){this.queryStateCommands[m]={func:o,scope:n||this}},addQueryValueHandler:function(m,o,n){this.queryValueCommands[m]={func:o,scope:n||this}},addShortcut:function(o,q,m,p){var n=this,r;if(n.settings.custom_shortcuts===false){return false}n.shortcuts=n.shortcuts||{};if(d(m,"string")){r=m;m=function(){n.execCommand(r,false,null)}}if(d(m,"object")){r=m;m=function(){n.execCommand(r[0],r[1],r[2])}}i(g(o),function(s){var t={func:m,scope:p||this,desc:n.translate(q),alt:false,ctrl:false,shift:false};i(g(s,"+"),function(u){switch(u){case"alt":case"ctrl":case"shift":t[u]=true;break;default:t.charCode=u.charCodeAt(0);t.keyCode=u.toUpperCase().charCodeAt(0)}});n.shortcuts[(t.ctrl?"ctrl":"")+","+(t.alt?"alt":"")+","+(t.shift?"shift":"")+","+t.keyCode]=t});return true},execCommand:function(u,r,x,m){var p=this,q=0,v,n;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(u)&&(!m||!m.skip_focus)){p.focus()}m=f({},m);p.onBeforeExecCommand.dispatch(p,u,r,x,m);if(m.terminate){return false}if(p.execCallback("execcommand_callback",p.id,p.selection.getNode(),u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}if(v=p.execCommands[u]){n=v.func.call(v.scope,r,x);if(n!==true){p.onExecCommand.dispatch(p,u,r,x,m);return n}}i(p.plugins,function(o){if(o.execCommand&&o.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);q=1;return false}});if(q){return true}if(p.theme&&p.theme.execCommand&&p.theme.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}if(p.editorCommands.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}p.getDoc().execCommand(u,r,x);p.onExecCommand.dispatch(p,u,r,x,m)},queryCommandState:function(q){var n=this,r,p;if(n._isHidden()){return}if(r=n.queryStateCommands[q]){p=r.func.call(r.scope);if(p!==true){return p}}r=n.editorCommands.queryCommandState(q);if(r!==-1){return r}try{return this.getDoc().queryCommandState(q)}catch(m){}},queryCommandValue:function(r){var n=this,q,p;if(n._isHidden()){return}if(q=n.queryValueCommands[r]){p=q.func.call(q.scope);if(p!==true){return p}}q=n.editorCommands.queryCommandValue(r);if(d(q)){return q}try{return this.getDoc().queryCommandValue(r)}catch(m){}},show:function(){var m=this;l.show(m.getContainer());l.hide(m.id);m.load()},hide:function(){var m=this,n=m.getDoc();if(b&&n){n.execCommand("SelectAll")}m.save();l.hide(m.getContainer());l.setStyle(m.id,"display",m.orgDisplay)},isHidden:function(){return !l.isHidden(this.id)},setProgressState:function(m,n,p){this.onSetProgressState.dispatch(this,m,n,p);return m},load:function(q){var m=this,p=m.getElement(),n;if(p){q=q||{};q.load=true;n=m.setContent(d(p.value)?p.value:p.innerHTML,q);q.element=p;if(!q.no_events){m.onLoadContent.dispatch(m,q)}q.element=p=null;return n}},save:function(r){var m=this,q=m.getElement(),n,p;if(!q||!m.initialized){return}r=r||{};r.save=true;r.element=q;n=r.content=m.getContent(r);if(!r.no_events){m.onSaveContent.dispatch(m,r)}n=r.content;if(!/TEXTAREA|INPUT/i.test(q.nodeName)){q.innerHTML=n;if(p=l.getParent(m.id,"form")){i(p.elements,function(o){if(o.name==m.id){o.value=n;return false}})}}else{q.value=n}r.element=q=null;return n},setContent:function(r,p){var o=this,n,m=o.getBody(),q;p=p||{};p.format=p.format||"html";p.set=true;p.content=r;if(!p.no_events){o.onBeforeSetContent.dispatch(o,p)}r=p.content;if(!k.isIE&&(r.length===0||/^\s+$/.test(r))){q=o.settings.forced_root_block;if(q){r="<"+q+'>
"}else{r='
'}m.innerHTML=r;o.selection.select(m,true);o.selection.collapse(true);return}if(p.format!=="raw"){r=new k.html.Serializer({},o.schema).serialize(o.parser.parse(r))}p.content=k.trim(r);o.dom.setHTML(m,p.content);if(!p.no_events){o.onSetContent.dispatch(o,p)}if(!o.settings.content_editable||document.activeElement===o.getBody()){o.selection.normalize()}return p.content},getContent:function(o){var n=this,p,m=n.getBody();o=o||{};o.format=o.format||"html";o.get=true;o.getInner=true;if(!o.no_events){n.onBeforeGetContent.dispatch(n,o)}if(o.format=="raw"){p=m.innerHTML}else{if(o.format=="text"){p=m.innerText||m.textContent}else{p=n.serializer.serialize(m,o)}}if(o.format!="text"){o.content=k.trim(p)}else{o.content=p}if(!o.no_events){n.onGetContent.dispatch(n,o)}return o.content},isDirty:function(){var m=this;return k.trim(m.startContent)!=k.trim(m.getContent({format:"raw",no_events:1}))&&!m.isNotDirty},getContainer:function(){var m=this;if(!m.container){m.container=l.get(m.editorContainer||m.id+"_parent")}return m.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return l.get(this.settings.content_element||this.id)},getWin:function(){var m=this,n;if(!m.contentWindow){n=l.get(m.id+"_ifr");if(n){m.contentWindow=n.contentWindow}}return m.contentWindow},getDoc:function(){var m=this,n;if(!m.contentDocument){n=m.getWin();if(n){m.contentDocument=n.document}}return m.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(o,n,q){var m=this,p=m.settings;if(p.urlconverter_callback){return m.execCallback("urlconverter_callback",o,q,true,n)}if(!p.convert_urls||(q&&q.nodeName=="LINK")||o.indexOf("file:")===0){return o}if(p.relative_urls){return m.documentBaseURI.toRelative(o)}o=m.documentBaseURI.toAbsolute(o,p.remove_script_host);return o},addVisual:function(q){var n=this,o=n.settings,p=n.dom,m;q=q||n.getBody();if(!d(n.hasVisual)){n.hasVisual=o.visual}i(p.select("table,a",q),function(s){var r;switch(s.nodeName){case"TABLE":m=o.visual_table_class||"mceItemTable";r=p.getAttrib(s,"border");if(!r||r=="0"){if(n.hasVisual){p.addClass(s,m)}else{p.removeClass(s,m)}}return;case"A":if(!p.getAttrib(s,"href",false)){r=p.getAttrib(s,"name")||s.id;m="mceItemAnchor";if(r){if(n.hasVisual){p.addClass(s,m)}else{p.removeClass(s,m)}}}return}});n.onVisualAid.dispatch(n,q,n.hasVisual)},remove:function(){var m=this,o=m.getContainer(),n=m.getDoc();if(!m.removed){m.removed=1;if(b&&n){n.execCommand("SelectAll")}m.save();l.setStyle(m.id,"display",m.orgDisplay);if(!m.settings.content_editable){j.unbind(m.getWin());j.unbind(m.getDoc())}j.unbind(m.getBody());j.clear(o);m.execCallback("remove_instance_callback",m);m.onRemove.dispatch(m);m.onExecCommand.listeners=[];k.remove(m);l.remove(o)}},destroy:function(n){var m=this;if(m.destroyed){return}if(a){j.unbind(m.getDoc());j.unbind(m.getWin());j.unbind(m.getBody())}if(!n){k.removeUnload(m.destroy);tinyMCE.onBeforeUnload.remove(m._beforeUnload);if(m.theme&&m.theme.destroy){m.theme.destroy()}m.controlManager.destroy();m.selection.destroy();m.dom.destroy()}if(m.formElement){m.formElement.submit=m.formElement._mceOldSubmit;m.formElement._mceOldSubmit=null}m.contentAreaContainer=m.formElement=m.container=m.settings.content_element=m.bodyElement=m.contentDocument=m.contentWindow=null;if(m.selection){m.selection=m.selection.win=m.selection.dom=m.selection.dom.doc=null}m.destroyed=1},_refreshContentEditable:function(){var n=this,m,o;if(n._isHidden()){m=n.getBody();o=m.parentNode;o.removeChild(m);o.appendChild(m);m.focus()}},_isHidden:function(){var m;if(!a){return 0}m=this.selection.getSel();return(!m||!m.rangeCount||m.rangeCount===0)}})})(tinymce);(function(a){var b=a.each;a.Editor.prototype.setupEvents=function(){var c=this,d=c.settings;b(["onPreInit","onBeforeRenderUI","onPostRender","onLoad","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState","onSetAttrib"],function(e){c[e]=new a.util.Dispatcher(c)});if(d.cleanup_callback){c.onBeforeSetContent.add(function(e,f){f.content=e.execCallback("cleanup_callback","insert_to_editor",f.content,f)});c.onPreProcess.add(function(e,f){if(f.set){e.execCallback("cleanup_callback","insert_to_editor_dom",f.node,f)}if(f.get){e.execCallback("cleanup_callback","get_from_editor_dom",f.node,f)}});c.onPostProcess.add(function(e,f){if(f.set){f.content=e.execCallback("cleanup_callback","insert_to_editor",f.content,f)}if(f.get){f.content=e.execCallback("cleanup_callback","get_from_editor",f.content,f)}})}if(d.save_callback){c.onGetContent.add(function(e,f){if(f.save){f.content=e.execCallback("save_callback",e.id,f.content,e.getBody())}})}if(d.handle_event_callback){c.onEvent.add(function(f,g,h){if(c.execCallback("handle_event_callback",g,f,h)===false){g.preventDefault();g.stopPropagation()}})}if(d.handle_node_change_callback){c.onNodeChange.add(function(f,e,g){f.execCallback("handle_node_change_callback",f.id,g,-1,-1,true,f.selection.isCollapsed())})}if(d.save_callback){c.onSaveContent.add(function(e,g){var f=e.execCallback("save_callback",e.id,g.content,e.getBody());if(f){g.content=f}})}if(d.onchange_callback){c.onChange.add(function(f,e){f.execCallback("onchange_callback",f,e)})}};a.Editor.prototype.bindNativeEvents=function(){var l=this,f,d=l.settings,e=l.dom,h;h={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function c(i,m){var n=i.type;if(l.removed){return}if(l.onEvent.dispatch(l,i,m)!==false){l[h[i.fakeType||i.type]].dispatch(l,i,m)}}function j(i){l.focus(true)}function k(i,m){if(m.keyCode!=65||!a.VK.metaKeyPressed(m)){l.selection.normalize()}l.nodeChanged()}b(h,function(m,n){var i=d.content_editable?l.getBody():l.getDoc();switch(n){case"contextmenu":e.bind(i,n,c);break;case"paste":e.bind(l.getBody(),n,c);break;case"submit":case"reset":e.bind(l.getElement().form||a.DOM.getParent(l.id,"form"),n,c);break;default:e.bind(i,n,c)}});e.bind(d.content_editable?l.getBody():(a.isGecko?l.getDoc():l.getWin()),"focus",function(i){l.focus(true)});if(d.content_editable&&a.isOpera){e.bind(l.getBody(),"click",j);e.bind(l.getBody(),"keydown",j)}l.onMouseUp.add(k);l.onKeyUp.add(function(i,n){var m=n.keyCode;if((m>=33&&m<=36)||(m>=37&&m<=40)||m==13||m==45||m==46||m==8||(a.isMac&&(m==91||m==93))||n.ctrlKey){k(i,n)}});l.onReset.add(function(){l.setContent(l.startContent,{format:"raw"})});function g(m,i){if(m.altKey||m.ctrlKey||m.metaKey){b(l.shortcuts,function(n){var o=a.isMac?m.metaKey:m.ctrlKey;if(n.ctrl!=o||n.alt!=m.altKey||n.shift!=m.shiftKey){return}if(m.keyCode==n.keyCode||(m.charCode&&m.charCode==n.charCode)){m.preventDefault();if(i){n.func.call(n.scope)}return true}})}}l.onKeyUp.add(function(i,m){g(m)});l.onKeyPress.add(function(i,m){g(m)});l.onKeyDown.add(function(i,m){g(m,true)});if(a.isOpera){l.onClick.add(function(i,m){m.preventDefault()})}}})(tinymce);(function(d){var e=d.each,b,a=true,c=false;d.EditorCommands=function(n){var m=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,q=n.formatter,o;function r(z,y,x){var v;z=z.toLowerCase();if(v=j.exec[z]){v(z,y,x);return a}return c}function l(x){var v;x=x.toLowerCase();if(v=j.state[x]){return v(x)}return -1}function h(x){var v;x=x.toLowerCase();if(v=j.value[x]){return v(x)}return c}function u(v,x){x=x||"exec";e(v,function(z,y){e(y.toLowerCase().split(","),function(A){j[x][A]=z})})}d.extend(this,{execCommand:r,queryCommandState:l,queryCommandValue:h,addCommands:u});function f(y,x,v){if(x===b){x=c}if(v===b){v=null}return n.getDoc().execCommand(y,x,v)}function t(v){return q.match(v)}function s(v,x){q.toggle(v,x?{value:x}:b)}function i(v){o=p.getBookmark(v)}function g(){p.moveToBookmark(o)}u({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(z){var y=n.getDoc(),v;try{f(z)}catch(x){v=a}if(v||!y.queryCommandSupported(z)){if(d.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(A){if(A){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(v){if(p.isCollapsed()){p.select(p.getNode())}f(v);p.collapse(c)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){var x=v.substring(7);e("left,center,right,full".split(","),function(y){if(x!=y){q.remove("align"+y)}});s("align"+x);r("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(y){var v,x;f(y);v=m.getParent(p.getNode(),"ol,ul");if(v){x=v.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(x.nodeName)){i();m.split(x,v);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){s(v)},"ForeColor,HiliteColor,FontName":function(y,x,v){s(y,v)},FontSize:function(z,y,x){var v,A;if(x>=1&&x<=7){A=d.explode(k.font_size_style_values);v=d.explode(k.font_size_classes);if(v){x=v[x-1]||x}else{x=A[x-1]||x}}s(z,x)},RemoveFormat:function(v){q.remove(v)},mceBlockQuote:function(v){s("blockquote")},FormatBlock:function(y,x,v){return s(v||"p")},mceCleanup:function(){var v=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(v)},mceRemoveNode:function(z,y,x){var v=x||p.getNode();if(v!=n.getBody()){i();n.dom.remove(v,a);g()}},mceSelectNodeDepth:function(z,y,x){var v=0;m.getParent(p.getNode(),function(A){if(A.nodeType==1&&v++==x){p.select(A);return c}},n.getBody())},mceSelectNode:function(y,x,v){p.select(v)},mceInsertContent:function(B,I,K){var y,J,E,z,F,G,D,C,L,x,A,M,v,H;y=n.parser;J=new d.html.Serializer({},n.schema);v='\uFEFF';G={content:K,format:"html"};p.onBeforeSetContent.dispatch(p,G);K=G.content;if(K.indexOf("{$caret}")==-1){K+="{$caret}"}K=K.replace(/\{\$caret\}/,v);if(!p.isCollapsed()){n.getDoc().execCommand("Delete",false,null)}E=p.getNode();G={context:E.nodeName.toLowerCase()};F=y.parse(K,G);A=F.lastChild;if(A.attr("id")=="mce_marker"){D=A;for(A=A.prev;A;A=A.walk(true)){if(A.type==3||!m.isBlock(A.name)){A.parent.insert(D,A,A.name==="br");break}}}if(!G.invalid){K=J.serialize(F);A=E.firstChild;M=E.lastChild;if(!A||(A===M&&A.nodeName==="BR")){m.setHTML(E,K)}else{p.setContent(K)}}else{p.setContent(v);E=p.getNode();z=n.getBody();if(E.nodeType==9){E=A=z}else{A=E}while(A!==z){E=A;A=A.parentNode}K=E==z?z.innerHTML:m.getOuterHTML(E);K=J.serialize(y.parse(K.replace(//i,function(){return J.serialize(F)})));if(E==z){m.setHTML(z,K)}else{m.setOuterHTML(E,K)}}D=m.get("mce_marker");C=m.getRect(D);L=m.getViewPort(n.getWin());if((C.y+C.h>L.y+L.h||C.yL.x+L.w||C.x")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(y,x,v){n.execCommand("mceInsertContent",false,v.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(z,y,x){var v;if(typeof(x)=="string"){x={href:x}}v=m.getParent(p.getNode(),"a");x.href=x.href.replace(" ","%20");if(!v||!x.href){q.remove("link")}if(x.href){q.apply("link",x,v)}},selectAll:function(){var x=m.getRoot(),v=m.createRng();if(p.getRng().setStart){v.setStart(x,0);v.setEnd(x,x.childNodes.length);p.setRng(v)}else{f("SelectAll")}}});u({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(z){var x="align"+z.substring(7);var v=p.isCollapsed()?[m.getParent(p.getNode(),m.isBlock)]:p.getSelectedBlocks();var y=d.map(v,function(A){return !!q.matchNode(A,x)});return d.inArray(y,a)!==-1},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){return t(v)},mceBlockQuote:function(){return t("blockquote")},Outdent:function(){var v;if(k.inline_styles){if((v=m.getParent(p.getStart(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}if((v=m.getParent(p.getEnd(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}}return l("InsertUnorderedList")||l("InsertOrderedList")||(!k.inline_styles&&!!m.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(x){var v=m.getParent(p.getNode(),"ul,ol");return v&&(x==="insertunorderedlist"&&v.tagName==="UL"||x==="insertorderedlist"&&v.tagName==="OL")}},"state");u({"FontSize,FontName":function(y){var x=0,v;if(v=m.getParent(p.getNode(),"span")){if(y=="fontsize"){x=v.style.fontSize}else{x=v.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return x}},"value");u({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(h){var l,i=0,e=[],g,k,j,f;function c(){return b.trim(h.getContent({format:"raw",no_events:1}).replace(/]+data-mce-bogus[^>]+>[\u200B\uFEFF]+<\/span>/g,""))}function d(){l.typing=false;l.add()}onBeforeAdd=new a(l);k=new a(l);j=new a(l);f=new a(l);k.add(function(m,n){if(m.hasUndo()){return h.onChange.dispatch(h,n,m)}});j.add(function(m,n){return h.onUndo.dispatch(h,n,m)});f.add(function(m,n){return h.onRedo.dispatch(h,n,m)});h.onInit.add(function(){l.add()});h.onBeforeExecCommand.add(function(m,p,o,q,n){if(p!="Undo"&&p!="Redo"&&p!="mceRepaint"&&(!n||!n.skip_undo)){l.beforeChange()}});h.onExecCommand.add(function(m,p,o,q,n){if(p!="Undo"&&p!="Redo"&&p!="mceRepaint"&&(!n||!n.skip_undo)){l.add()}});h.onSaveContent.add(d);h.dom.bind(h.dom.getRoot(),"dragend",d);h.dom.bind(h.getBody(),"focusout",function(m){if(!h.removed&&l.typing){d()}});h.onKeyUp.add(function(m,o){var n=o.keyCode;if((n>=33&&n<=36)||(n>=37&&n<=40)||n==45||n==13||o.ctrlKey){d()}});h.onKeyDown.add(function(m,o){var n=o.keyCode;if((n>=33&&n<=36)||(n>=37&&n<=40)||n==45){if(l.typing){d()}return}if((n<16||n>20)&&n!=224&&n!=91&&!l.typing){l.beforeChange();l.typing=true;l.add()}});h.onMouseDown.add(function(m,n){if(l.typing){d()}});h.addShortcut("ctrl+z","undo_desc","Undo");h.addShortcut("ctrl+y","redo_desc","Redo");l={data:e,typing:false,onBeforeAdd:onBeforeAdd,onAdd:k,onUndo:j,onRedo:f,beforeChange:function(){g=h.selection.getBookmark(2,true)},add:function(p){var m,n=h.settings,o;p=p||{};p.content=c();l.onBeforeAdd.dispatch(l,p);o=e[i];if(o&&o.content==p.content){return null}if(e[i]){e[i].beforeBookmark=g}if(n.custom_undo_redo_levels){if(e.length>n.custom_undo_redo_levels){for(m=0;m0){n=e[--i];h.setContent(n.content,{format:"raw"});h.selection.moveToBookmark(n.beforeBookmark);l.onUndo.dispatch(l,n)}return n},redo:function(){var m;if(i0||this.typing},hasRedo:function(){return i0){g.moveEnd("character",q)}g.select()}catch(n){}}}c.nodeChanged()}}if(b.forced_root_block){c.onKeyUp.add(f);c.onNodeChange.add(f)}};(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(j){var o,k,g,h=this,m=h.editor,n,f;if(!h.controlFactories){h.controlFactories=[];d(m.plugins,function(i){if(i.createControl){h.controlFactories.push(i)}})}n=h.controlFactories;for(k=0,g=n.length;k1||ag==ay||ag.tagName=="BR"){return ag}}}var aq=aa.selection.getRng();var av=aq.startContainer;var ap=aq.endContainer;if(av!=ap&&aq.endOffset===0){var au=ar(av,ap);var at=au.nodeType==3?au.length:au.childNodes.length;aq.setEnd(au,at)}return aq}function ad(at,ay,aw,av,aq){var ap=[],ar=-1,ax,aA=-1,au=-1,az;T(at.childNodes,function(aC,aB){if(aC.nodeName==="UL"||aC.nodeName==="OL"){ar=aB;ax=aC;return false}});T(at.childNodes,function(aC,aB){if(aC.nodeName==="SPAN"&&c.getAttrib(aC,"data-mce-type")=="bookmark"){if(aC.id==ay.id+"_start"){aA=aB}else{if(aC.id==ay.id+"_end"){au=aB}}}});if(ar<=0||(aAar)){T(a.grep(at.childNodes),aq);return 0}else{az=c.clone(aw,X);T(a.grep(at.childNodes),function(aC,aB){if((aAar&&aB>ar)){ap.push(aC);aC.parentNode.removeChild(aC)}});if(aAar){at.insertBefore(az,ax.nextSibling)}}av.push(az);T(ap,function(aB){az.appendChild(aB)});return az}}function an(aq,at,aw){var ap=[],av,ar,au=true;av=am.inline||am.block;ar=c.create(av);ab(ar);N.walk(aq,function(ax){var ay;function az(aA){var aF,aD,aB,aC,aE;aE=au;aF=aA.nodeName.toLowerCase();aD=aA.parentNode.nodeName.toLowerCase();if(aA.nodeType===1&&x(aA)){aE=au;au=x(aA)==="true";aC=true}if(g(aF,"br")){ay=0;if(am.block){c.remove(aA)}return}if(am.wrapper&&y(aA,ae,al)){ay=0;return}if(au&&!aC&&am.block&&!am.wrapper&&I(aF)){aA=c.rename(aA,av);ab(aA);ap.push(aA);ay=0;return}if(am.selector){T(ah,function(aG){if("collapsed" in aG&&aG.collapsed!==ai){return}if(c.is(aA,aG.selector)&&!b(aA)){ab(aA,aG);aB=true}});if(!am.inline||aB){ay=0;return}}if(au&&!aC&&d(av,aF)&&d(aD,av)&&!(!aw&&aA.nodeType===3&&aA.nodeValue.length===1&&aA.nodeValue.charCodeAt(0)===65279)&&!b(aA)&&(!am.inline||!H(aA))){if(!ay){ay=c.clone(ar,X);aA.parentNode.insertBefore(ay,aA);ap.push(ay)}ay.appendChild(aA)}else{if(aF=="li"&&at){ay=ad(aA,at,ar,ap,az)}else{ay=0;T(a.grep(aA.childNodes),az);if(aC){au=aE}ay=0}}}T(ax,az)});if(am.wrap_links===false){T(ap,function(ax){function ay(aC){var aB,aA,az;if(aC.nodeName==="A"){aA=c.clone(ar,X);ap.push(aA);az=a.grep(aC.childNodes);for(aB=0;aB1||!H(az))&&ax===0){c.remove(az,1);return}if(am.inline||am.wrapper){if(!am.exact&&ax===1){az=ay(az)}T(ah,function(aB){T(c.select(aB.inline,az),function(aD){var aC;if(aB.wrap_links===false){aC=aD.parentNode;do{if(aC.nodeName==="A"){return}}while(aC=aC.parentNode)}Z(aB,al,aD,aB.exact?aD:null)})});if(y(az.parentNode,ae,al)){c.remove(az,1);az=0;return C}if(am.merge_with_parents){c.getParent(az.parentNode,function(aB){if(y(aB,ae,al)){c.remove(az,1);az=0;return C}})}if(az&&am.merge_siblings!==false){az=u(E(az),az);az=u(az,E(az,C))}}})}if(am){if(ag){if(ag.nodeType){ac=c.createRng();ac.setStartBefore(ag);ac.setEndAfter(ag);an(p(ac,ah),null,true)}else{an(ag,null,true)}}else{if(!ai||!am.inline||c.select("td.mceSelected,th.mceSelected").length){var ao=aa.selection.getNode();if(!m&&ah[0].defaultBlock&&!c.getParent(ao,c.isBlock)){Y(ah[0].defaultBlock)}aa.selection.setRng(af());ak=r.getBookmark();an(p(r.getRng(C),ah),ak);if(am.styles&&(am.styles.color||am.styles.textDecoration)){a.walk(ao,L,"childNodes");L(ao)}r.moveToBookmark(ak);R(r.getRng(C));aa.nodeChanged()}else{U("apply",ae,al)}}}}function B(ad,am,af){var ag=V(ad),ao=ag[0],ak,aj,ac,al=true;function ae(av){var au,at,ar,aq,ax,aw;if(av.nodeType===3){return}if(av.nodeType===1&&x(av)){ax=al;al=x(av)==="true";aw=true}au=a.grep(av.childNodes);if(al&&!aw){for(at=0,ar=ag.length;at=0;ac--){ab=ah[ac].selector;if(!ab){return C}for(ag=ad.length-1;ag>=0;ag--){if(c.is(ad[ag],ab)){return C}}}}return X}function J(ab,ae,ac){var ad;if(!P){P={};ad={};aa.onNodeChange.addToTop(function(ag,af,ai){var ah=n(ai),aj={};T(P,function(ak,al){T(ah,function(am){if(y(am,al,{},ak.similar)){if(!ad[al]){T(ak,function(an){an(true,{node:am,format:al,parents:ah})});ad[al]=ak}aj[al]=ak;return false}})});T(ad,function(ak,al){if(!aj[al]){delete ad[al];T(ak,function(am){am(false,{node:ai,format:al,parents:ah})})}})})}T(ab.split(","),function(af){if(!P[af]){P[af]=[];P[af].similar=ac}P[af].push(ae)});return this}a.extend(this,{get:V,register:l,apply:Y,remove:B,toggle:F,match:k,matchAll:v,matchNode:y,canApply:z,formatChanged:J});j();W();function h(ab,ac){if(g(ab,ac.inline)){return C}if(g(ab,ac.block)){return C}if(ac.selector){return c.is(ab,ac.selector)}}function g(ac,ab){ac=ac||"";ab=ab||"";ac=""+(ac.nodeName||ac);ab=""+(ab.nodeName||ab);return ac.toLowerCase()==ab.toLowerCase()}function O(ac,ab){var ad=c.getStyle(ac,ab);if(ab=="color"||ab=="backgroundColor"){ad=c.toHex(ad)}if(ab=="fontWeight"&&ad==700){ad="bold"}return""+ad}function q(ab,ac){if(typeof(ab)!="string"){ab=ab(ac)}else{if(ac){ab=ab.replace(/%(\w+)/g,function(ae,ad){return ac[ad]||ae})}}return ab}function f(ab){return ab&&ab.nodeType===3&&/^([\t \r\n]+|)$/.test(ab.nodeValue)}function S(ad,ac,ab){var ae=c.create(ac,ab);ad.parentNode.insertBefore(ae,ad);ae.appendChild(ad);return ae}function p(ab,am,ae){var ap,an,ah,al,ad=ab.startContainer,ai=ab.startOffset,ar=ab.endContainer,ak=ab.endOffset;function ao(aA){var au,ax,az,aw,av,at;au=ax=aA?ad:ar;av=aA?"previousSibling":"nextSibling";at=c.getRoot();function ay(aB){return aB.nodeName=="BR"&&aB.getAttribute("data-mce-bogus")&&!aB.nextSibling}if(au.nodeType==3&&!f(au)){if(aA?ai>0:akan?an:ai];if(ad.nodeType==3){ai=0}}if(ar.nodeType==1&&ar.hasChildNodes()){an=ar.childNodes.length-1;ar=ar.childNodes[ak>an?an:ak-1];if(ar.nodeType==3){ak=ar.nodeValue.length}}function aq(au){var at=au;while(at){if(at.nodeType===1&&x(at)){return x(at)==="false"?at:au}at=at.parentNode}return au}function aj(au,ay,aA){var ax,av,az,at;function aw(aC,aE){var aF,aB,aD=aC.nodeValue;if(typeof(aE)=="undefined"){aE=aA?aD.length:0}if(aA){aF=aD.lastIndexOf(" ",aE);aB=aD.lastIndexOf("\u00a0",aE);aF=aF>aB?aF:aB;if(aF!==-1&&!ae){aF++}}else{aF=aD.indexOf(" ",aE);aB=aD.indexOf("\u00a0",aE);aF=aF!==-1&&(aB===-1||aF0&&ah.node.nodeType===3&&ah.node.nodeValue.charAt(ah.offset-1)===" "){if(ah.offset>1){ar=ah.node;ar.splitText(ah.offset-1)}}}}if(am[0].inline||am[0].block_expand){if(!am[0].inline||(ad.nodeType!=3||ai===0)){ad=ao(true)}if(!am[0].inline||(ar.nodeType!=3||ak===ar.nodeValue.length)){ar=ao()}}if(am[0].selector&&am[0].expand!==X&&!am[0].inline){ad=af(ad,"previousSibling");ar=af(ar,"nextSibling")}if(am[0].block||am[0].selector){ad=ac(ad,"previousSibling");ar=ac(ar,"nextSibling");if(am[0].block){if(!H(ad)){ad=ao(true)}if(!H(ar)){ar=ao()}}}if(ad.nodeType==1){ai=s(ad);ad=ad.parentNode}if(ar.nodeType==1){ak=s(ar)+1;ar=ar.parentNode}return{startContainer:ad,startOffset:ai,endContainer:ar,endOffset:ak}}function Z(ah,ag,ae,ab){var ad,ac,af;if(!h(ae,ah)){return X}if(ah.remove!="all"){T(ah.styles,function(aj,ai){aj=q(aj,ag);if(typeof(ai)==="number"){ai=aj;ab=0}if(!ab||g(O(ab,ai),aj)){c.setStyle(ae,ai,"")}af=1});if(af&&c.getAttrib(ae,"style")==""){ae.removeAttribute("style");ae.removeAttribute("data-mce-style")}T(ah.attributes,function(ak,ai){var aj;ak=q(ak,ag);if(typeof(ai)==="number"){ai=ak;ab=0}if(!ab||g(c.getAttrib(ab,ai),ak)){if(ai=="class"){ak=c.getAttrib(ae,ai);if(ak){aj="";T(ak.split(/\s+/),function(al){if(/mce\w+/.test(al)){aj+=(aj?" ":"")+al}});if(aj){c.setAttrib(ae,ai,aj);return}}}if(ai=="class"){ae.removeAttribute("className")}if(e.test(ai)){ae.removeAttribute("data-mce-"+ai)}ae.removeAttribute(ai)}});T(ah.classes,function(ai){ai=q(ai,ag);if(!ab||c.hasClass(ab,ai)){c.removeClass(ae,ai)}});ac=c.getAttribs(ae);for(ad=0;adad?ad:af]}if(ab.nodeType===3&&ag&&af>=ab.nodeValue.length){ab=new t(ab,aa.getBody()).next()||ab}if(ab.nodeType===3&&!ag&&af===0){ab=new t(ab,aa.getBody()).prev()||ab}return ab}function U(ak,ab,ai){var al="_mce_caret",ac=aa.settings.caret_debug;function ad(ap){var ao=c.create("span",{id:al,"data-mce-bogus":true,style:ac?"color:red":""});if(ap){ao.appendChild(aa.getDoc().createTextNode(G))}return ao}function aj(ap,ao){while(ap){if((ap.nodeType===3&&ap.nodeValue!==G)||ap.childNodes.length>1){return false}if(ao&&ap.nodeType===1){ao.push(ap)}ap=ap.firstChild}return true}function ag(ao){while(ao){if(ao.id===al){return ao}ao=ao.parentNode}}function af(ao){var ap;if(ao){ap=new t(ao,ao);for(ao=ap.current();ao;ao=ap.next()){if(ao.nodeType===3){return ao}}}}function ae(aq,ap){var ar,ao;if(!aq){aq=ag(r.getStart());if(!aq){while(aq=c.get(al)){ae(aq,false)}}}else{ao=r.getRng(true);if(aj(aq)){if(ap!==false){ao.setStartBefore(aq);ao.setEndBefore(aq)}c.remove(aq)}else{ar=af(aq);if(ar.nodeValue.charAt(0)===G){ar=ar.deleteData(0,1)}c.remove(aq,1)}r.setRng(ao)}}function ah(){var aq,ao,av,au,ar,ap,at;aq=r.getRng(true);au=aq.startOffset;ap=aq.startContainer;at=ap.nodeValue;ao=ag(r.getStart());if(ao){av=af(ao)}if(at&&au>0&&au=0;au--){aq.appendChild(c.clone(ay[au],false));aq=aq.firstChild}aq.appendChild(c.doc.createTextNode(G));aq=aq.firstChild;var ar=c.getParent(az,I);if(ar&&c.isEmpty(ar)){az.parentNode.replaceChild(ax,az)}else{c.insertAfter(ax,az)}r.setCursorLocation(aq,1);if(c.isEmpty(az)){c.remove(az)}}}function an(){var ap,ao,aq;ao=ag(r.getStart());if(ao&&!c.isEmpty(ao)){a.walk(ao,function(ar){if(ar.nodeType==1&&ar.id!==al&&!c.isEmpty(ar)){c.setAttrib(ar,"data-mce-bogus",null)}},"childNodes")}}if(!self._hasCaretEvents){aa.onBeforeGetContent.addToTop(function(){var ao=[],ap;if(aj(ag(r.getStart()),ao)){ap=ao.length;while(ap--){c.setAttrib(ao[ap],"data-mce-bogus","1")}}});a.each("onMouseUp onKeyUp".split(" "),function(ao){aa[ao].addToTop(function(){ae();an()})});aa.onKeyDown.addToTop(function(ao,aq){var ap=aq.keyCode;if(ap==8||ap==37||ap==39){ae(ag(r.getStart()))}an()});r.onSetContent.add(an);self._hasCaretEvents=true}if(ak=="apply"){ah()}else{am()}}function R(ac){var ab=ac.startContainer,ai=ac.startOffset,ae,ah,ag,ad,af;if(ab.nodeType==3&&ai>=ab.nodeValue.length){ai=s(ab);ab=ab.parentNode;ae=true}if(ab.nodeType==1){ad=ab.childNodes;ab=ad[Math.min(ai,ad.length-1)];ah=new t(ab,c.getParent(ab,c.isBlock));if(ai>ad.length-1||ae){ah.next()}for(ag=ah.current();ag;ag=ah.next()){if(ag.nodeType==3&&!f(ag)){af=c.create("a",null,G);ag.parentNode.insertBefore(af,ag);ac.setStart(ag,0);r.setRng(ac);c.remove(af);return}}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}if(c.inline_styles){h=e.explode(c.font_size_legacy_values);d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size,10)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}});(function(b){var a=b.dom.TreeWalker;b.EnterKey=function(f){var i=f.dom,e=f.selection,d=f.settings,h=f.undoManager,c=f.schema.getNonEmptyElements();function g(B){var v=e.getRng(true),G,j,A,u,p,M,C,o,k,n,t,J,x,D;function E(N){return N&&i.isBlock(N)&&!/^(TD|TH|CAPTION|FORM)$/.test(N.nodeName)&&!/^(fixed|absolute)/i.test(N.style.position)&&i.getContentEditable(N)!=="true"}function F(O){var N;if(b.isIE&&!b.isIE11&&i.isBlock(O)){N=e.getRng();O.appendChild(i.create("span",null,"\u00a0"));e.select(O);O.lastChild.outerHTML="";e.setRng(N)}}function z(P){var O=P,Q=[],N;while(O=O.firstChild){if(i.isBlock(O)){return}if(O.nodeType==1&&!c[O.nodeName.toLowerCase()]){Q.push(O)}}N=Q.length;while(N--){O=Q[N];if(!O.hasChildNodes()||(O.firstChild==O.lastChild&&O.firstChild.nodeValue==="")){i.remove(O)}else{if(O.nodeName=="A"&&(O.innerText||O.textContent)===" "){i.remove(O)}}}}function m(O){var T,R,N,U,S,Q=O,P;N=i.createRng();if(O.hasChildNodes()){T=new a(O,O);while(R=T.current()){if(R.nodeType==3){N.setStart(R,0);N.setEnd(R,0);break}if(c[R.nodeName.toLowerCase()]){N.setStartBefore(R);N.setEndBefore(R);break}Q=R;R=T.next()}if(!R){N.setStart(Q,0);N.setEnd(Q,0)}}else{if(O.nodeName=="BR"){if(O.nextSibling&&i.isBlock(O.nextSibling)){if(!M||M<9){P=i.create("br");O.parentNode.insertBefore(P,O)}N.setStartBefore(O);N.setEndBefore(O)}else{N.setStartAfter(O);N.setEndAfter(O)}}else{N.setStart(O,0);N.setEnd(O,0)}}e.setRng(N);i.remove(P);S=i.getViewPort(f.getWin());U=i.getPos(O).y;if(US.y+S.h){f.getWin().scrollTo(0,U'}return R}function q(Q){var P,O,N;if(A.nodeType==3&&(Q?u>0:u0){return true}}}function L(){var P,O,N;if(A&&A.nodeType==3&&u>=A.nodeValue.length){if((!b.isIE||b.isIE11)&&!y()){P=i.create("br");v.insertNode(P);v.setStartAfter(P);v.setEndAfter(P);O=true}}P=i.create("br");v.insertNode(P);if((b.isIE&&!b.isIE11)&&t=="PRE"&&(!M||M<8)){P.parentNode.insertBefore(i.doc.createTextNode("\r"),P)}N=i.create("span",{}," ");P.parentNode.insertBefore(N,P);e.scrollIntoView(N);i.remove(N);if(!O){v.setStartAfter(P);v.setEndAfter(P)}else{v.setStartBefore(P);v.setEndBefore(P)}e.setRng(v);h.add()}function s(N){do{if(N.nodeType===3){N.nodeValue=N.nodeValue.replace(/^[\r\n]+/,"")}N=N.firstChild}while(N)}function K(P){var N=i.getRoot(),O,Q;O=P;while(O!==N&&i.getContentEditable(O)!=="false"){if(i.getContentEditable(O)==="true"){Q=O}O=O.parentNode}return O!==N?Q:N}function I(O){var N;if(!b.isIE||b.isIE11){O.normalize();N=O.lastChild;if(!N||(/^(left|right)$/gi.test(i.getStyle(N,"float",true)))){i.add(O,"br")}}}if(!v.collapsed){f.execCommand("Delete");return}if(B.isDefaultPrevented()){return}A=v.startContainer;u=v.startOffset;x=(d.force_p_newlines?"p":"")||d.forced_root_block;x=x?x.toUpperCase():"";M=i.doc.documentMode;C=B.shiftKey;if(A.nodeType==1&&A.hasChildNodes()){D=u>A.childNodes.length-1;A=A.childNodes[Math.min(u,A.childNodes.length-1)]||A;if(D&&A.nodeType==3){u=A.nodeValue.length}else{u=0}}j=K(A);if(!j){return}h.beforeChange();if(!i.isBlock(j)&&j!=i.getRoot()){if(!x||C){L()}return}if((x&&!C)||(!x&&C)){A=l(A,u)}p=i.getParent(A,i.isBlock);n=p?i.getParent(p.parentNode,i.isBlock):null;t=p?p.nodeName.toUpperCase():"";J=n?n.nodeName.toUpperCase():"";if(J=="LI"&&!B.ctrlKey){p=n;t=J}if(t=="LI"){if(!x&&C){L();return}if(i.isEmpty(p)){if(/^(UL|OL|LI)$/.test(n.parentNode.nodeName)){return false}H();return}}if(t=="PRE"&&d.br_in_pre!==false){if(!C){L();return}}else{if((!x&&!C&&t!="LI")||(x&&C)){L();return}}x=x||"P";if(q()){if(/^(H[1-6]|PRE)$/.test(t)&&J!="HGROUP"){o=r(x)}else{o=r()}if(d.end_container_on_empty_block&&E(n)&&i.isEmpty(p)){o=i.split(n,p)}else{i.insertAfter(o,p)}m(o)}else{if(q(true)){o=p.parentNode.insertBefore(r(),p);F(o)}else{G=v.cloneRange();G.setEndAfter(p);k=G.extractContents();s(k);o=k.firstChild;i.insertAfter(k,p);z(o);I(p);m(o)}}i.setAttrib(o,"id","");h.add()}f.onKeyDown.add(function(k,j){if(j.keyCode==13){if(g(j)!==false){j.preventDefault()}}})}})(tinymce); \ No newline at end of file diff --git a/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce_popup.js b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce_popup.js new file mode 100644 index 0000000..0808f8f --- /dev/null +++ b/conlite/external/wysiwyg/tinymce3/jscripts/tiny_mce/tiny_mce_popup.js @@ -0,0 +1,5 @@ + +// Uncomment and change this document.domain value if you are loading the script cross subdomains +// document.domain = 'moxiecode.com'; + +var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document,{ownEvents:true,proxy:tinyMCEPopup._eventProxy});b.dom.bind(window,"ready",b._onDOMLoaded,b);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write(' +{COMPRESSOR} + + + diff --git a/conlite/favicon.ico b/conlite/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fbca42b7360bfad06a9e6b3f67fe35c3d7c81acc GIT binary patch literal 29038 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 aVvXMgvCXt&iUIsa2xFiHbYJcFL;f56R8$%O literal 0 HcmV?d00001 diff --git a/conlite/frameset.php b/conlite/frameset.php new file mode 100644 index 0000000..c60d994 --- /dev/null +++ b/conlite/frameset.php @@ -0,0 +1,132 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-20 + * modified 2008-06-16, Holger Librenz, Hotfix: added check for illegal calling + * modified 2008-06-25, Timo Trautmann, Contenido Framework Constand added + * modified 2008-07-02, Frederic Schneider, add security fix and include security_class + * modified 2008-10-22, Oliver Lohkemper, update default-value for leftframewidth from 250px to 245px + * modified 2009-10-16, Ortwin Pinke, added rewrite of ampersand in frameset url + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: frameset.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + +page_open( + array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +cInclude ("includes", 'cfg_language_de.inc.php'); +cInclude ("includes", 'functions.forms.php'); + +# Create Contenido classes +$db = new DB_ConLite; +$tpl = new Template; + +# Build the Contenido +# Content area frameset +$tpl->reset(); + +if (isset($_GET["appendparameters"])) +{ + $tpl->set('s', 'LEFT', str_replace("&", "&", $sess->url("frameset_left.php?area=$area&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'RIGHT', str_replace("&", "&", $sess->url("frameset_right.php?area=$area&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'WIDTH', getEffectiveSetting("backend", "leftframewidth", 245)); +} else { + $tpl->set('s', 'LEFT', str_replace("&", "&", $sess->url("frameset_left.php?area=$area"))); + $tpl->set('s', 'RIGHT', str_replace("&", "&", $sess->url("frameset_right.php?area=$area"))); + $tpl->set('s', 'WIDTH', getEffectiveSetting("backend", "leftframewidth", 245)); +} + +$tpl->set('s', 'VERSION', $cfg['version']); +$tpl->set('s', 'LOCATION', $cfg['path']['contenido_fullhtml']); + +/* Hide menu-frame for some areas */ + +/* First of all, fetch the meta data of the area table to check if there's a menuless column */ +$aMetadata = $db->metadata($cfg["tab"]["area"]); +$bFound = false; + +foreach ($aMetadata as $aFieldDescriptor) +{ + if ($aFieldDescriptor["name"] == "menuless") + { + $bFound = true; + break; + } +} + +$menuless_areas = array(); + +if ($bFound == true) +{ + /* Yes, a menuless column does exist */ + $sql = "SELECT name FROM ".$cfg["tab"]["area"]." WHERE menuless='1'"; + $db->query($sql); + + while ($db->next_record()) + { + $menuless_areas[] = $db->f("name"); + } +} else { + /* No, use old style hard-coded menuless area stuff */ + $menuless_areas = array("str", "logs", "debug", "system"); +} + +if ( in_array($area, $menuless_areas) || (isset($menuless) && $menuless == 1)) { + $menuless = true; + if (isset($_GET["appendparameters"])) + { + $tpl->set('s', 'FRAME[1]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=1&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'FRAME[2]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=2&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'FRAME[3]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=3&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'FRAME[4]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=4&appendparameters=".$_GET["appendparameters"]))); + } else { + $tpl->set('s', 'FRAME[1]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=1"))); + $tpl->set('s', 'FRAME[2]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=2"))); + $tpl->set('s', 'FRAME[3]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=3"))); + $tpl->set('s', 'FRAME[4]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=4"))); + } +} +$tpl->set('s', 'CONTENIDOPATH', $cfg["path"]["contenido_fullhtml"]."favicon.ico"); + +if ((isset($menuless) && $menuless == 1)) { + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['frameset_menuless_content']); +} else { + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['frameset_content']); +} + +page_close(); + +?> \ No newline at end of file diff --git a/conlite/frameset_left.php b/conlite/frameset_left.php new file mode 100644 index 0000000..b6dc746 --- /dev/null +++ b/conlite/frameset_left.php @@ -0,0 +1,77 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-20 + * modified 2008-06-16, Holger Librenz, Hotfix: added check for illegal calling + * modified 2008-06-25, Timo Trautmann, Contenido Framework Constand added + * modified 2008-07-02, Frederic Schneider, new code-header and include security_class + * modified 2009-10-16, Ortwin Pinke, added rewrite of ampersand in frameset url + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: frameset_left.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + +page_open( + array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +cInclude ("includes", 'cfg_language_de.inc.php'); +cInclude ("includes", 'functions.forms.php'); + +# Create Contenido classes +$db = new DB_ConLite; +$tpl = new Template; + +# Build the Contenido +# Content area frameset +$tpl->reset(); + +if (isset($_GET["appendparameters"])) +{ + $tpl->set('s', 'FRAME[1]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=1&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'FRAME[2]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=2&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'FRAME[3]', "templates/standard/template.deco.html"); +} else { + $tpl->set('s', 'FRAME[1]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=1"))); + $tpl->set('s', 'FRAME[2]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=2"))); + $tpl->set('s', 'FRAME[3]', "templates/standard/template.deco.html"); +} + +$tpl->set('s', 'VERSION', $cfg['version']); +$tpl->set('s', 'CONTENIDOPATH', $cfg["path"]["contenido_fullhtml"]."favicon.ico"); +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['frameset_left']); + +page_close(); + +?> \ No newline at end of file diff --git a/conlite/frameset_right.php b/conlite/frameset_right.php new file mode 100644 index 0000000..58b59fc --- /dev/null +++ b/conlite/frameset_right.php @@ -0,0 +1,75 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-20# + * modified 2008-06-25, Timo Trautmann, Contenido Framework Constand added + * modified 2008-07-02, Frederic Schneider, new code-header and include security_class + * modified 2009-10-16, Ortwin Pinke, added rewrite of ampersand in frameset url + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: frameset_right.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + +page_open( + array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +cInclude ("includes", 'cfg_language_de.inc.php'); +cInclude ("includes", 'functions.forms.php'); + +# Create Contenido classes +$db = new DB_ConLite; +$tpl = new Template; + +# Build the Contenido +# Content area frameset +$tpl->reset(); + +if (isset($_GET["appendparameters"])) +{ + $tpl->set('s', 'FRAME[3]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=3&appendparameters=".$_GET["appendparameters"]))); + $tpl->set('s', 'FRAME[4]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=4&appendparameters=".$_GET["appendparameters"]))); +} else { + $tpl->set('s', 'FRAME[3]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=3"))); + $tpl->set('s', 'FRAME[4]', str_replace("&", "&", $sess->url("main.php?area=$area&frame=4"))); +} + +$tpl->set('s', 'VERSION', $cfg['version']); +$tpl->set('s', 'CONTENIDOPATH', $cfg["path"]["contenido_fullhtml"]."favicon.ico"); + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['frameset_right']); + +page_close(); + +?> \ No newline at end of file diff --git a/conlite/header.php b/conlite/header.php new file mode 100644 index 0000000..c2724c0 --- /dev/null +++ b/conlite/header.php @@ -0,0 +1,128 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-18 + * modified 2008-06-25, Timo Trautmann, Contenido Framework Constand added + * modified 2008-07-02, Frederic Schneider, add security fix and include_security_class + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: header.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + +$db = new DB_ConLite; + + +page_open( + array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +cInclude ("includes", 'cfg_language_de.inc.php'); +cInclude ("includes", 'functions.forms.php'); + +if (isset($killperms)) +{ + $sess->unregister("right_list"); + $sess->unregister("area_rights"); + $sess->unregister("item_rights"); +} + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +$sess->register("sess_area"); + +if (isset($area)) { + $sess_area = $area; +} else { + $area = (isset($sess_area)) ? $sess_area : 'login'; +} + +if (is_numeric($changelang)) { + unset($area_rights); + unset($item_rights); + + $sess->register("lang"); + $lang = $changelang; +} + +if (empty($client) || !is_numeric($client) || + (!$perm->have_perm_client("client[".$client."]") && + !$perm->have_perm_client("admin[".$client."]"))) +{ + // use first client which is accessible + $sess->register("client"); + $sql = "SELECT idclient FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC"; + $db->query($sql); + + while ($db->next_record()) + { + $mclient = $db->f("idclient"); + + if ($perm->have_perm_client("client[".$mclient."]") || + $perm->have_perm_client("admin[".$mclient."]") ) + { + unset($lang); + $client = $mclient; + break; + } + } +} else { + $sess->register("client"); +} + +if (empty($lang) || !is_numeric($lang)) { // use first language found + $sess->register("lang"); + $sql = "SELECT * FROM ".$cfg["tab"]["lang"]." AS A, ".$cfg["tab"]["clients_lang"]." AS B WHERE A.idlang=B.idlang AND idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idlang ASC"; + $db->query($sql); + $db->next_record(); + $lang = $db->f("idlang"); +} else { + $sess->register("lang"); +} + +// call http encoding header sending function +sendEncodingHeader($db, $cfg, $lang); + +$perm->load_permissions(); + +$xml = new XML_doc; +$tpl = new Template; +$nav = new Contenido_Navigation; + +rereadClients(); + +$nav->buildHeader($lang); + +page_close(); + +?> \ No newline at end of file diff --git a/conlite/images/actions/clear_right.gif b/conlite/images/actions/clear_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..7444b3ba116a4192f61c984d5c0a1d4faae3f6ca GIT binary patch literal 158 zcmZ?wbhEHb6krfw*v!M=;NY-#@80d(w|8`OL`6kqW@b*FJXu#)_x$A8Au$;-2Eof;Kdk~f5$UZByuaMLkM-6N~6 zXa|ZIZDwG<{fa?@DW%&bDbZVN{_@^{gBLwa&OS>!wj^n;F+`TPB%#pCw*{J_}krN`qKZ@5d3 z$OB@sx6?fok1SWXbUa L!7w2N6#)P{)y^5x^^{0FnJ}1rf?n!3@8(s(!X#8clSz-E(fdJ3nDiU_^@d{I+(<@Dbt35 ak&VG9mi>>nZ{!T1kqn-$elF{r5}E+k@;C|r literal 0 HcmV?d00001 diff --git a/conlite/images/article.gif b/conlite/images/article.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc112aa7214f648f164e16739f3274f546677728 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4EYin$Xj%S^=HrbG f#VdGU+O$5hsJ)+@_2iVC=88QL-oa}E7#OSpyAm2n literal 0 HcmV?d00001 diff --git a/conlite/images/article_locked.gif b/conlite/images/article_locked.gif new file mode 100644 index 0000000000000000000000000000000000000000..35566f826ebd653c5847cf1a1955158072693fed GIT binary patch literal 190 zcmV;v073spNk%w1VGsZi0J9GOTA0lMV6p%I|E$aA>+|_Hg25GSxCmvm4QRFE?e_8Z z`}g|&hqT%oakddAP@=%FJMRr1{D!tg`5CLl@TKFWK0mFs9+jk&;nRN@;ezU s3Qt8(kT6UR4uY}yW)T1e!&Aql6htmM1seeeAtNPygo_g?jExZhJ4wPuTL1t6 literal 0 HcmV?d00001 diff --git a/conlite/images/article_unlocked.gif b/conlite/images/article_unlocked.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e9bdf52665a039b16b50f921d556f6e4478c176 GIT binary patch literal 173 zcmV;e08;-)Nk%w1VGsZi0J9GO0AR8I|Nm5!%Mxq1)a3GRq|?IL?FMAC`1}1DaJl5} z_Y7yX4{5f~;qb=W?f?J)A^8LW000jFEC2ui01yBW000D9@PSDycv#vkaXp2BAVzU$ z8jv(W>o%Eo5P>2jiJ%0;Q5C#FWk4%b3<1GL5HM5_0mfz#Ks=+RU1{}ZOu=t_b ba5|o^lAyU-gv15_LN-nFyd|ZdJR$%)?PEtl literal 0 HcmV?d00001 diff --git a/conlite/images/artikel_spez_akt.gif b/conlite/images/artikel_spez_akt.gif new file mode 100644 index 0000000000000000000000000000000000000000..94358f2ffbb57394a0d33f1cb9fb905b1928349b GIT binary patch literal 171 zcmZ?wbhEHb6krfw*v!Mgkg)Op|Nr~XGraorbNi*2vPHY@Kd(P^U2DU+=LO3y|M>OP zvgHs15>Wif!pOkD!=M8a1DV0V5;39CGkdC8c7Tv1^F)zbO)ME*I$?#&44i^ES4kXC z)W`@D)M!r7Fj&AbmGPB>h)h89lTAN)Tr>|fOvvC-$TXYNC;lNYX2Xr1Bro=`S?APE PZr#wF@w-Kkk--`O<9a{D literal 0 HcmV?d00001 diff --git a/conlite/images/artikel_spez_inakt.gif b/conlite/images/artikel_spez_inakt.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf081b0949b88eaa31623bb80efc05f55bc8a6cf GIT binary patch literal 148 zcmZ?wbhEHb6krfw*v!Gekg)Op|Nq-By)0OE`PHYNvPHW#oO^EBa)<#3Q2fcl$iTqC zpaYTznZdx~DA4GcJ=H8bpiQC0K;%{;OGcJVSmCk_jzP>h?9QrpHUtRn5qT)?!mGJ^ eQGeKx&=|*=M@ynJt>$0IIJ`7rm#_;9gEas#D=vWm literal 0 HcmV?d00001 diff --git a/conlite/images/avail_clients.gif b/conlite/images/avail_clients.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc97c8c5b5cdf8c13e5b845b850e1888f65d4f42 GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%i}cN0_Et8@r>Lo+ o;NEokyRC~>ggywheU-In5>t}lp0gouYcqG-`S1&fFfdpH08#H82mk;8 literal 0 HcmV?d00001 diff --git a/conlite/images/back.gif b/conlite/images/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..23816477fcd56f970ff42d6ff9481862fe3e3df1 GIT binary patch literal 251 zcmVNk%w1VH5xq0K^{v|Ns9qOJm}Cdg`#S;A(2^z`)*JUFM&k{q^9Vr?^YiD4iSyjt{`~y?^z{Dv`rKVz{rUOdb94Rr`uy~jEv=tjQ{`uA^8LW0018VEC2ui02BZe000Ge;3tk`X`X1RqCxAvuNeSzZPS5V zLpG1=fJeqcvt%B>(o9ld6eyHtK?2ArX^X*OpdBodq!|r?*=#U~nl)T&bSf23Lk(02 zCW5;_0UpgF1RMkx7l8y3RX`2~2{Z`?4t*kG02(%yk{^^eHfw$`pe-w-q@|=G06Qp? Bc?bXi literal 0 HcmV?d00001 diff --git a/conlite/images/background.jpg b/conlite/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8c58135cab2371eff3ef64294b92d079b957b55 GIT binary patch literal 724 zcmex=*9TT{6PP!$IwBLgEV)0E9=XJ-jK?vA>4aq+tSU~wjp_{VxM zn;D7C#KdOLBn}ZqFc}%)qKwRp_KJmPeAqTzyWDa5`m?mOw4@}6IY2ktD<(@EvrY4H z5@=C!>4z8t68))9z=Qtz>TG{5cz*m;F7$7kp2uUZsC1=i zy*57|v`d7=Z7i&D+B;#<;<3X+x;IKHpZMxtQSGFj{A2KFTZ-XSF&bX)j@|gNKR)&+$ N=EdW4lkNZC1OU_LsmA~S literal 0 HcmV?d00001 diff --git a/conlite/images/bg_dark.gif b/conlite/images/bg_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..abb48866719fdd004dbd9cef7c8f858b83d4ba17 GIT binary patch literal 59 zcmZ?wbhEHbWMvRxn8?7ee*K~U|Nk5NmoqRhDE?#tk_-$wAOa-Mz{E49f92`7{E9P- JBcd4?tO4Ni4@Uq1 literal 0 HcmV?d00001 diff --git a/conlite/images/bg_high.gif b/conlite/images/bg_high.gif new file mode 100644 index 0000000000000000000000000000000000000000..94a5dbc154ced853d67a8e4976adfe166bbcb015 GIT binary patch literal 52 zcmZ?wbhEHbWMmLwn8?6zTwt+d6eufwge#j&`_vA4*vwaBTj z!m6>ut+K|mxyiG*$*HiztFXhexXG=u#jCNzu(ijpufnsr%C5A=ueHaju*0dZ!>qBz zvA4;ouEPKS{{R30A^8LV00000EC2ui00jUP000F(U?+~`Fmy_%t!$AMPbNdzWKYYc vZz>% literal 0 HcmV?d00001 diff --git a/conlite/images/but_art_conf2.gif b/conlite/images/but_art_conf2.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2015c5c86d608eccf0e789e3267e23fd65718d1 GIT binary patch literal 76 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$uls?iuBD~_LhI~oGokx Z#`ku8t`7~iU{iV0`-s!voTdnaH2}|L6;%KL literal 0 HcmV?d00001 diff --git a/conlite/images/but_art_new.gif b/conlite/images/but_art_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..0472fdc878dc9817fffa313fd47ec8e064adc858 GIT binary patch literal 74 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulrXi}cN0_Lg6n$5APZ Xzi-R;=arYzCMHi^y6Wf#Rt9STlu8vk literal 0 HcmV?d00001 diff --git a/conlite/images/but_back.gif b/conlite/images/but_back.gif new file mode 100644 index 0000000000000000000000000000000000000000..716d802faaa965baa2ab13968c9b74726feb950e GIT binary patch literal 131 zcmZ?wbhEHb6krfw*v!YUdGn6{|NmdUd~L^$y<4{I{P*wQuV26J-+%b!%h!GT4jnso z>dl+CCr+Gs_3AYP7%2W^VPs(7W6%NdKxQzo7+h%d%${oY`mDO8tf`43hl)o)S=YjS h>s3VxbT60Y80PJZ(wNF=5b?)p{=%XTLrWzFYXC$tJ3{~f literal 0 HcmV?d00001 diff --git a/conlite/images/but_cancel.gif b/conlite/images/but_cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..1037f3bf7a754c954309398d4f41fb719e370509 GIT binary patch literal 104 zcmZ?wbhEHb6krfwSj56`-AM5Dtj^cd+yDRn&wvCJf3h$#Ft9M_fW$y*8JKlFHr!dO wcgnK0!>p}vrbOeG(s+wr)vY-TcGb*@?hE0%5OMl}Z^AeG=@Xa)g@hQa0Vj_j^Z)<= literal 0 HcmV?d00001 diff --git a/conlite/images/but_cancel_off.gif b/conlite/images/but_cancel_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..360dd20308122f7571cb1d5d0368d860585c5110 GIT binary patch literal 104 zcmZ?wbhEHb6krfwSj57xdGn5&H}BlMdHetW{|rb#@h1x-0|N_#4oD27mVsHDz+ac-(YNe);R~@XYkn?!ofx<|fPujp0Hd25egFUf literal 0 HcmV?d00001 diff --git a/conlite/images/but_cat_conf2.gif b/conlite/images/but_cat_conf2.gif new file mode 100644 index 0000000000000000000000000000000000000000..f336990eb7c2e6c92724482d9c01b724d5a5ac9b GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i}Wqp{o=rl+2<~F gZ@y>Dz+ac-(YNe);R~@XYkn?!ofx<|fPujp0Hd25egFUf literal 0 HcmV?d00001 diff --git a/conlite/images/but_copy.gif b/conlite/images/but_copy.gif new file mode 100644 index 0000000000000000000000000000000000000000..f485489deade6210bb4f4af200cb7efcf27e838c GIT binary patch literal 86 zcmZ?wbhEHb6krfwn8?Jykg$;f1{8m?FfuSOG3bBLPudhnDS^sL5R=Fvr#+ g=Sr=N8q>mxx|iFc=9-mCDqk;3e%?FbJ}ZMY0Mbhqg#Z8m literal 0 HcmV?d00001 diff --git a/conlite/images/but_delete.gif b/conlite/images/but_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7251de2aa2b794c5650312624330e8c6c49f083 GIT binary patch literal 195 zcmZ?wbhEHb6krfwI3mn&-AM5N|NkGiuYOvU`euIrkK0!tBzfNP(*1H`|F0(x?#DX+ z`||sK=CIFBLjmlgAPbJ$W8`UhX*V@DUn@i ztEM?_=*!jF{mf?hwl&X8?kP-Yce%J)lBLD*VL*!PWqF%B0`G+5DDVrA^eLVm0BL-|h@h1x- z0|O_64oDJY1_O(^L8E8(RI_YrftyzqSdOxHIY#9jo3SeG>b@_DXG^qrqW7h1GQ4Hy X31B*sWU$iYlf#7WqF%B0`G+5DDVrA^eLVm0BL-|h@h1x- z0|O_64oDJY1_O(^L8E8(RI_YrftyzqSdOxHIY#9jo3SeG>b@_DXG^qrqW7h1GQ4Hy X31B*sWU$iYlf#7wnrz<>}KjRBA)aBK05AVXNk%w1VGsZi0K^{v0AR7f+3Y=r!}j_7HG;xPj>qZo`73+A-0AfH|Noi4 z;DWK(daT#T-0tx9`U7IJ~LzTcd|;fl7~*yrD$+@8`i9v*x!5Y^2K9^56+l2b=9(E z%a<&9|Mtzod2{dFyt!}J&Zeg3|Ns9p5Dj!dDnWKJupVBZ*q4$yFJslZHxhdbbWR^~ zyj{HR{T{t<*6d3Z8#p_6w+np;vJ+_O_}s|+tnS)O0VYkC?RQu780I+0J#kas;IVq< zO-Zx7Cq>Ns1}yr_4spE9b-n`4C3bA>rDZW(Ju%FN%xwJ30!+-jzKqO_SsY!4#qCwR zd`tO^c-eSaU3vNSIa${(=UHg5xFnjbU{8TjtDyip4?kndfgSq03i&FM1kdwdG<4do jpTNm<{q&;Fg*-P59^HF(|M|;TJ9Xc_d;dXIk--`OBAIta literal 0 HcmV?d00001 diff --git a/conlite/images/but_editswf.gif b/conlite/images/but_editswf.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae87011a6fbee4b4b492052912a79d1e7fc84a23 GIT binary patch literal 337 zcmZ?wbhEHb3}E14IKseiZRgcDw_n{odUsyXjKy*DzkmLIc>4Z5Jv%O}J-fAG)2ghc z+nP6jeE$CAqGKD%RzJD$bcV~s|Ns9p5Dj!dDnWKJuwGxF+?SF$FJslZHxhdbbdEPF zTrXbt-bVl1F7_jW4V<0UZig8KVS*yyCh zdtxyIBaf@^`ZcTT8xJ${)(bQmap^ZX39_*G^Oeb^Uq%cT?S?@nG7Ws25SIZ CR(THq literal 0 HcmV?d00001 diff --git a/conlite/images/but_edittext.gif b/conlite/images/but_edittext.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe4639956a69b72372d38a10afabe58fcc5b62f5 GIT binary patch literal 138 zcmZ?wbhEHb6krfw*v!emkg)Op|Nq-Bz2r>WqF%B0`G+5DDVrA^eLVm0BL-|h@h1x- z0|O_64oDJY1_O(^L8E8(RI_YrftyzqSdOxHIY#9jo3SeG>b@_DXG^qrqW7h1GQ4Hy X31B*sWU$iYlf#7aeFLRzs0z`Wb zqa$nvk~5SJq@E#;V-06bAG8d%B3KhxdqJ?Vpo{^)AjQGSvdPTB9na9w(iRZ_J8{=> AHvj+t literal 0 HcmV?d00001 diff --git a/conlite/images/but_help.gif b/conlite/images/but_help.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b11a63d22c8116f89c0677eeeeed7948fb089c8 GIT binary patch literal 79 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i1f`|_Lkp&h9Z;K cL!aBFk&!chxGt59T2++w@|D4=00stY014d}1poj5 literal 0 HcmV?d00001 diff --git a/conlite/images/but_invert_selection.gif b/conlite/images/but_invert_selection.gif new file mode 100644 index 0000000000000000000000000000000000000000..36e4043fc44ca58fb08b1f1e11f11c6472e48ea6 GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%i}cN0CMhpvBN)0$ o??RQeOzfPmDVMJ=(Rwy#Nk^5U#qpxtn^S+6acy?u;9{@_01z)5ZU6uP literal 0 HcmV?d00001 diff --git a/conlite/images/but_lastnode.gif b/conlite/images/but_lastnode.gif new file mode 100644 index 0000000000000000000000000000000000000000..604eadb5057aec2b6481636dc062677f1cc8e576 GIT binary patch literal 69 zcmZ?wbhEHb6krfwn8?Jykg##{<{kh4|7T!eQ2fcl$iTqFpaWzBWd(q2u_^kEr%%ma XFlWoH?#6ouTKZcbc}(+XWUvMR!Pyqv literal 0 HcmV?d00001 diff --git a/conlite/images/but_logout.gif b/conlite/images/but_logout.gif new file mode 100644 index 0000000000000000000000000000000000000000..85f1684263c30d1a2c1c579b3d1be64a8113d572 GIT binary patch literal 238 zcmVg)z~)|**+ij%*5=UkMFIZ@wu+yWlZj< zn)>JC=Z16gzO&v|JNMSl@2j2LNGkc@+x+qF+)6FqTS4V|W$&+}@U*Dwnu**^Fzum| z-A^;?mxuAUs{jB1A^8LW0018VEC2ui01yBW000GR;0KIkS&C+=mJqa(1O*5JKoM#r zO>;d-kyIgI=>aT(f+-PDjA$c8AW_-`IL{hD6EKtxfkAdO2wX~?fMbO5j2wYXsS-G( oz!g)YD+UY<0SzexLkkE93rRRB0}KxV0S^p)FE1#SBOf6EJK$bo5&!@I literal 0 HcmV?d00001 diff --git a/conlite/images/but_minus.gif b/conlite/images/but_minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..ecd71c6fea1d923a8dad7c111fdb03bec6d9c773 GIT binary patch literal 70 zcmZ?wbhEHb6krfwn8?JidGij2gpL3I|7T!eQ2fcl$iTqFpaWzBWd(q2@hSQZr%%ma YFlWoH?&f<38~R%xc~s3fEW%(70N<$>-T(jq literal 0 HcmV?d00001 diff --git a/conlite/images/but_move_subtree.gif b/conlite/images/but_move_subtree.gif new file mode 100644 index 0000000000000000000000000000000000000000..785ccde503f09a51619c6b58c0a07e6fe8b3790a GIT binary patch literal 138 zcmZ?wbhEHb6krfw*v!Mgkg)Op|NmN5`>sCy^zG*#&a^G_4?jwnb8gYm$FZ}{@}zJ5 z{NpzR5>Wif!pOkD!=M8a1DV0VVm_hKbLQUZSq&fm&0^_Gm^5M51_3565oZA&)~pko h9x{Eh`>MyH*Whq4g}K$+A>k(~sbN~PV literal 0 HcmV?d00001 diff --git a/conlite/images/but_move_subtree_target.gif b/conlite/images/but_move_subtree_target.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2ad54b2924f083599c8dcce22c3a8b3f453733e GIT binary patch literal 114 zcmZ?wbhEHb6krfwSj57xdGn6{|NqaNIgkg)Op|No5}Zq%*6!GHu5f3h$#Ft9M_fW$y*8JN{QHr!du r*CMcb$+fd<4C8Na=V;o&(_Fc7VU(ki;`z_c_l=t0pFa1VlffDQcM~AZ literal 0 HcmV?d00001 diff --git a/conlite/images/but_ok.gif b/conlite/images/but_ok.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba15678e24186ca18c28119583f9fa8c749c8e1b GIT binary patch literal 192 zcmZ?wbhEHb6krfwI3mrk|2%_BEbIJ@j7gO&yH7KCC9%3EuCMAkCly5(e4Hz-s$|ttTb2D{a-foLwx=-eHXj%##G~N3HeaKg4nH#!>}FS2l-_ hE2U;QJbYxZif>xOHMQ;od5c-ZeexFO%@$y=1^^bXJbeHF literal 0 HcmV?d00001 diff --git a/conlite/images/but_ok_off.gif b/conlite/images/but_ok_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..84c943987e427ebb81019dfb9e97b22435948820 GIT binary patch literal 138 zcmV;50CoRINk%w1VGsZi0J9GOv$MGW|Nr9R~Gj s3KO11sS$!P8Oxdt!O;MYt09K~!!fXF45WasLo#*>rjt~PIXxl(JA|b_EdT%j literal 0 HcmV?d00001 diff --git a/conlite/images/but_online.gif b/conlite/images/but_online.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9e8b72f742b65dda8c594ce2b7ad069aa17e7fc GIT binary patch literal 138 zcmV;50CoRINk%w1VGsZi0J9GO0AR7d&jA1b|5K1;Y@^aEd5NvX5iNR$=kWMBgu*<9 z!{qMwtHTp@snv3))BpegA^8LW000jFEC2ui01yBW000Cx@PSEdl{V|mCs_;80f}G= sN#~qG(i_@% literal 0 HcmV?d00001 diff --git a/conlite/images/but_plus.gif b/conlite/images/but_plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..bffd8a0f25552160ca6cc5502744ca3503abda44 GIT binary patch literal 75 zcmZ?wbhEHb6krfwn8?Jykg##{<{kh4|7T!eQ2fcl$iTqFpaWzBWd(q2nJM~>r%%ma dFejv`N>8k+i9hS$kCLgL3vZv==FP}p4FEQR7+wGX literal 0 HcmV?d00001 diff --git a/conlite/images/but_preview.gif b/conlite/images/but_preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..5975ba0e9fba16b04d66bf83fc7df31e2bf3569a GIT binary patch literal 167 zcmV;Y09gM=Nk%w1VGsZi0J9GO0AR6Gl*<%sx8v>i|NsBO+U*^3x<7}+)a3FFXtlA< z=kfRYc&pY&jK}Bj_y7O^A^8LW000jFEC2ui01yBW000D3@PSEdl{RZ|)ELUK0n88> zMldkife4j=h*l8*#FPg`wj?CNv=k19qEX;_ VN0UUki%zf4Xf+{#i8me*06XcIMGOD{ literal 0 HcmV?d00001 diff --git a/conlite/images/but_properties.gif b/conlite/images/but_properties.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2015c5c86d608eccf0e789e3267e23fd65718d1 GIT binary patch literal 76 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$uls?iuBD~_LhI~oGokx Z#`ku8t`7~iU{iV0`-s!voTdnaH2}|L6;%KL literal 0 HcmV?d00001 diff --git a/conlite/images/but_refresh.gif b/conlite/images/but_refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..c828989e483a017ea208b6ce7cce80660b16d6b9 GIT binary patch literal 211 zcmZ?wbhEHb6krfwI3mozkg)Op|Nq~9{>fQJmqPMt>|zWH|Y?z=Ph-!l*g6o0ZXGB5};=zx@i>||gKc)-$=64{lu zs*hQO<>G=hz7GttHCg@RxENdb9V+&6EIzEb)nE?~r-P${#*$^B4u>QSbb?L=UhMdy e$kg=kh2Vr0l6?-zOC?<5CNx^L2l+cOSOWllm`Mr% literal 0 HcmV?d00001 diff --git a/conlite/images/but_rename.gif b/conlite/images/but_rename.gif new file mode 100644 index 0000000000000000000000000000000000000000..b529a4cba9f93dbd1704161b67f5f463595ed5c4 GIT binary patch literal 84 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulsiiu5ho{o=rl+2<~F iGtaBqUB|kBqs~8EPV>}UE!TYxudaSeyXwTqU=0Ahmm2Q? literal 0 HcmV?d00001 diff --git a/conlite/images/but_rss.gif b/conlite/images/but_rss.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b678fd4e29bb5f1633c12e332ba95baf6832687 GIT binary patch literal 156 zcmV;N0Av40Nk%w1VGsZi0J9GO0AR8I|Nl^u$-md@fUww)x!vFE^NU{dcBvgxJwzE KC+4#`0suQeT|k@w literal 0 HcmV?d00001 diff --git a/conlite/images/but_setreminder.gif b/conlite/images/but_setreminder.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd2e025caa84ae69f4c13b07ceb09c3085befa5e GIT binary patch literal 142 zcmV;90CE3ENk%w1VGsZi0J9GO0AR5-g2Mm*|E|pD9&@_J+wK@|xWL%#`TPCY=kr&V z%=Y>GEquR$u-J{b+yDRoA^8LW000jFEC2ui01yBW000C#@PSEdl{V{o$hOMxO~F)@ wlaLXJ6NssxT1>K_>1H&e*7cK64|SrCMAkCly5(e4Hz-s$|ttTb2D{a-foLwx=-eHXj%##G~N3HeaKg4nH#!>}FS2l-_ hE2U;QJbYxZif>xOHMQ;od5c-ZeexFO%@$y=1^^bXJbeHF literal 0 HcmV?d00001 diff --git a/conlite/images/but_sync_art.gif b/conlite/images/but_sync_art.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0b760dc916fa79a6eebca8b73e69c991dc1b060 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i}cN0_Eui0hcUqY fY3QequWF-bG%8-2JFPQI^4YRQUh+L!A`I35YH}F$ literal 0 HcmV?d00001 diff --git a/conlite/images/but_sync_art_off.gif b/conlite/images/but_sync_art_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cd0ebb1a53b493768bc1cb69a963aa28de6a801 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4EYde~*;{#~9>xIo gr=g!dzN(F$(WrQ7?zGM<$!E(JdCB)^i7;3L0J4%A0ssI2 literal 0 HcmV?d00001 diff --git a/conlite/images/but_sync_cat.gif b/conlite/images/but_sync_cat.gif new file mode 100644 index 0000000000000000000000000000000000000000..38f0b10dd45866244792d7521ed15942e21ced2d GIT binary patch literal 86 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulsii}Wqp{o=rl*$bVb km`@a^pS2BZpLloqO!ie>nXeNclt-2PJ+xsVH!FiR00mJU0RR91 literal 0 HcmV?d00001 diff --git a/conlite/images/but_sync_cat_off.gif b/conlite/images/but_sync_cat_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe6fb4ad2ca2eccbc49dd523dab5a8affd03ba68 GIT binary patch literal 86 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4F4DJX_lpBJW-oM# kVm?uve%3aued68aGuc;lWxh^)P##tC_t1ug+^h`N08ynL4gdfE literal 0 HcmV?d00001 diff --git a/conlite/images/but_time_1.gif b/conlite/images/but_time_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..05d8cc5ed983dde7379a972738a53424ad9869b3 GIT binary patch literal 152 zcmV;J0B8S4Nk%w1VGsZi0J9GOv$MGW|NpkOyW-;H+uPmf=;`qA@!#L!!^6kw>g@FN z^})f#%*@Zo$jklx{Qv*}A^8LW000jFEC2ui01yBW000C<@PSEdl{V{%jxj^C0Y?x3 zW>5$jk)r8fEzX;oBIVk5Q6)E6O7RO;0z}Wt*; zllJ)A?((|d=YIYE`2YX_A^8LW000jFEC2ui01yBW000C=@PSEdl{V{16hcR_0ZI@6 zW-tg@lcK3%5zd>MB9+{5I#dkaEwBLcD#Xfec>7TZ%v+99iaIL-19P<@7(Stqc!C)N H9uWXLcmP9c literal 0 HcmV?d00001 diff --git a/conlite/images/but_todo.gif b/conlite/images/but_todo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe4639956a69b72372d38a10afabe58fcc5b62f5 GIT binary patch literal 138 zcmZ?wbhEHb6krfw*v!emkg)Op|Nq-Bz2r>WqF%B0`G+5DDVrA^eLVm0BL-|h@h1x- z0|O_64oDJY1_O(^L8E8(RI_YrftyzqSdOxHIY#9jo3SeG>b@_DXG^qrqW7h1GQ4Hy X31B*sWU$iYlf#7OC}l~qBtvPD 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 AcsPMF2Yp)+})V literal 0 HcmV?d00001 diff --git a/conlite/images/configure.gif b/conlite/images/configure.gif new file mode 100644 index 0000000000000000000000000000000000000000..2624387a58334681193f321921732f58e033cc1c GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4JcV~<`RaK`lHc6y g-h9u7{X^>mjcHGQmcClSmY04=n>#Txgn_{t0OrvffdBvi literal 0 HcmV?d00001 diff --git a/conlite/images/conlogo.gif b/conlite/images/conlogo.gif new file mode 100644 index 0000000000000000000000000000000000000000..19e07563fce85a4f323b72f2ad5ca91384e00a6c GIT binary patch literal 3909 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 D;shaM literal 0 HcmV?d00001 diff --git a/conlite/images/dash.gif b/conlite/images/dash.gif new file mode 100644 index 0000000000000000000000000000000000000000..19404fb2c2e4ed3e23f7373fc5bb468ed651c90d GIT binary patch literal 43 scmZ?wbhEHbWMyDvXkcL2ym#+!Negf(N%HZ{PR+ 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%0AA*Qn_(>Xh2_>mBD6`$Gk8+ZdlG4)+-82tg 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 literal 0 HcmV?d00001 diff --git a/conlite/images/delete.gif b/conlite/images/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7251de2aa2b794c5650312624330e8c6c49f083 GIT binary patch literal 195 zcmZ?wbhEHb6krfwI3mn&-AM5N|NkGiuYOvU`euIrkK0!tBzfNP(*1H`|F0(x?#DX+ z`||sK=CIFBLjmlgAPbJ$W8`UhX*V@DUn@i ztEM?_=*!jF{mf?hwl&X8?kP-Yce%J)lBLD*VL*!Pg;}IvwYi{XC~(q`i?qZS}n`b*0>-bMRxLOHO&tpM&Th#Lb-xngeI^x QaX;95jzPpqmWja{0F%E`8~^|S literal 0 HcmV?d00001 diff --git a/conlite/images/delete_inact_g.gif b/conlite/images/delete_inact_g.gif new file mode 100644 index 0000000000000000000000000000000000000000..268c7e2d48a50bf1282ec35999dd2007f9c3aa7d GIT binary patch literal 195 zcmZ?wbhEHb6krfwI3mojdGn6{|Nnpb^y%EWi%*_B+q37u?c4W`9zFT$)tj$hzrB6? z?#h+xr%#{%^XJdQhmXH}`TF6*$Dcoc9zJ}WfjFS}lZBCiL6|`Yq#R@?1FORWmY$Tz zuC!It95?jk>g;}IvwYi{XC~(q`i?qZS}n`b*0>-bMRxLOHO&tpM&Th#Lb-xngeI^x QaX;95jzPpqmWja{0F%E`8~^|S literal 0 HcmV?d00001 diff --git a/conlite/images/delete_inact_h.gif b/conlite/images/delete_inact_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..268c7e2d48a50bf1282ec35999dd2007f9c3aa7d GIT binary patch literal 195 zcmZ?wbhEHb6krfwI3mojdGn6{|Nnpb^y%EWi%*_B+q37u?c4W`9zFT$)tj$hzrB6? z?#h+xr%#{%^XJdQhmXH}`TF6*$Dcoc9zJ}WfjFS}lZBCiL6|`Yq#R@?1FORWmY$Tz zuC!It95?jk>g;}IvwYi{XC~(q`i?qZS}n`b*0>-bMRxLOHO&tpM&Th#Lb-xngeI^x QaX;95jzPpqmWja{0F%E`8~^|S literal 0 HcmV?d00001 diff --git a/conlite/images/delete_over.gif b/conlite/images/delete_over.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7251de2aa2b794c5650312624330e8c6c49f083 GIT binary patch literal 195 zcmZ?wbhEHb6krfwI3mn&-AM5N|NkGiuYOvU`euIrkK0!tBzfNP(*1H`|F0(x?#DX+ z`||sK=CIFBLjmlgAPbJ$W8`UhX*V@DUn@i ztEM?_=*!jF{mf?hwl&X8?kP-Yce%J)lBLD*VL*!PWqF%B0`G+5DDVrA^eLVm0BL-|h@h1x- z0|O_64oDJY1_O(^L8E8(RI_YrftyzqSdOxHIY#9jo3SeG>b@_DXG^qrqW7h1GQ4Hy X31B*sWU$iYlf#7(sK?9tKG{r&yI!p6wR z%=Y&8`}_R4xxV4yKZlhyVaPqI^aF literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/excel.gif b/conlite/images/filetypes/excel.gif new file mode 100644 index 0000000000000000000000000000000000000000..d241a28072c9da34fc0685f3029559c9d1e8644c GIT binary patch literal 77 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4aw2^*m%Zgz<}teH b@tO0^UHe>*JWv~VSz(E-i literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/gif.gif b/conlite/images/filetypes/gif.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0384a88b5e9e00107e05bc18834f4e914fa3eb4 GIT binary patch literal 79 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD43L~Wz2V+}MpcBt8UXeC8lV6G literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/html.gif b/conlite/images/filetypes/html.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ce764edc612ecb5693520a5ccd07a75a4dc34a7 GIT binary patch literal 81 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4N+NwTm%Zgr=IU_c f{=hvg{axryi=bJai_%w4y2O2a)0sU^j11NQHa8qe literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/javascript.gif b/conlite/images/filetypes/javascript.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6dc0ff44aa0d2d9518c698c47a625cd4cc2d210 GIT binary patch literal 73 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4QX+jbm%ZhG%)QA^ XVAGNO|_8 NL+7$&OnF2A06P;$JO=;( literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/odf.gif b/conlite/images/filetypes/odf.gif new file mode 100644 index 0000000000000000000000000000000000000000..17a6c50c38ffa78bf6861b271754f1bf90faf5fd GIT binary patch literal 81 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4N+NwTm%Zg*%+ukP f9ehIi%^TS(8d?z*vm(U3-fN~(octex??aofPujp08B?4kpKVy literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/ppt.gif b/conlite/images/filetypes/ppt.gif new file mode 100644 index 0000000000000000000000000000000000000000..d077c9b0a224b9c17ff882674ff46b11fc64d5da GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4$|8L;m%Zg*Y?HX? g7SlD6lwc$I9>T@c;k+A^8LW000jFEC2ui01yBW000Cr@PSEdl{RY|(9S{kRe=x? m;}lGTkggN+Qo}qQcB5!TxWJo4XgD%BLavl@Nx>)|5db^<%t74% literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/swf.gif b/conlite/images/filetypes/swf.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5749c7a9de3331300beb3d47afd2a6585b10d91 GIT binary patch literal 80 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4iXwe8m%Zg*9FjP% etBGyv=i1ae9%(bgXQg*WzT-a5Wz5OSU=08$iW=1b literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/txt.gif b/conlite/images/filetypes/txt.gif new file mode 100644 index 0000000000000000000000000000000000000000..885af78b0b349b71038c9fb253d522850c68d8a4 GIT binary patch literal 78 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4@*;gRm%Zgr=KdU5 cs(x4D$&^_6jt;Tyy_ZgH(>uM!iIKq?0P2(){Qv*} literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/unknown.gif b/conlite/images/filetypes/unknown.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4b939bc8ed33164c430b1032723bb923b36ceed GIT binary patch literal 79 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4AksH;*;{`98H!9^ c4}ETzMn=y3;kr~ZYE@Cz%U1@g0vH&q0Z!H!5&!@I literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/vcf.gif b/conlite/images/filetypes/vcf.gif new file mode 100644 index 0000000000000000000000000000000000000000..93ee9b8047560ddfad9cee258a5e564d7e164004 GIT binary patch literal 77 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4aw2^*m%Zg*?2|Ze bl@{Nu^aX+E)XXG2qF$Za#%IjQ%3uuuzM&X+ literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/word.gif b/conlite/images/filetypes/word.gif new file mode 100644 index 0000000000000000000000000000000000000000..84e293f390bc862bdfd4b453711ba1b60b81ebe2 GIT binary patch literal 80 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD4iXwe8m%Zgr<~F*> eb?9oxcb=x{s&ZFuRK~R>z2iR45zNWTU=08qf*Pp+ literal 0 HcmV?d00001 diff --git a/conlite/images/filetypes/zip.gif b/conlite/images/filetypes/zip.gif new file mode 100644 index 0000000000000000000000000000000000000000..48401ddd726d39d6f0f5dcb78145160bc4ec6334 GIT binary patch literal 79 zcmZ?wbhEHb6krfwn8?JidGn6{V8Fn@p!k!8k%57UK?leN$_fD43L5MGvd)r{j^oF#{rdHb0R|L*vVfU7AQGgOfmu{zv+@@M Xx1)3R^y_sm&ATgVz#wkN$zTlt-@O+X literal 0 HcmV?d00001 diff --git a/conlite/images/folder.gif b/conlite/images/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..1948043fc1638410104f51c9075e98bcdb9377de GIT binary patch literal 64 zcmZ?wbhEHb6krfwXkcX6ym*k+H0DZu+Z*Q(l*?RbQ=W8M!Ecfx#L8_0b#^ literal 0 HcmV?d00001 diff --git a/conlite/images/folder_delocked.gif b/conlite/images/folder_delocked.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6b016463483e0eacf341a3e7b16813a17d273f7 GIT binary patch literal 85 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4CepWP_lpBJW}myj j-E^$DSiELIN5-LPudhnDS^sL5R=Fvr#+ g=Sr=N8q>mxx|iFc=9-mCDqk;3e%?FbJ}ZMY0Mbhqg#Z8m literal 0 HcmV?d00001 diff --git a/conlite/images/folder_duplicate_off.gif b/conlite/images/folder_duplicate_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..bfce0798cd23e7f2f707d65496ff56cce0519c0e GIT binary patch literal 86 zcmZ?wbhEHb6krfwn8?JidGihi7*PDl!pOkD#GnHb0Le2jsf+Y+9$L0vq9%8hz#LnP goGZ05YD^0&>RxV(nrl`nseHXC`FZbz`>YJs03NOvk^lez literal 0 HcmV?d00001 diff --git a/conlite/images/folder_lock.gif b/conlite/images/folder_lock.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba9deac2a4873f0bc246a1ca5416262605f7e93e GIT binary patch literal 87 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%i1aPm{o=rl+2=0& lZn_s??aw+{qVIa!q-3sjD&kEWs?SKSPMW?{-ieXH8UQ9u8}R@D literal 0 HcmV?d00001 diff --git a/conlite/images/folder_locked.gif b/conlite/images/folder_locked.gif new file mode 100644 index 0000000000000000000000000000000000000000..97081dff48f7a784c5bec7ddc321b5b2f8961702 GIT binary patch literal 87 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4A=0;K_lpBJW}mz8 lyXjtpwLj}*iN5P?lajgCsfagis6HdPI%)b+c_&5&YXEbu9R2_R literal 0 HcmV?d00001 diff --git a/conlite/images/folder_move.gif b/conlite/images/folder_move.gif new file mode 100644 index 0000000000000000000000000000000000000000..261f8041a647e2260c5475ea9b5adcddc23ad71a GIT binary patch literal 138 zcmZ?wbhEHb6krfw*v!MQdGn6{|NkF2aOBgc&wu{>*|u%>qeo93KYn`Q!sYYlFa7@g zXZ!Zu3`junCkrD30}q1^NDO2K1B>~DM$eghr)M>M{5OlGFJaPzSqlW1xI~-i;h0ls@lhszLhg=3j;Qw_>+Z^ zfq|1j2P6qHgMmfcpwV;k-sxElAOFo_=}TG3+UU9P)sb!akqa^cl~}xFmKpN2O>?-Q LwaVo<2ZJ>LU^Xc; literal 0 HcmV?d00001 diff --git a/conlite/images/folder_movedown_inact.gif b/conlite/images/folder_movedown_inact.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fbd4ed9885a4066b0109aece8e65bace6f0f877 GIT binary patch literal 126 zcmZ?wbhEHb6krfw*v!eWdGn6{|NsB_^XI~a%bz}dK5*d3R`RDVG-wfD*;!hSv z1_n+B9grl*3yj+u literal 0 HcmV?d00001 diff --git a/conlite/images/grid_collapse.gif b/conlite/images/grid_collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..ecd71c6fea1d923a8dad7c111fdb03bec6d9c773 GIT binary patch literal 70 zcmZ?wbhEHb6krfwn8?JidGij2gpL3I|7T!eQ2fcl$iTqFpaWzBWd(q2@hSQZr%%ma YFlWoH?&f<38~R%xc~s3fEW%(70N<$>-T(jq literal 0 HcmV?d00001 diff --git a/conlite/images/grid_expand.gif b/conlite/images/grid_expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..bffd8a0f25552160ca6cc5502744ca3503abda44 GIT binary patch literal 75 zcmZ?wbhEHb6krfwn8?Jykg##{<{kh4|7T!eQ2fcl$iTqFpaWzBWd(q2nJM~>r%%ma dFejv`N>8k+i9hS$kCLgL3vZv==FP}p4FEQR7+wGX literal 0 HcmV?d00001 diff --git a/conlite/images/grid_folder.gif b/conlite/images/grid_folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..1948043fc1638410104f51c9075e98bcdb9377de GIT binary patch literal 64 zcmZ?wbhEHb6krfwXkcX6ym-T(jq literal 0 HcmV?d00001 diff --git a/conlite/images/grid_linedownrightend.gif b/conlite/images/grid_linedownrightend.gif new file mode 100644 index 0000000000000000000000000000000000000000..48da527c5d9bd0a08906239daa1cc30b2227d502 GIT binary patch literal 65 zcmZ?wbhEHb6k-r!XkdT>#h)yU3=E76Iv_qshJi_zux_Kkh-A0Ml^q$Yf+|+m9me| MQMQ#99Gnc+09GF+>;M1& literal 0 HcmV?d00001 diff --git a/conlite/images/groups_o.gif b/conlite/images/groups_o.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1262aa2addc8a923e0985a4838aad463d794e8a GIT binary patch literal 119 zcmZ?wbhEHb6krfwSj58c|NsBZn|Iv2dHd$gI}Aub@h1x-0|N_#4oD27mVw#EW8z8`sGnh$cHT}o>ry) zxO?OO-#^z)MDBR$-V3pKzk2SkCl78pD1E1AK_r+u5>uU~xAPX2jY@t31}o>nB? zk9Ge0`6B}iDE?$&WMGhG&;bd6>||hdOJMIwiR?;SwT#)3M>~?kQ9&d-n!SDN%FVY} ziaRqi8ard+cxf@EO)FuBp~9padY?Ob%R-G4j)(5PuU?_f!e9*mLuy;C literal 0 HcmV?d00001 diff --git a/conlite/images/icon_warning.gif b/conlite/images/icon_warning.gif new file mode 100644 index 0000000000000000000000000000000000000000..23528805018f06fa25b91cbe3260b404b946ad2d GIT binary patch literal 91 zcmZ?wbhEHb6krfwSj56`-AM5N|NpONb-te7&VU3If3h$#Ft9M_fW$y*8JHD3Hr!dO jcgi!8W9!`k2XYRjG zo_GG?n{OxYzLPH8Y1VXzCw(hh%H|u-KQj;q6o0ZXGB5};=zx@i>||iIeZbO_64{lu zY8Hzy3-7}<-U_zaD_K0^xEee73o7>V?Q?k;+Q7rkbTGlfNMgl}>t5bQRr{B&w`ee3 KxMH#ZgEatv>p}(q literal 0 HcmV?d00001 diff --git a/conlite/images/index.php b/conlite/images/index.php new file mode 100644 index 0000000..ef8b776 --- /dev/null +++ b/conlite/images/index.php @@ -0,0 +1,4 @@ + diff --git a/conlite/images/info.gif b/conlite/images/info.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f8629e962a5ddf25582ec9694fa4843dea54d84 GIT binary patch literal 90 zcmZ?wbhEHb6krfwSj57>kg)Op|No5}Zq%*6!GHu5f3h$#Ft9M_fW$y*8JOigHr!dO icgi!8W9!{BEe}o`G#p@?B{OTKsQ1p4KNDP-7_0$)${WQ1 literal 0 HcmV?d00001 diff --git a/conlite/images/isstart0.gif b/conlite/images/isstart0.gif new file mode 100644 index 0000000000000000000000000000000000000000..06c2bf37435fabb71698c34d5d0aa70ab42373c9 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i}Z0GT9$vK`FLYP f@e1CTHm#2=YVRj!Jvk+(xnfU*ckr431_o;Ya`G8G literal 0 HcmV?d00001 diff --git a/conlite/images/isstart0m.gif b/conlite/images/isstart0m.gif new file mode 100644 index 0000000000000000000000000000000000000000..839e63660aee1e8d8c78f9a15aa2ac3bb48c3976 GIT binary patch literal 101 zcmZ?wbhEHb6krfwn8?h)kg$<~f#LuE|3FglCkrD312cmTkPVa-U|?V}i?L%qJ+oaT z`qe=b%~r)u{Q$n_jgk&t&nK<(;X3x-^oW}G?usRgxBQ*y+OROzeQVZB9-He67#OSp DW_Te( literal 0 HcmV?d00001 diff --git a/conlite/images/isstart0mr.gif b/conlite/images/isstart0mr.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c130eb5bdc1b6642aa904e50a1c2d7f3b28e47e GIT binary patch literal 159 zcmV;Q0AT+|Nk%w1VGsZi0J9GO0AR5I00960|B1ER>hk$`tJV)`whU*r`TPB)$K$us z=>uZ2BX+!EozM39`~Uy|A^8LW000jFEC2ui01yBW000C`@P+vvxVY9yExy*qRUZg) zK_v*ECXLSu93_B~SCKH^?EwXWV?YDARI8+b&@djAN#??b2_goD3pJ|uX|}i0=~|f0rN`qQbGj#Z zy#r#h_WAtz`~7L5(EtDdA^8LW000jFEC2ui01yBW000C#@PSDycv#vk@#d2T1Y}@k wVrc@z=MG5XT0_7LZKdvkaOk{}z_FOs8iT@YGB7AUJAl#^U0Sao>>~mIJBvg-^Z)<= literal 0 HcmV?d00001 diff --git a/conlite/images/isstart1.gif b/conlite/images/isstart1.gif new file mode 100644 index 0000000000000000000000000000000000000000..649049d89ed8b3e5f8119667ac39fc8ce7f729d0 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Ji|2)J0|Nj}lK=CIFBLf2ygARxXl4oF27U|EuxlE>!y0tNw00960|N8st!_p4j=6KfNTENf);OKW#_P zC;k5T$JHL$<7w;gt^fc4A^8LW000jFEC2ui01yBW000C|@P+vvxVY9yExy*qRUZg) zK_v*ECXLSu5G8<;SK%<fPpe!_p7J(G17c9@*n*;pvIi;9AMn zC;k5Tz|aHe?xpSVw*UYDA^8LW000jFEC2ui01yBW000Cz@PSDycv#vk@#d2T1SDBy uVrdp%J2XaX4Z(u2m8u6qlJ6zKfgz*W2(rn*q4?+k$ksDSt%9tN2mm`oK|j&} literal 0 HcmV?d00001 diff --git a/conlite/images/lock_closed.gif b/conlite/images/lock_closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..667d613dc146103056fd42fca2833b2bc8a4ebce GIT binary patch literal 89 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%iS%(ET9$vK`MB?u nH=KLo52!vAu~E&8yIVEu&5L<*mghdQY3Kj*jnda(V6X-NI3OG< literal 0 HcmV?d00001 diff --git a/conlite/images/lock_open.gif b/conlite/images/lock_open.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f4589cd194d5d18b22cb8a101a8d343d25bbda5 GIT binary patch literal 85 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4Cep`wXj%S^=HtFs jd~TF~TE~)Lp?146PGeQw%I9_Gf1g_&qjgO~guxmB90MHm literal 0 HcmV?d00001 diff --git a/conlite/images/my_contenido.gif b/conlite/images/my_contenido.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bfa1e830096a5862904f701842ab9c62cf97de6 GIT binary patch literal 154 zcmV;L0A>G2Nk%w1VGsZi0J9GO0AR8I|NpPe=a0GFK#0YCuGjDN`VeZiFn++#;qV}I zyI`EopTpw6*X!Tw^#A|>A^8LW000jFEC2ui01yBW000C>@PSEdl{V|myGBA_Fbanl zLF$y&Av8%kFa)qP168DHK`Fe&WXJPO5XFhhfiesRwLwB~un>5GM3qB`1q29>cub~X I#E%F7JJvHmg#Z8m literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter.gif b/conlite/images/newsletter.gif new file mode 100644 index 0000000000000000000000000000000000000000..9930f9aa52c448a84d012a6434b26a064f58a93d GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4Ez&o0+1vL`b3&GN n9cGQpPD#8|?vtF+s5Wa_Vr5*MX`ZZlx$cqg43C9H7#OSpmjfIl literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_16.gif b/conlite/images/newsletter_16.gif new file mode 100644 index 0000000000000000000000000000000000000000..d95569d9158c8c4d9b0b16136de9ff8e5e963f96 GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%i}cN0_V#_#oRDQ* nhgl=DQxfl#`y^*Hs?C~~SQ!^*nkTDXu6yJ=!((9)1_o;YMtd6; literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_dispatch_16.gif b/conlite/images/newsletter_dispatch_16.gif new file mode 100644 index 0000000000000000000000000000000000000000..2431855acf28347e6a56f388389f1b27f2a51935 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i}cN0_V#_#oRC9V f@eEr_t0IFn@-Aky-C42r%}vKoJqB9>7#OSpg#Q|U literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_dispatch_16_off.gif b/conlite/images/newsletter_dispatch_16_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..74a4de9cdfeaf998aabb3421148a59ea899b2c48 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4EYde~+1vL`b3zVf g#WQRzt%?lR$h(-)c4x)fH#Z$W^%!gkU|_HY0L>p8i~s-t literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_dispatch_off.gif b/conlite/images/newsletter_dispatch_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..74a4de9cdfeaf998aabb3421148a59ea899b2c48 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4EYde~+1vL`b3zVf g#WQRzt%?lR$h(-)c4x)fH#Z$W^%!gkU|_HY0L>p8i~s-t literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_dispatch_on.gif b/conlite/images/newsletter_dispatch_on.gif new file mode 100644 index 0000000000000000000000000000000000000000..2431855acf28347e6a56f388389f1b27f2a51935 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i}cN0_V#_#oRC9V f@eEr_t0IFn@-Aky-C42r%}vKoJqB9>7#OSpg#Q|U literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_off.gif b/conlite/images/newsletter_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..9930f9aa52c448a84d012a6434b26a064f58a93d GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4Ez&o0+1vL`b3&GN n9cGQpPD#8|?vtF+s5Wa_Vr5*MX`ZZlx$cqg43C9H7#OSpmjfIl literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_on.gif b/conlite/images/newsletter_on.gif new file mode 100644 index 0000000000000000000000000000000000000000..d95569d9158c8c4d9b0b16136de9ff8e5e963f96 GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%i}cN0_V#_#oRDQ* nhgl=DQxfl#`y^*Hs?C~~SQ!^*nkTDXu6yJ=!((9)1_o;YMtd6; literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_recipientgroups_off.gif b/conlite/images/newsletter_recipientgroups_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac7f9313cd04361947c816b8868503b7009761aa GIT binary patch literal 122 zcmZ?wbhEHb6krfwSj58c|NsBZn|Iv2dHd$gI}Aub@h1x-0|N_#4oD27mVw#cW24R? zpMwev6~#ME-(*CT7S2zzl{M%{pD^uk`dJ3gNJd+Gt9#FF@AF8A2(@pyvuK&JTjBD@^v0XMh0sDc|<0; literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_recipients_off.gif b/conlite/images/newsletter_recipients_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..1330b81a95fafc378fcccaf3a4762720c77f6db5 GIT binary patch literal 111 zcmZ?wbhEHb6krfwSj57xdGn6{|Nq~-dHd$gI}Aub@h1x-0|N_#4oD27mVw#CV}s5i zA4dhJ3S)ljP4aWuL$9gorB*Vn+`6rC`LZ>qFX+`i&yan;@8){;$8Wnkg)Op|NnLCZ!~VW!GHu5f3h$#Ft9M_fW$y*8JJBxHs~Dk zaa3@sFy^=3BtMru^qQ((Y9-Ukt=k%xFI#i^f?nKRlcg5EYa+dqn$y6I3+S3rgz+epk+hrSL literal 0 HcmV?d00001 diff --git a/conlite/images/newsletter_sendtest_16_off.gif b/conlite/images/newsletter_sendtest_16_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..7dd250267e005b0dc8a62a01bab4a8a0ff308d05 GIT binary patch literal 85 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4Cek-^+1vL`b3&Fe jygDOZ)Z+MXVP?4J+!bFp$XV`NCsS>FXiq}`1A{dHCc7MP literal 0 HcmV?d00001 diff --git a/conlite/images/offline.gif b/conlite/images/offline.gif new file mode 100644 index 0000000000000000000000000000000000000000..15852f0e6ec2109bfa2a9aabf485169ad5418a18 GIT binary patch literal 93 zcmZ?wbhEHb6krfwn8?h)kg)Op|NjhNp!k!8k%57kK?lSG$ultN$@I-!_Eum~kDkry rH8*6;&gRCkwJ1$%csOI4TK9q!tE(Y7kGI&S{`t#c)YRd~$Y2csoERPG literal 0 HcmV?d00001 diff --git a/conlite/images/offline_off.gif b/conlite/images/offline_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..3de858dcd6235a5f1f66f55c88c821ce511e8336 GIT binary patch literal 93 zcmZ?wbhEHb6krfwn8?hqdGn6{|Nk?9f#OdVMg|6E1|1L&B+tO4C(}1`*;|1{J$g2) r*W8dXJDVHF)}l16;o*#FYTXM`tgeRSJl3s$!mIFBu(Ik;^L61@NGxu)dXbmoU8a{;nOc5!oXk+0Ehe>TmS$7 literal 0 HcmV?d00001 diff --git a/conlite/images/open_all.gif b/conlite/images/open_all.gif new file mode 100644 index 0000000000000000000000000000000000000000..4818400dc83c1c29bb90aaa1701225373ef08946 GIT binary patch literal 53 zcmZ?wbhEHbWM^P!XkcVuNZ9!Q|9{1wEI=kBgAM}_fMgh$czO~gSIlNmF3#N-!oXk+ E08<+bM*si- literal 0 HcmV?d00001 diff --git a/conlite/images/ordner_oben.gif b/conlite/images/ordner_oben.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b8a3b0602ad4cc0a60e363a6350ea7660a1b164 GIT binary patch literal 126 zcmZ?wbhEHb6krfw*v!emkg)Op|NpVG&T^)0x%%|e{KJp5s`h>R`RDVG-wfD*;!hSv z1_n+B9grl*34dnawVIAQaJyZ0a7y8GblwYx=&PC2#h7tPtm zoV4lE&HJkkU32X?uxRfU#h)w;AfN*xKxQzoC|zjaR4IM`Oq1!6oP>&x`83B30?%$~ T@_snhR8a8EMC6K}D}yxvR+2Jn literal 0 HcmV?d00001 diff --git a/conlite/images/paging/previous.gif b/conlite/images/paging/previous.gif new file mode 100644 index 0000000000000000000000000000000000000000..4fcf515a2b5c5f53386ac5581901f44452df92ba GIT binary patch literal 119 zcmZ?wbhEHb4dnawVIAQaJyZ0a7y8GblwYx=&PC2#h7tPtm zoV4lE&HJkkU32X?uyp@b#h)w;AfN*xKxQzos0er@sLef}$QvLqN!`Hn!^C9{IxlB2 V^?o{N#39qvd)vX#XCDWHH2|EKG2H+F literal 0 HcmV?d00001 diff --git a/conlite/images/pfeil_links.gif b/conlite/images/pfeil_links.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0fa9be500d9a69a86bd07a6c5ce2f03b6445553 GIT binary patch literal 81 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1iS*4}CdunxQ5eOo eIV<$#8Q0qyO!ucxR1K?IyE!iZ^d2Wh25SHtzZT>G literal 0 HcmV?d00001 diff --git a/conlite/images/pfeil_runter.gif b/conlite/images/pfeil_runter.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c372d96f8f236bdc4b226d940d25cf13574b3c0 GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr1i}cN0_Es{fM*TwC f`bknL>uVo;?c{f#sb=KZ$FhD+O`MOq2!k~MSw|Om literal 0 HcmV?d00001 diff --git a/conlite/images/print.gif b/conlite/images/print.gif new file mode 100644 index 0000000000000000000000000000000000000000..7cd04a3e0f2272b6ab41fd4094f5580d29fe73c4 GIT binary patch literal 85 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulsiiS*4}_Eum~PyV^A im$x;a$2mR_Ylw?fTA|jNr5(q`W3GPO&_Y3k!5RRrgBQ^N literal 0 HcmV?d00001 diff --git a/conlite/images/reminder/prio_high.gif b/conlite/images/reminder/prio_high.gif new file mode 100644 index 0000000000000000000000000000000000000000..7941ffbed8d71e2aa045c928289cbea7afec139b GIT binary patch literal 82 zcmZ?wbhEHb6krfwn8?JidGn6{|Nk?9f#OdVMg|5Z1|1L&B+tO4EYde~+1vk47L)u! f9nWRP_f>=`XN7-Xdf}AYD$jih-sV2qA`I35vE3PQ literal 0 HcmV?d00001 diff --git a/conlite/images/reminder/prio_low.gif b/conlite/images/reminder/prio_low.gif new file mode 100644 index 0000000000000000000000000000000000000000..f290f2ab0f3ab72d66e02201bbcede63240eaff4 GIT binary patch literal 85 zcmZ?wbhEHb6krfwn8?hqdGihi28RFt{{ufN8UO45p%5z_Wx4DnD2!k~MH~<%p literal 0 HcmV?d00001 diff --git a/conlite/images/reminder/progress.gif b/conlite/images/reminder/progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..29b6ee7ef3bd382e5a1b657a712a8c5f47cb9469 GIT binary patch literal 69 zcmZ?wbhEHb6krfwXkcUzv?~4o|G(l-7DfgJMg|=QAOOiQFv;}vuROh$VR6l-OH%r5 WQsuLAA~lMZ{O~<@YMTcmgEats>Jy`yHjUPnRgsep9#>qt z`j8r%%fl_fnoRpzni?v6E4-cB4c0htwlhujXyhwio_77m*@bITHb~|M@Z2kCeBSx; P#@lIo>gM+|FjxZsG=f39 literal 0 HcmV?d00001 diff --git a/conlite/images/reminder/status_done.gif b/conlite/images/reminder/status_done.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b0fe2c6a1d2f49c2f7e8e5a9db668590b2647ef GIT binary patch literal 173 zcmZ?wbhEHb6krfw*v!qK=-p8^`@)BJ?^dl^b@l31--@k*R;9mw{i?68XJBCX4+cO6 z94P)|VPs(7X3znNfXrZEi7Ghh`P#`MS^J`;lSWR6QH9s6v|uKcjAa?#L3>uLlI!4= z*wCDpZp@(XbcCTTK!xd;i~9>6l~or#&!zE-^xayrx`4Solv7zC@MDeLOO{68izzco N`s&WdyD%_V0|0&nKKlRw literal 0 HcmV?d00001 diff --git a/conlite/images/reminder/status_inprogress.gif b/conlite/images/reminder/status_inprogress.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc58dbdbb4f700f1a83ba1d11d91f8ff7739fbee GIT binary patch literal 169 zcmZ?wbhEHb6krfw*v!Mgt`@|=EmJo8!ovp-u3o+R;oUpmimifHrN4gtVqjqS|Nnn| zeLau_vLQh6CkrD30}q1^hzl}lO%<)@k zUDG7k6ZShCNxJ@;(Si%ENdakyzNN%l~-k!+wq(H%uVa zC+&kGSIdJ56;9iVW;q`!@M&uCW;s|DduYX4&XCClp+#{A-F341uQ0q*T@@Mq?uU&k H6N5DXepf&2 literal 0 HcmV?d00001 diff --git a/conlite/images/save.gif b/conlite/images/save.gif new file mode 100644 index 0000000000000000000000000000000000000000..d840ce07b852c8d3026c06b60e7eae2d8fdf717d GIT binary patch literal 296 zcmZ?wbhEHb6k!lyXpv?B0#y@#8ykB?hYEkw7D3;Qy1uL2JZ1$32Kfi9jf_q6i#V20 z&{~pnxuB}IukX#WdCw-VeY9@bzuo%|?%Vh8@X328Zhp9a@5_r9-@kwT@$cWi|ENIm zpP+M5YGO%hib8p2Nrr;Er*8m*;!hSvE(Uo99gy`PhcK{Cc%a^wk~uG9)uIq@PoXbo z{F7(DUHtaXJ{3+G*Xy@a#TpYljdZe%B%GZ+lgzp;CfNp7wJy8k7vJoW(C-*OyKBX*p!k}G`4?nuT;ra%AHLef&a9ky+CIF)D{Far z?edzrm)e%!Ht}uz{Pl-JNS#;4!cSj*RL!}VQ8}l1(UnhMe$LqZz%jHTD5+`Uh9{8) zbFCvLwl2AB;F4qRnHQctrF_aUpS0=rNsIkst9+xYe6p8@ruBJ6*UesiTE{-~-G|TK z`RjvHCpxDrH1Q~yu=Y++a{I~4Pwo8+JhN9GIep{a^Dp_GJMTRCv~cCF>6`AxRjmt4 zZ3#$Fghg@%_(VeQa5L-8{74C$ZbouQE8PIUun`*C8t`waqT5)-JU9+mAmV zKYjHo*yxqH#3rE9D|yPqjnB#^9*)RpcZ!{&<6O|U`i^JLnuw|`-m%U8NnQ1G&bftE z1|~Gs&N$Vx@`i85ERW3PE=hA;qdSB0mi+to&%il*=C-HuCP{`aS;x;@xAZA;2ri$$ z>5^SgjeGi%s;S345+{BB_N#N+`i8mZFJ6D_7So;AzO{M6%Addgwl2Qxojxn1Vr$d9 zb3Tb(&XH}lLDk-g{UOP%U%viOcPKi4<7M~idj(y)PF;Fr7uMds;&%V)Tb5C?jC@<| zLmDsLczo^V!~V4obNY_@#x^>{&TxsJ6kNQ{Ew|9zE(6 z?h<*lpeE{YQiQrd|GF2Qk2D(>L@wl6!*D=|VTX~5k>&>l7tY3njsF;4BxPOQmZx{f zK|$g4q)oD0HZfWha|g0&=f5-YP;C!sSG$_SC~)lzhkQocuNDcH)F6{w-N>NLn^}Ye zQr7v!NNr+eS7R`Kw&2my)E-Xt<64m%ElYg`7y?XVPS+O!;ZL%5dw?b`_v0ne(q9hJIls! zqi@Ts1x*Kcuqz84T=+q^Q=TE~g@wk)N0Afbc6J!bPjvGT)@I1C`}1L8*PL}uiCMz{Q{g5(b&Uz#_7t#nM|yp?k3hTZIH0 literal 0 HcmV?d00001 diff --git a/conlite/images/sort_up.gif b/conlite/images/sort_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..d188bb98a61cd3e0cfb06d5cd752951e39c8d218 GIT binary patch literal 103 zcmZ?wbhEHbWM^Py*v!Gekgzdr!G(}1rzh;Xd-&Gdy7f0c|M<<8vibl2{|wlG;!hSv n1_llW9grl*3Hq)$ literal 0 HcmV?d00001 diff --git a/conlite/images/submit.gif b/conlite/images/submit.gif new file mode 100644 index 0000000000000000000000000000000000000000..aec9416cc76667187895d65de52004a4f452d498 GIT binary patch literal 131 zcmZ?wbhEHb6krfw*v!Ykkg)Op|Nl9QFWr9mMJRjw|A@o*}U4vjTc)qrfM$Gm}$2xMJTz*g@M5u0MLy#QUCw| literal 0 HcmV?d00001 diff --git a/conlite/images/submit_hover.gif b/conlite/images/submit_hover.gif new file mode 100644 index 0000000000000000000000000000000000000000..71cbcf7f2f9dcd3e4049dfa56ef3fc50e3318c9a GIT binary patch literal 131 zcmV-}0DS*PNk%w1VGsZi0J9DN0AR7d&j6&q8M4O=8*rFzpi2T_uf5I!4QQoNk7kLm zGB$sIFMEZMv@HMs{{R30A^8LW000gEEC2ui01yBW000Cq(1A&7l{V|mYcX9FC`dR3 lfk0?z+YU_T&PQU+Zhhmyu!Ja;DbOgHKBi<6V{$|Q06WDgE~o$i literal 0 HcmV?d00001 diff --git a/conlite/images/sync.png b/conlite/images/sync.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2e33a346d6f0c30b3037c59e4dfc3444de8400 GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rIkMV3ziDaSW-r#VEl1{tx5-|Nnt9 z!~+&&rTdQTJNWS6i5JJ7eR;;n_>YU3$5_nFQNc09H3X=vcXe;e@g{@~HA`ydT%4_> zEM{mTCnCZJRPpWGkDJ$Do;ZHXLfXP5#v8nWkPExxqGTg}s1-ZjNHWzV5KmtS38 zd2`uk=69iSW*nTXzyAFB_4n_uzkg=;?g44=o8af8^|m z{{Q{=&+k8f7fd<;^7N*HO=wCXTmvz~4Y$^R{q~cYo$>eIe?WVH;w(J2bFr%KD*oAc zw81Cb5TyFgUx=%KDjB(L<`h(i!S$TK@Zk9FvoTI0i{D1W1(6xhc=-AI@9*FLK7ajj z@#qzx>Pgi;&U+Vq`uPd2RDeUk*U1;ig=+Zo_y4bd|9<@V^Zn~jLlp_2guk;tTs4rf zb?1@z>WvFq{h8V1{4DIWzx@OT-2eYfOq~3@OE=tn^YSVC|F`mTvJgF8vv<`kc*M@e z6z8K2vf=sbPv?(ZkyMi5mk<(^647%pUw`4&tgY9jMehSW`Rc>ZZ{PpOh;vm&N&^*x zYnV!_Y)2AQ4d-6uf{p&Bo|Nn++JdpwNDG^RUWl(VN@G)Ryqk#?E4)5M~ b6ipDqU37LiRgRkcr-cFhwCCXq80M~XL9RL6T literal 0 HcmV?d00001 diff --git a/conlite/images/toggle_frame_left.gif b/conlite/images/toggle_frame_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3409c10ed42c77d88662e383671a1d82e901794 GIT binary patch literal 136 zcmZ?wbhEHb6krfw*v!Gekg)Op|NpN({S?jJ9zN|%;N(;5&OBRj@(BYDp!k!8k%57O zK?fucGJ}D|RG`r_d#c&<1G}GxE(lbz^i%z{R&mu*2hQ0gRx)|EqD^;>2|MXe-z?d2 TUpQdk+NP|G)qL|2q);|Nq}h04NNk zN5N+|z`(_z!vF-JJi)+W$so!hkg#$8d4{;@QHe9c8IXYDPZmZ71{MY#kQhiU1GAdPhC6HZ pPN^L!QDUjSe!=-T&%zm*(d~;~No`pzaaw0>=Ybx70Y4Q6YXE7X8=wFH literal 0 HcmV?d00001 diff --git a/conlite/images/users.gif b/conlite/images/users.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f489df746187a2b42aa6058f7880a4f69978988 GIT binary patch literal 97 zcmZ?wbhEHb6krfwSj57>kg)Op|NnLCZ!~VW!GHu5f3h$#Ft9M_fW$y*8JN{PHr!dO qcS`L@i4sfo^$X6&c^1ydjBa1_N@~k$iPJi3I}h~u3;3xpSOWk@8XkTC literal 0 HcmV?d00001 diff --git a/conlite/images/users_o.gif b/conlite/images/users_o.gif new file mode 100644 index 0000000000000000000000000000000000000000..cace1cde6f4d1b4a133b8e145fc705d57ba534ca GIT binary patch literal 97 zcmZ?wbhEHb6krfwSj57xdGn6{|Nq~-dHd$gI}Aub@h1x-0|N_#4oD27mVsH#W5b=b qdZ*Nmlqj)OU%%jdoM+*T%;@$-ucWrDmN>1mw(~%bzkr_#gEau}10a|H literal 0 HcmV?d00001 diff --git a/conlite/images/vert-neu.gif b/conlite/images/vert-neu.gif new file mode 100644 index 0000000000000000000000000000000000000000..a900a01f04b9e5c6b501dd8ae45bdac54fb14b6f GIT binary patch literal 2327 zcmV+y3F!7mNk%w1Vdw*70Du4hv$MGW|NkNR1OWg50RSuj0002!17rXI0{@I3fXk>2 z&x>$UX0OvN^YkqqH)`c|QfahS;r1GB7t1wR&)BVt{GS8Hda$AJMU)&vNn7w~gd&%p zCN7GdN|{tr*Yrh&Rby7!wXL3MX>S|+7RSkRa~+-K-r0Hee)s1SSfthGW(bEUr%1}(8;EUiq<{EQu)J-uDseXSkNE$&SYK8{|Vey-lm{{Cwn|2=PB zzkctY53l*!@B44rzJUSd6{L62UP62e^)=+j$zMc(69qmbSkYicg#Q~Ac4YX`VMvIc zERMujQe#SvD?PRZ`BG#|l1c{E>~vG&Oq4k(?z{-}WYC{NixNHB(!TO{YG!^5m-2>rk;q$u7O}6l_$rQ`uH^dlhb0xm(e8rTf)xSiEETmi2qq zir_VU^{zGC7V%rfaT(8bTz9Zdz-B8`z6?392XiaMIuV~j!0IAo1Q-gsn=N$%+5l0Y^IrI1k)Ii-sU?|Qeu-w7X^y#OnQfk_W}Ixw=_Z|U&WUH8dETjKpM3uLq?v)fIjEh5 z?s=%6i2|zPkBvI{=$4C48mXX_5_+kjnIgKWqMb6zqNAZgI;y0fQd+8|sbadSrmb@N zs;9An>Y}N$qFSq}xw5*etG&YdtE|D&s@;Uews@?l!~f!%EUC+$3hk}YJ}Ygt)Lz@H zt=M{pEVs&Lt1Gy?it8)6z?v&8y2N_xth&sytF61!%4;pX+n)C=yy5CQF2CjadoIA~ z3cN19?GpU1!SNzIFT?dZe6M*D@7J)x`&!&D#{X&@FvkOXT=2xkLTqozB%cg&!XkH@ za>Xm>+w#LPM@+HIFCRR!$vLBZ^TIp--1EgjXFT-AMR$Dk$4Q4=GtDCd-L%e2s~k1Y zRYU#s)GlAGwar|Aoi*4jckT4pV#7?f)Mw+Iw$)+3Z8qF!ukCZ&SjUa`+;X!`x6pkP z{kPG9BR#m%g)_Z(-G@`1xZjNf{2W zIqH(DPC4tAyN-G3vTF`I=d*iWJLtKKzB}o(-+nsqsSCe4@vR&GI`Xmq&OGkQ+unTe z(GNd;@zo!Hee&5a@BH@AcMrbw;Zr}p_2pxKzV_*JFMj*vyKg@H=*zD@{p`PwfBgB+ zzkmJx-><&_@=t*NBOm|=h`<6S@PGM6?=C@8UIcZiCLuK7H^T1B%dr3Y4D&m1aY!`A};{6#ttO)n-MxxzK`Ml$;rLXh$LXQHh3>q9e6vNimvG zhMtt8Db?so*ZER+#Ow&v7@zYX*YXX&!!f%O8shU-TKV)vdt1}y7PY%oZEso2 zRM!RPBrdyky~BmW|z6!b#8Z|`(5dVm%93# zX?dG^Ug3@xyXhtFdXEd=>&ExJ@~tm@@7rGM;@6+(<*$14t6czdSHRvSFnA3tUIdfZ zzwT8qdl{@>2hUf+_NDNC5BgsS2Ux=c=5T>Md|(hKSi}p)aDz$wU=v3e#S><6gXhtah=*U;wmw0&J|U}sy{+a@-(uYGKACtKXhCU>*V{cLnc``hfs zwz{p|?r_I@-19DXz0ZB`bmx2B?%p@N`weh;2b|smw|BwueQcsPMF2Yp)+})V literal 0 HcmV?d00001 diff --git a/conlite/images/widgets/foldingrow/expanded.gif b/conlite/images/widgets/foldingrow/expanded.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0875b2fc8a2097e881db31ae5c262fe050166bc GIT binary patch literal 111 zcmZ?wbhEHb|sK=CIFBLjmlgAPbJ$W8`UhX*V@DUn@i ztEM?_=*!jF{mf?hwl&X8?kP-Yce%J)lBLD*VL*!P + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.9 + * + * {@internal + * created 2008-09-08 + * modified 2009-06-25, Ingo van Peeren, added some array checks and initializing + * $Id: include.ajax.con.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if (!$idcat) { + $idcat = Contenido_Security::toInteger($_REQUEST['idcat']); +} + +$sCatlist = Contenido_Security::toString($_REQUEST['wholelist']); +if ($sCatlist != '') { + $aCatlist = explode(',', $sCatlist); +} else { + $aCatlist = array(); +} + +$aConexpandedList = unserialize($currentuser->getUserProperty("system", "con_cat_expandstate")); +if (!is_array($aConexpandedList)) { + $aConexpandedList = array(); +} + +if ($bDebug) { + print_r($aConexpandedList); + print_r($aCatlist); +} + +if ($action == 'toggle') { + $sKey = array_search($idcat, $aConexpandedList); + if ($sKey !== false) { + unset($aConexpandedList[$sKey]); + } elseif (in_array($idcat, $aCatlist)) { + $aConexpandedList[] = $idcat; + } +} elseif ($action == 'expand') { + if (!in_array($idcat, $aConexpandedList) && in_array($idcat, $aCatlist)) { + $aConexpandedList[] = $idcat; + } +} elseif ($action == 'collapse') { + $sKey = array_search($idcat, $aConexpandedList); + if ($sKey !== false) { + unset($aConexpandedList[$sKey]); + } +} elseif ($action == 'collapseall') { + if (count($aConexpandedList)) { + $aConexpandedList = array(); + } +} elseif ($action == 'expandall') { + $aConexpandedList = $aCatlist; +} + +$currentuser->setUserProperty("system", "con_cat_expandstate", serialize($aConexpandedList)); +?> \ No newline at end of file diff --git a/conlite/includes/api/functions.api.general.php b/conlite/includes/api/functions.api.general.php new file mode 100644 index 0000000..a03498c --- /dev/null +++ b/conlite/includes/api/functions.api.general.php @@ -0,0 +1,243 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-09-01 + * modified 2008-06-25, Frederic Schneider, add security fix + * modified 2009-10-27, Murat Purc, initialization of variable $bError to prevent PHP strict messages + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: functions.api.general.php 378 2015-11-09 20:01:25Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/* Info: + * This file contains Contenido General API functions. + * + * If you are planning to add a function, please make sure that: + * 1.) The function is in the correct place + * 2.) The function is documented + * 3.) The function makes sense and is generically usable + * + */ + +/** + * Includes a file and takes care of all path transformations. + * + * Example: + * contenido_include('classes', 'class.backend.php'); + * + * Currently defined areas: + * + * frontend Path to the *current* frontend + * conlib Path to conlib + * pear Path to the bundled pear copy + * classes Path to the contenido classes (see NOTE below) + * cronjobs Path to the cronjobs + * external Path to the external tools + * includes Path to the contenido includes + * scripts Path to the contenido scripts + * + * NOTE: Since Contenido (since v 4.8.15) provides autoloading of required + * class files, there is no need to load Contenido class files of by using + * contenido_include() or cInclude(). + * + * @param string $sWhere The area which should be included + * @param string $sWhat The filename of the include + * @param bool $bForce If true, force the file to be included + * @param string $bReturnPath Flag to return the path instead of including the file + * @return void + */ +function contenido_include($sWhere, $sWhat, $bForce = false, $bReturnPath = false) +{ + global $client, $cfg, $cfgClient; + + // Sanity check for $sWhat + $sWhat = trim($sWhat); + $sWhere = strtolower($sWhere); + $bError = false; + + switch ($sWhere) { + case 'config': + $sInclude = $cfg['path']['config']. $sWhat; + break; + case 'frontend': + $sInclude = $cfgClient[$client]['path']['frontend'] . $sWhat; + break; + case 'wysiwyg': + $sInclude = $cfg['path']['wysiwyg'] . $sWhat; + break; + case 'all_wysiwyg': + $sInclude = $cfg['path']['all_wysiwyg'] . $sWhat; + break; + case 'conlib': + case 'phplib': + $sInclude = $cfg['path']['phplib'] . $sWhat; + break; + case 'pear': + $sInclude = $sWhat; + $sIncludePath = ini_get('include_path'); + + if (!preg_match('|' . $cfg['path']['pear'] . '|i', $sIncludePath)) { + // contenido pear path is not set in include_path + // we try to add it via ini_set + if (!@ini_set('include_path', $sIncludePath . PATH_SEPARATOR . $cfg['path']['pear'])) { + // not able to change include_path + trigger_error("Can't add {$cfg['path']['pear']} to include_path", E_USER_NOTICE); + $sInclude = $cfg['path']['pear'] . $sWhat; + unset($sWhere); + } else { + $aPaths = explode(PATH_SEPARATOR, ini_get('include_path')); + $iLast = count($aPaths) - 1; + if ($iLast >= 2) { + $tmp = $aPaths[1]; + $aPaths[1] = $aPaths[$iLast]; + $aPaths[$iLast] = $tmp; + @ini_set('include_path', implode(PATH_SEPARATOR, $aPaths)); + } + unset($aPaths, $iLast, $tmp); + } + } + break; + default: + // FIXME: A workaround to provide inclusion of classes which are not + // handled by the autoloader + if ($sWhere === 'classes') { + if (cAutoload::isAutoloadable($cfg['path'][$sWhere] . $sWhat)) { + // it's a class file and it will be loaded automatically by + // the autoloader - get out here + return; + } + } + $sInclude = $cfg['path']['contenido'] . $cfg['path'][$sWhere] . $sWhat; + break; + } + + $sFoundPath = ''; + + if ($sWhere === 'pear') { + // now we check if the file is available in the include path + $aPaths = explode(PATH_SEPARATOR, ini_get('include_path')); + foreach ($aPaths as $sPath) { + if (@file_exists($sPath . DIRECTORY_SEPARATOR . $sInclude)) { + $sFoundPath = $sPath; + break; + } + } + + if (!$sFoundPath) { + $bError = true; + } + + unset($aPaths, $sPath); + } else { + if (!file_exists($sInclude) || preg_match('#^\.\./#', $sWhat)) { + $bError = true; + } + } + + // should the path be returned? + if ($bReturnPath) { + if ($sFoundPath !== '') { + $sInclude = $sFoundPath . DIRECTORY_SEPARATOR . $sInclude; + } + + if (!$bError) { + return $sInclude; + } else { + return false; + } + } + + if ($bError) { + $aBackTrace = debug_backtrace(); + if(is_array($aBackTrace[1])) { + $sError = " in ".$aBackTrace[1]['file'] + ." on line ".$aBackTrace[1]['line'] + ." function: ".$aBackTrace[1]['function']." "; + } else { + $sError = ""; + } + + trigger_error("Can't include $sInclude $sError", E_USER_ERROR); + return; + } + + // now include the file + if ($bForce == true) { + include($sInclude); + } else { + include_once($sInclude); + } +} + + +/** + * Shortcut to contenido_include. + * + * @see contenido_include + * + * @param string $sWhere The area which should be included + * @param string $sWhat The filename of the include + * @param bool $bForce If true, force the file to be included + * @return void + */ +function cInclude($sWhere, $sWhat, $bForce = false) +{ + contenido_include($sWhere, $sWhat, $bForce); +} + +/** + * Includes a file from a plugin and takes care of all path transformations. + * + * Example: + * plugin_include('formedit', 'classes/class.formedit.php'); + * + * @param string $sWhere The name of the plugin + * @param string $sWhat The filename of the include + * @return void + */ +function plugin_include($sWhere, $sWhat) { + global $cfg; + $sInclude = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $sWhere. '/' . $sWhat; + if(is_readable($sInclude)) { + include_once($sInclude); + } else { + $sCaller = ""; + $aTrace = debug_backtrace(); + foreach($aTrace as $iKey=>$aValue) { + if($aValue['function'] == __METHOD__) { + $sCaller = $aValue['file']." line ".$aValue['line']; + break; + } + } + trigger_error("Function ".__METHOD__.": Can't include $sInclude in ".$sCaller, E_USER_WARNING); + } +} + + +?> \ No newline at end of file diff --git a/conlite/includes/api/functions.frontend.list.php b/conlite/includes/api/functions.frontend.list.php new file mode 100644 index 0000000..5fce957 --- /dev/null +++ b/conlite/includes/api/functions.frontend.list.php @@ -0,0 +1,252 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-10-09 + * modified 2008-06-25, Frederic Schneider, add security fix + * + * $Id: functions.frontend.list.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Class FrontendList + * Class for scrollable frontend lists + * @author Timo A. Hummel + * @version 0.1 + */ +class FrontendList +{ + /** + * Wrap for a single item + * @var string + */ + var $itemwrap; + + /** + * Wrap for table start + * @var string + */ + var $startwrap; + + /** + * Wrap for table end + * @var string + */ + var $endwrap; + + /** + * Data container + * @var array + */ + var $data = Array(); + + /** + * Number of records displayed per page + * @var string + */ + var $resultsPerPage; + + /** + * Start page + * @var string + */ + var $listStart; + + + /** + * Creates a new FrontendList object. + * + * The placeholder for item wraps are the same as for + * sprintf. See the documentation for sprintf. + * + * Caution: Make sure that percentage signs are written as %%. + * + * @param $startwrap Wrap for the list start + * @param $endwrap Wrap for the list end + * @param $itemwrap Wrap for a single item + */ + function FrontendList ($startwrap, $endwrap, $itemwrap) + { + $this->resultsPerPage = 0; + $this->listStart = 1; + + $this->itemwrap = $itemwrap; + $this->startwrap = $startwrap; + $this->endwrap = $endwrap; + } + + /** + * Sets data. + * + * Note: This function eats as many parameters as you specify. + * + * Example: + * $obj->setData(0, "foo", "bar"); + * + * Make sure that the amount of parameters stays the same for all + * setData calls in a single object. + * + * @param $index Numeric index + * @param ... Additional parameters (data) + */ + function setData ($index) + { + + $numargs = func_num_args(); + + for ($i=1;$i<$numargs;$i++) + { + $this->data[$index][$i] = func_get_arg($i); + } + } + + /** + * Sets the number of records per page. + * + * @param $numresults Amount of records per page + */ + function setResultsPerPage ($numresults) + { + $this->resultsPerPage = $numresults; + } + + /** + * Sets the starting page number. + * + * @param $startpage Page number on which the list display starts + */ + function setListStart ($startpage) + { + $this->listStart = $startpage; + } + + /** + * Returns the current page. + * + * @param $none + * @returns Current page number + */ + function getCurrentPage () + { + if ($this->resultsPerPage == 0) + { + return 1; + } + + return ($this->listStart); + } + + /** + * Returns the amount of pages. + * + * @param $none + * @returns Amount of pages + */ + function getNumPages () + { + return (ceil(count($this->data) / $this->resultsPerPage)); + } + + /** + * Sorts the list by a given field and a given order. + * + * @param $field Field index + * @param $order Sort order (see php's sort documentation) + */ + function sort ($field, $order) + { + $this->data = array_csort($this->data, "$field", $order); + } + + /** + * Field converting facility. + * Needs to be overridden in the child class to work properbly. + * + * @param $field Field index + * @param $value Field value + */ + function convert ($field, $value) + { + return $value; + } + + /** + * Outputs or optionally returns + * + * @param $return If true, returns the list + */ + function output ($return = false) + { + $output = $this->startwrap; + + $currentpage = $this->getCurrentPage(); + + $itemstart = (($currentpage-1)*$this->resultsPerPage)+1; + + if ($this->resultsPerPage == 0) + { + $itemend = count($this->data) - ($itemstart-1); + } else { + $itemend = $currentpage*$this->resultsPerPage; + } + + if ($itemend > count($this->data)) + { + $itemend = count($this->data); + } + + for ($i=$itemstart;$i<$itemend+1;$i++) + { + $items = ""; + + foreach ($this->data[$i-1] as $key => $value) + { + $items .= ", '".addslashes($this->convert($key, $value))."'"; + } + + $execute = '$output .= sprintf($this->itemwrap '.$items.');'; + + eval($execute); + + } + + $output .= $this->endwrap; + + $output = stripslashes($output); + + if ($return == true) + { + return $output; + } else { + echo $output; + } + } +} + + + +?> \ No newline at end of file diff --git a/conlite/includes/cfg_language_de.inc.php b/conlite/includes/cfg_language_de.inc.php new file mode 100644 index 0000000..de7f1a9 --- /dev/null +++ b/conlite/includes/cfg_language_de.inc.php @@ -0,0 +1,409 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-03-02 + * modified 2008-06-25, Frederic Schneider, add security fix + * modified 2008-07-04, Dominik Ziegler, fixed bug CON-169 + * + * $Id: cfg_language_de.inc.php 80 2012-05-29 12:38:23Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.i18n.php"); + +global $lngArea, $lngLogin, $lngErr, $a_description, $lngAct; + +$lngLogin["pleaselogin"] = "Bitte geben Sie Ihren Benutzernamen und Ihr Pa�wort ein."; +$lngLogin["username"] = "Benutzername"; +$lngLogin["password"] = "Pa�wort"; +$lngLogin["invalidlogin"] = "Entweder ist Ihr Benutzername oder Ihr Pa�wort ung�ltig.
Bitte versuchen Sie es nochmal!"; + +$lngLogout["thanksforusingcontenido"] = "Vielen Dank, dass sie Contenido benutzt haben. Bis bald."; +$lngLogout["youareloggedout"] = "Sie sind jetzt abgemeldet."; +$lngLogout["backtologin1"] = "Hier kommen Sie wieder zur"; +$lngLogout["backtologin2"] = "Anmeldung"; + +//Datas for Areas which are not in the Navigation +$lngArea["con_artlist"] = " - Artikelliste"; +$lngArea["con_editart"] = " - Artikel bearbeiten"; +$lngArea["lay_edit"] = " - Layout bearbeiten"; +$lngArea["mod_edit"] = " - Modul bearbeiten"; +$lngArea["tpl_edit"] = " - Template bearbeiten"; +$lngArea["news_edit"] = " - Newsletter bearbeiten"; + +$lngCon["actionsconf"] = "Aktionen"; +$lngCon["allarts"] = "Alle Artikeln"; +$lngCon["artname"] = "Artikelnname"; +$lngCon["artoff"] = "Artikel offline schalten"; +$lngCon["arton"] = "Artikel online schalten"; +$lngCon["artswithoutcategory"] = "Artikeln ohne Zuordnung"; +$lngCon["author"] = "Redakteur"; +$lngCon["created"] = "Datum der Erstellung"; +$lngCon["dateend"] = "Enddatum"; +$lngCon["datestart"] = "Startdatum"; +$lngCon["defaulttemplate"] = "Template"; +$lngCon["imgagedescription"] = "Beschreibung"; +$lngCon["lastmodified"] = "Datum der letzten �nderung"; +$lngCon["moduleincontainer"] = "Modul in Container"; +$lngCon["noarts"] = "Es gibt keine Artikel."; +$lngCon["noartsinthiscategory"] = "Es gibt keine Artikel in dieser Kategorie."; +$lngCon["nostartingart"] = "Nicht als StartArtikel konfigurieren."; +$lngCon["online"] = "Online"; +$lngCon["preview"] = "Vorschau"; +$lngCon["properties"] = "Eigenschaften"; +$lngCon["startart"] = "StartArtikel"; +$lngCon["structure"] = "Kategorie"; +$lngCon["structureandarts"] = "Kategorie / Artikeln"; +$lngCon["summary"] = "Zusammenfassung"; +$lngCon["redirect"] = "Weiterleitung"; +$lngCon["redirect_url"] = "Weiterleitungsadresse"; +$lngCon["template"] = "Template"; +$lngCon["title"] = "Titel"; +$lngCon["keywordart"] = "Keywords Artikel"; +$lngCon["keywordcat"] = "Keywords Kategorie"; +$lngCon["keywordautoart"] = "Automatisch generiert"; +$lngCon["unconfigured"] = "unkonfiguriert"; +$lngCon["dynhead"] = "�berschrift"; +$lngCon["dyntext"] = "Text"; +$lngCon["dynimg"] = "Bild"; +$lngCon["dynlink"] = "Link"; +$lngCon["actions"]["10"] = "Artikeln der gew�hlten Kategorie"; +$lngCon["actions"]["11"] = "Liste aller Artikeln"; +$lngCon["actions"]["12"] = "Liste der Artikeln ohne Zuordnung"; + +$lngAct["con"]["con_lock"] = i18n("Freeze article"); +$lngAct["con"]["con_makecatonline"] = i18n("Make category online"); +$lngAct["con"]["con_changetemplate"] = i18n("Change template"); +$lngAct["con"]["con_makestart"] = i18n("Set start article"); +$lngAct["con"]["con_makeonline"] = i18n("Make article online"); +$lngAct["con"]["con_synccat"] = i18n("Syncronize Category"); +$lngAct["con"]["con_syncarticle"] = i18n("Syncronize Article"); +$lngAct["con"]["con_makepublic"] = i18n("Protect category"); +$lngAct["con"]["con_deleteart"] = i18n("Delete article"); +$lngAct["con"]["con_tplcfg_edit"] = i18n("Edit template configuration"); +$lngAct["con"]["con_duplicate"] = i18n("Duplicate Article"); +$lngAct["con"]["con_expand"] = i18n("Expand boxes"); +$lngAct["con_edittpl"]["10"] = i18n("Configure template"); +$lngAct["con_editart"]["con_newart"] = i18n("Create article"); +$lngAct["con_editart"]["35"] = i18n("Configure article"); +$lngAct["con_editart"]["con_saveart"] = i18n("Save article"); +$lngAct["con_editart"]["remove_assignments"] = i18n("Remove assignments"); +$lngAct["con_editcontent"]["15"] = i18n("Edit article"); +$lngAct["con_editart"]["con_edit"] = i18n("Edit article properties"); +$lngAct["con_editcontent"]["con_editart"] = i18n("Edit article"); +$lngAct["con_tplcfg"]["con_edddittemplate"] = i18n("Help"); + +$lngAct["str"]["str_renamecat"] = i18n("Rename category"); +$lngAct["str"]["str_newcat"] = i18n("New category"); +$lngAct["str"]["str_makevisible"] = i18n("Set category on- or offline"); +$lngAct["str"]["50"] = i18n("Disable category"); +$lngAct["str"]["str_makepublic"] = i18n("Protect category"); +$lngAct["str"]["front_allow"] = i18n("Frontend access"); +$lngAct["str"]["str_deletecat"] = i18n("Delete category"); +$lngAct["str"]["str_moveupcat"] = i18n("Move category up"); +$lngAct["str"]["str_movedowncat"] = i18n("Move category down"); +$lngAct["str"]["str_movesubtree"] = i18n("Move category"); +$lngAct["str"]["str_newtree"] = i18n("Create new tree"); +$lngAct["str"]["str_duplicate"] = i18n("Duplicate category"); +$lngAct["str_tplcfg"]["str_tplcfg"] = i18n("Configure category"); +$lngAct["str_tplcfg"]["tplcfg_edit"] = i18n("Edit category"); + +$lngAct["upl"]["upl_mkdir"] = i18n("Create directory"); +$lngAct["upl"]["upl_upload"] = i18n("Upload files"); +$lngAct["upl"]["upl_delete"] = i18n("Delete files"); +$lngAct["upl"]["upl_rmdir"] = i18n("Remove directory"); +$lngAct["upl"]["upl_renamedir"] = i18n("Rename directory"); +$lngAct["upl"]["upl_modify_file"] = i18n("Modify file"); +$lngAct["upl"]["upl_renamefile"] = i18n("Rename file"); +$lngAct["upl"]["upl_multidelete"] = i18n("Multidelete Files"); +$lngAct["upl"]["21"] = i18n("Delete file"); +$lngAct["upl"]["40"] = i18n("Upload files"); +$lngAct["upl"]["31"] = i18n("Create directory"); + +$lngAct["lay"]["lay_delete"] = i18n("Delete layout"); +$lngAct["lay_edit"]["lay_edit"] = i18n("Modify layout"); +$lngAct["lay_edit"]["lay_new"] = i18n("Create layout"); +$lngAct["lay_history"]["lay_history_manage"] = i18n("Manage History"); +$lngAct["lay_history"]["history_truncate"] = i18n("Truncate History"); + + +$lngAct["mod"]["mod_delete"] = i18n("Delete module"); +$lngAct["mod_history"]["mod_history_manage"] = i18n("Manage History"); +$lngAct["mod_history"]["history_truncate"] = i18n("Truncate History"); +$lngAct["mod_edit"]["mod_edit"] = i18n("Edit module"); +$lngAct["mod_edit"]["mod_new"] = i18n("Create module"); +$lngAct["mod_edit"]["mod_importexport_module"] = i18n("Import/Export module"); +$lngAct["mod_translate"]["mod_translation_save"] = i18n("Translate modules"); +$lngAct["mod_translate"]["mod_importexport_translation"] = i18n("Translation import/export"); +$lngAct["mod_package"]["mod_importexport_package"] = i18n("Import/Export package"); + +$lngAct["tpl"]["tpl_delete"] = i18n("Delete template"); +$lngAct["tpl_edit"]["tpl_edit"] = i18n("Edit template"); +$lngAct["tpl_edit"]["tpl_new"] = i18n("Create template"); +$lngAct["tpl_edit"]["tpl_duplicate"] = i18n("Duplicate template"); +$lngAct["tpl"]["tpl_duplicate"] = i18n("Duplicate template"); +$lngAct["tpl_visual"]["tpl_visedit"] = i18n("Visual edit"); + +$lngAct["user"]["user_create"] = i18n("Create user"); +$lngAct["user"]["user_delete"] = i18n("Delete user"); +$lngAct["user_areas"]["user_saverightsarea"] = i18n("Save user area rights"); +$lngAct["user_create"]["user_createuser"] = i18n("Create user"); +$lngAct["user_rights"]["10"] = i18n("Edit rights"); +$lngAct["user_overview"]["user_edit"] = i18n("Edit user"); + +$lngAct["groups_members"]["group_deletemember"] = i18n("Delete group members"); +$lngAct["groups_members"]["group_addmember"] = i18n("Add group members"); +$lngAct["groups_overview"]["group_edit"] = i18n("Edit group"); +$lngAct["groups_create"]["group_create"] = i18n("Create group"); +$lngAct["groups"]["group_delete"] = i18n("Delete group"); + +$lngAct["stat"]["stat_show"] = i18n("Show statistics"); + +$lngAct["lang"]["lang_activatelanguage"] = i18n("Activate language"); +$lngAct["lang"]["lang_deactivatelanguage"] = i18n("Deactivate language"); +$lngAct["lang"]["lang_renamelanguage"] = i18n("Rename language"); +$lngAct["lang_edit"]["lang_newlanguage"] = i18n("Create language"); +$lngAct["lang_edit"]["lang_deletelanguage"] = i18n("Delete language"); +$lngAct["lang_edit"]["lang_edit"] = i18n("Edit language"); + +$lngAct["linkchecker"]["linkchecker"] = i18n("Linkchecker"); +$lngAct["linkchecker"]["whitelist_view"] = i18n("Linkchecker Whitelist"); + +$lngAct["plug"]["10"] = i18n("Install/Remove plugins"); + +$lngAct["style"]["style_edit"] = i18n("Modify CSS"); +$lngAct["style"]["style_create"] = i18n("Create CSS"); +$lngAct["style"]["style_delete"] = i18n("Delete CSS"); +$lngAct["style_history"]["style_history_manage"] = i18n("Manage History"); +$lngAct["style_history"]["history_truncate"] = i18n("Truncate History"); + +$lngAct["js"]["js_edit"] = i18n("Edit script"); +$lngAct["js"]["js_delete"] = i18n("Delete script"); +$lngAct["js"]["js_create"] = i18n("Create script"); +$lngAct["js_history"]["js_history_manage"] = i18n("Manage History"); +$lngAct["js_history"]["history_truncate"] = i18n("Truncate History"); + +$lngAct["htmltpl"]["htmltpl_edit"] = i18n("Modify HTML-Template"); +$lngAct["htmltpl"]["htmltpl_create"] = i18n("Create HTML-Template"); +$lngAct["htmltpl"]["htmltpl_delete"] = i18n("Delete HTML-Template"); +$lngAct["htmltpl_history"]["htmltpl_history_manage"] = i18n("Manage History"); +$lngAct["htmltpl_history"]["history_truncate"] = i18n("Truncate History"); + +$lngAct["news"]["news_save"] = i18n("Edit newsletter"); +$lngAct["news"]["news_create"] = i18n("Create newsletter"); +$lngAct["news"]["news_delete"] = i18n("Delete newsletter"); +$lngAct["news"]["news_duplicate"] = i18n("Duplicate newsletter"); +$lngAct["news"]["news_add_job"] = i18n("Add newsletter dispatch job"); +$lngAct["news"]["news_html_settings"] = i18n("Change global HTML newsletter settings"); +$lngAct["news"]["news_send_test"] = i18n("Send test newsletter (to groups)"); +$lngAct["news_jobs"]["news_job_delete"] = i18n("Delete dispatch job"); +$lngAct["news_jobs"]["news_job_detail_delete"] = i18n("Remove recipient from dispatch job"); +$lngAct["news_jobs"]["news_job_run"] = i18n("Run job"); +$lngAct["news_jobs"]["news_job_details"] = i18n("View dispatch job details"); + +$lngAct["recipients"]["recipients_save"] = i18n("Edit recipient"); +$lngAct["recipients"]["recipients_create"] = i18n("Create recipient"); +$lngAct["recipients"]["recipients_delete"] = i18n("Delete recipient"); +$lngAct["recipients"]["recipients_purge"] = i18n("Purge recipients"); +$lngAct["recipients_import"]["recipients_import"] = i18n("Import recipients"); +$lngAct["recipients_import"]["recipients_import_exec"] = i18n("Execute recipients import"); +$lngAct["recipientgroups"]["recipientgroup_delete"] = i18n("Delete recipient group"); +$lngAct["recipientgroups"]["recipientgroup_create"] = i18n("Create recipient group"); +$lngAct["recipientgroups"]["recipientgroup_recipient_delete"] = i18n("Delete recipient from group"); +$lngAct["recipientgroups"]["recipientgroup_save_group"] = i18n("Save recipient group"); + +$lngAct["mycontenido_settings"]["mycontenido_editself"] = i18n("Edit own MyContenido settings"); +$lngAct["mycontenido_tasks"]["mycontenido_tasks_delete"] = i18n("Delete reminder item"); +$lngAct["mycontenido_tasks"]["todo_save_item"] = i18n("Save todo item"); + +$lngAct["client_edit"]["client_new"] = i18n("Create client"); +$lngAct["client_edit"]["client_edit"] = i18n("Edit client"); +$lngAct["client"]["client_delete"] = i18n("Remove client"); +$lngAct["client_settings"]["clientsettings_delete_item"] = i18n("Delete clientsetting"); +$lngAct["client_settings"]["clientsettings_edit_item"] = i18n("Edit clientsetting"); +$lngAct["client_settings"]["clientsettings_save_item"] = i18n("Save clientsetting"); +$lngAct["client_articlespec"]["client_artspec_save"] = i18n("Create/Edit articlespecifications"); +$lngAct["client_articlespec"]["client_artspec_delete"] = i18n("Delete articlespecifications"); +$lngAct["client_articlespec"]["client_artspec_default"] = i18n("Define default articlespecification"); +$lngAct["client_articlespec"]["client_artspec_edit"] = i18n("Edit articlespecifications"); +$lngAct["client_articlespec"]["client_artspec_online"] = i18n("Make articlespecifications online"); + +$lngAct["frontend"]["frontend_save_user"] = i18n("Save frontenduser"); +$lngAct["frontend"]["frontend_create"] = i18n("Create frontenduser"); +$lngAct["frontend"]["frontend_delete"] = i18n("Delete frontenduser"); +$lngAct["frontendgroups"]["frontendgroup_delete"] = i18n("Delete frontendgroup"); +$lngAct["frontendgroups"]["frontendgroup_save_group"] = i18n("Save frontendgroup"); +$lngAct["frontendgroups"]["frontendgroup_create"] = i18n("Create frontendgroup"); +$lngAct["frontendgroups"]["frontendgroup_create"] = i18n("Create frontendgroup"); +$lngAct["frontendgroups"]["frontendgroup_user_add"] = i18n("Add frontendusers"); +$lngAct["frontendgroups"]["frontendgroups_user_delete"] = i18n("Delete frontenduser"); +$lngAct["frontendgroups_rights"]["fegroups_save_perm"] = i18n("Save frontendgroup permissions"); + +$lngAct["system_settings"]["systemsettings_delete_item"] = i18n("Delete system property"); +$lngAct["system_settings"]["systemsettings_edit_item"] = i18n("Edit system property"); +$lngAct["system_settings"]["systemsettings_save_item"] = i18n("Save system property"); + +$lngAct["system"]["emptyLog"] = i18n("Empty log"); +$lngAct["system_configuration"]["edit_sysconf"] = i18n("Edit Systemconfigration"); +$lngAct["system_purge"]["do_purge"] = i18n("Do system purge"); + +$lngAct["logs"]["log_show"] = i18n("Show log"); + +$lngAct["login"]["login"] = i18n("Login"); +$lngAct["login"]["request_pw"] = i18n("Request password?"); + +$lngAct["note"]["note_delete"] = i18n("Delete note"); +$lngAct["note"]["note_save_item"] = i18n("Save note"); + +$lngAct[""]["sendMail"] = i18n("Send mail"); +$lngAct[""]["fake_permission_action"] = i18n("Fake permissions"); + +$lngStr["actions"]["10"] = "Neuer Baum"; +$lngStr["structure"] = "Kategorie"; +$lngStr["properties"] = "Aktionen"; +$lngStr["makeinvisible"] = "Diese Kategorie offline setzen."; +$lngStr["makevisible"] = "Diese Kategorie online setzen."; +$lngStr["protect"] = "Diese Kategorie schützen."; +$lngStr["makepublic"] = "Diese Kategorie frei zugänglich machen."; +$lngStr["moveup"] = "Diese Kategorie eins nachoben verschieben."; +$lngStr["tofirstlevel"] = "Diese Kategorie in die oberste Ebene umhängen."; +$lngStr["movehere"] = "Die zuvor ausgewählte Kategorie hierher umhaengen."; +$lngStr["movesubtree"] = "Diese Kategorie (und den darunterliegenden Teilbaum) umhaengen."; + +$lngLay["lay"]["lay_new"] = "Neues Layout"; +$lngLay["layoutname"] = "Name des Layouts"; +$lngLay["description"] = "Beschreibung"; +$lngLay["code"] = "Code"; +$lngLay["notemplates"] = "Es gibt keine Layouts."; + +$lngMod["actions"]["10"] = "Neues Modul"; +$lngMod["modulename"] = "Name des Moduls"; +$lngMod["description"] = "Beschreibung"; +$lngMod["input"] = "Input"; +$lngMod["output"] = "Output"; +$lngMod["nomodules"] = "Es gibt keine Module."; +$lngMod["cmsvariables"] = "CMS_Variablen"; + +$lngTpl["actions"]["10"] = "Neues Template"; +$lngTpl["templatename"] = "Name des Templates"; +$lngTpl["description"] = "Beschreibung"; +$lngTpl["container"] = "Container"; +$lngTpl["notemplates"] = "Es gibt keine Templates."; +$lngTpl["layout"] = "Layout"; + + +$lngUpl["description"] = 'Beschreibung'; +$lngUpl['action'] = 'Aktionen'; +$lngUpl['delfolder'] = 'Verzeichnis l�schen'; +$lngUpl['delfile'] = 'Datei l�schen'; +$lngUpl['directoriesandfiles'] = 'Verzeichnisse / Dateien'; +$lngUpl['opendirectory'] = 'Verzeichnis �ffnen'; +$lngUpl['closedirectory'] = 'Verzeichnis schlie�en'; +$lngUpl['file'] = 'Datei'; +$lngUpl['fileopen'] = 'Datei �ffnen'; +$lngUpl['popupclose'] = 'Fenster schliessen'; +$lngUpl['renamefolder'] = 'Verzeichnis umbenennen'; +$lngUpl['renamefile'] = 'Datei umbenennen'; +$lngUpl['description'] = 'Beschreibung'; +$lngUpl['dirisempty'] = 'Verzeichnis ist leer'; +$lngUpl['upload'] = 'Dateien hochladen'; +$lngUpl['delete'] = 'l�schen'; +$lngUpl["filesize"] = 'Dateigr��e'; + +$lngUser["username"] = "Benutzername"; +$lngUser["password"] = "Pa�wort"; +$lngUser["level"] = "Berechtigungen"; +$lngUser["action"] = "Aktionen"; +$lngUser["create"] = "Erstellen"; +$lngUser["kill"] = "L�schen"; +$lngUser["edit"] = "Bearbeiten"; +$lngUser["error"] = "Fehler"; +$lngUser["nopermissiontocreateusers"] = "Sie haben keine Berechtigung Benutzer zu erstellen."; +$lngUser["pleasefilloutusernameandpassword"] = "Bitte f�llen Sie Benutzername und Pa�wort aus"; +$lngUser["usernamealreadyexists"] = "Benutzername existiert bereits"; +$lngUser["failed"] = "Fehlgeschlagen:"; +$lngUser["usercreated"] = "Benutzer erstellt"; +$lngUser["nopermissiontoeditusers"] = "Sie haben keine Berechtigung Benutzer zu bearbeiten"; +$lngUser["passwordchanged1"] = "Pa�wort von"; +$lngUser["passwordchanged2"] = "ge�ndert"; +$lngUser["nopermissiontodeleteusers"] = "Sie haben keine Berechtigung Benutzer zu l�schen"; +$lngUser["userdeleted"] = "Benutzer gel�scht"; + +$lngLang["language"] = "Sprache"; +$lngLang["active"] = "aktiv"; +$lngLang["actions"] = "Aktionen"; +$lngLang["rename"] = "umbenennen"; +$lngLang["delete"] = "l�schen"; +$lngLang["notactive"] = "deaktiviert"; +$lngLang["newlanguage"] = "Neue Sprache"; + +$lngStat["structureandarts"] = "Kategorie / Artikeln"; +$lngStat["numberofarts"] = "Anzahl der Artikeln"; +$lngStat["total"] = "Total"; +$lngStat["inthislanguage"] = "In dieser Sprache"; +$lngStat["sum"] = "Summe"; + +$lngForm["nothing"] = "--- ".i18n("None")." ---"; +$lngForm["all"] = "--- Alles ---"; + +$lngAll["yes"] = "ja"; +$lngAll["no"] = "nein"; +$lngAll["default"] = "default"; +$lngAll["defaultdoesnotexist"] = "Kein Default-Template eingestellt"; +$lngAll["logout"] = "Logout"; +$lngAll["back"] = "Zurück"; + +$mod["font"] = "Schriftart"; +$mod["errorfont"] = "Schriftart f�r Fehlermeldungen"; +$mod["inputformfont"] = "Schriftart f�r die Eingabefelder"; +$mod["select"] = "Auswahlmöglichkeiten"; +$mod["number"] = "Nummer"; +$mod["picforsend"] = "Bild f�r den Sendebutton"; + +$modLink["click"] = "Bitte klicken Sie hier."; + +$modNews["inputname"] = "Feld f�r Namen"; +$modNews["email"] = "E-Mail Adresse"; +$modNews["name"] = "Name (freiwillig)"; +$modNews["subcribe"] = "anmelden"; +$modNews["unsubcribe"] = "abmelden"; +$modNews["both"] = "beides"; +$modNews["headline"] = "Stets die neusten Informationen per E-Mail."; +$modNews["subcribemessage"] = "Wir haben Ihre Daten in unsere Datenbank aufgenommen."; +$modNews["unsubcribemessage"] = "Wir haben Sie aus unserem Newsletterverteiler gelöscht."; +$modNews["stopmessage"] = "Der Newsletterempfang wurde deaktiviert."; +$modNews["goonmessage"] = "Der Newsletterempfang wurde aktiviert."; + +$modLogin["error"] = "Logindaten sind nicht korrekt."; +$modLogin["send"] = "Login now"; +$modLogin["sendout"] = "logout"; +$modLogin["name"] = "Bitte Login-Namen eintragen"; +$modLogin["password"] = "Bitte Passwort eintragen"; +$modLogin["login"] = "Bitte klicken um einzuloggen"; +$modLogin["logout"] = "Bitte klicken um auszuloggen"; +$modLogin["picforlogout"] = "Bild f�r Logout"; +?> diff --git a/conlite/includes/functions.api.category.php b/conlite/includes/functions.api.category.php new file mode 100644 index 0000000..a0a9575 --- /dev/null +++ b/conlite/includes/functions.api.category.php @@ -0,0 +1,106 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-08-08 + * modified 2008-06-25, Frederic Schneider, add security fix + * + * $Id: functions.api.category.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/* Info: + * This file contains Contenido Category API functions. + * + * If you are planning to add a function, please make sure that: + * 1.) The function is in the correct place + * 2.) The function is documented + * 3.) The function makes sense and is generically usable + * + */ + + +/** + * capiCatGetLevelNode: Seeks through the category + * tree and returns the node on a specific level. + * + * Example: + * + * + Category A (15) + * |-+ News (16) + * | |- News A (17) + * + Category B (18) + * |-+ Internal (19) + * + * Given you are in the leaf "News A" (idcat 17), + * and you want to get out in which "main" tree you + * are, you can call the function like this: + * + * capi_cat_getlevelnode(17,1); + * + * The example would return "Category A" (idcat 15). + * If you specify an invalid level, the results are + * undefined. + * + * @param $int idcat The category number + * @param $minLevel int The level to extract + * + * @return int The category node on a specific level + */ +function capi_cat_getlevelnode($idcat, $minLevel = 0) +{ + global $cfg, $client, $lang; + + $db = new DB_ConLite; + + $sql = "SELECT + a.name AS name, + a.idcat AS idcat, + b.parentid AS parentid, + c.level AS level + FROM + ".$cfg["tab"]["cat_lang"]." AS a, + ".$cfg["tab"]["cat"]." AS b, + ".$cfg["tab"]["cat_tree"]." AS c + WHERE + a.idlang = '".$lang."' AND + b.idclient = '".$client."' AND + b.idcat = '".$idcat."' AND + c.idcat = b.idcat AND + a.idcat = b.idcat"; + + $db->query($sql); + $db->next_record(); + + $parentid = $db->f("parentid"); + $thislevel = $db->f("level"); + + if ( $parentid != 0 && $thislevel >= $minLevel) { + return capi_cat_getlevelnode($parentid, $minLevel); + } else { + return $idcat; + } +} \ No newline at end of file diff --git a/conlite/includes/functions.api.images.php b/conlite/includes/functions.api.images.php new file mode 100644 index 0000000..adb27b9 --- /dev/null +++ b/conlite/includes/functions.api.images.php @@ -0,0 +1,690 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-08-08 + * modified 2008-06-25, Frederic Schneider, add security fix + * + * $Id: functions.api.images.php 358 2015-09-28 17:53:12Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/* Info: + * This file contains Contenido Image API functions. + * + * If you are planning to add a function, please make sure that: + * 1.) The function is in the correct place + * 2.) The function is documented + * 3.) The function makes sense and is generically usable + * + */ + +/** + * capiImgScaleGetMD5CacheFile: Returns the MD5 Filename used + * for caching. + * + * @return string Path to the resulting image + */ +function capiImgScaleGetMD5CacheFile($sImg, $iMaxX, $iMaxY, $bCrop, $bExpand) { + if (!file_exists($sImg)) { + return false; + } + + $iFilesize = filesize($sImg); + + if (function_exists("md5_file")) { + $sMD5 = md5(implode("", array( + $sImg, + md5_file($sImg), + $iFilesize, + $iMaxX, + $iMaxY, + $bCrop, + $bExpand))); + } else { + $sMD5 = md5(implode("", array( + $sImg, + $iFilesize, + $iMaxX, + $iMaxY, + $bCrop, + $bExpand))); + } + + return $sMD5; +} + +/** + * capiImgScaleLQ: Scales (or crops) an image. + * If scaling, the aspect ratio is maintained. + * + * Returns the path to the scaled temporary image. + * + * Note that this function does some very poor caching; + * it calculates an md5 hash out of the image plus the + * maximum X and Y sizes, and uses that as the file name. + * If the file is older than 10 minutes, regenerate it. + * + * @param string $img The path to the image (relative to the frontend) + * @param int $maxX The maximum size in x-direction + * @param int $maxY The maximum size in y-direction + * @param boolean $crop If true, the image is cropped and not scaled. + * @param boolean $expand If true, the image is expanded (e.g. really scaled). + * If false, the image will only be made smaller. + * @param int $cacheTime The number of minutes to cache the image, use 0 for unlimited + * @param int $quality The quality of the output file + * @param boolean $keepType If true and a png file is source, output file is also png + * + * @return string !!!URL!!! to the resulting image (http://... + */ +function capiImgScaleLQ($img, $maxX, $maxY, $crop = false, $expand = false, $cacheTime = 10, $quality = 75, $keepType = false) { + global $cfgClient, $lang, $client; + + $filename = $img; + $cacheTime = (int) $cacheTime; + $quality = (int) $quality; + + if ($quality <= 0 || $quality > 100) { + $quality = 75; + } + + $filetype = substr($filename, strlen($filename) - 4, 4); + $filesize = filesize($img); + $md5 = capiImgScaleGetMD5CacheFile($img, $maxX, $maxY, $crop, $expand); + + // Create the target file names for web and server + if ($keepType) { // Should we keep the file type? + switch (strtolower($filetype)) { // Just using switch if someone likes to add other types + case ".png": + $cfileName = $md5 . ".png"; + break; + default: + $cfileName = $md5 . ".jpg"; + } + } else { // No... use .jpg + $cfileName = $md5 . ".jpg"; + } + + $cacheFile = $cfgClient[$client]["path"]["frontend"] . "cache/" . $cfileName; + $webFile = $cfgClient[$client]["path"]["htmlpath"] . "cache/" . $cfileName; + + // Check if the file exists. If it does, check if the file is valid. + if (file_exists($cacheFile)) { + if ($cacheTime == 0) { + // Do not check expiration date + return $webFile; + } else if (!function_exists("md5_file")) { // TODO: Explain why this is still needed ... or remove it + if ((filemtime($cacheFile) + (60 * $cacheTime)) < time()) { + /* Cache time expired, unlink the file */ + unlink($cacheFile); + } else { + /* Return the web file name */ + return $webFile; + } + } else { + return $webFile; + } + } + + /* Get out which file we have */ + switch (strtolower($filetype)) { + case ".gif": $function = "imagecreatefromgif"; + break; + case ".png": $function = "imagecreatefrompng"; + break; + case ".jpg": $function = "imagecreatefromjpeg"; + break; + case "jpeg": $function = "imagecreatefromjpeg"; + break; + default: return false; + } + + if (function_exists($function)) { + $imageHandle = @$function($filename); + } + + /* If we can't open the image, return false */ + if (!$imageHandle) { + return false; + } + + $x = imagesx($imageHandle); + $y = imagesy($imageHandle); + + /* Calculate the aspect ratio */ + $aspectXY = $x / $y; + $aspectYX = $y / $x; + + if (($maxX / $x) < ($maxY / $y)) { + $targetY = $y * ($maxX / $x); + $targetX = round($maxX); + + // force wished height + if ($targetY < $maxY) { + $targetY = ceil($targetY); + } else { + $targetY = floor($targetY); + } + } else { + $targetX = $x * ($maxY / $y); + $targetY = round($maxY); + + // force wished width + if ($targetX < $maxX) { + $targetX = ceil($targetX); + } else { + $targetX = floor($targetX); + } + } + + if ($expand == false && (($targetX > $x) || ($targetY > $y))) { + $targetX = $x; + $targetY = $y; + } + + $targetX = ($targetX != 0) ? $targetX : 1; + $targetY = ($targetY != 0) ? $targetY : 1; + + /* Create the target image with the target size, resize it afterwards. */ + if ($crop) { + /* Create the target image with the max size, crop it afterwards. */ + $targetImage = imagecreate($maxX, $maxY); + imagecopy($targetImage, $imageHandle, 0, 0, 0, 0, $maxX, $maxY); + } else { + /* Create the target image with the target size, resize it afterwards. */ + $targetImage = imagecreate($targetX, $targetY); + imagecopyresized($targetImage, $imageHandle, 0, 0, 0, 0, $targetX, $targetY, $x, $y); + } + + // Output the file + if ($keepType) { + switch (strtolower($filetype)) { + case ".png": + imagepng($targetImage, $cacheFile); // no quality option available + break; + default: + imagejpeg($targetImage, $cacheFile, $quality); + } + } else { + imagejpeg($targetImage, $cacheFile, $quality); + } + + return ($webFile); +} + +/** + * capiImgScaleHQ: Scales (or crops) an image in high quality. + * If scaling, the aspect ratio is maintained. + * + * Note: GDLib 2.x is required! + * + * Returns the path to the scaled temporary image. + * + * Note that this function does some very poor caching; + * it calculates an md5 hash out of the image plus the + * maximum X and Y sizes, and uses that as the file name. + * If the file is older than the specified cache time, regenerate it. + * + * @param string $img The path to the image (relative to the frontend) + * @param int $maxX The maximum size in x-direction + * @param int $maxY The maximum size in y-direction + * @param boolean $crop If true, the image is cropped and not scaled. + * @param boolean $expand If true, the image is expanded (e.g. really scaled). + * If false, the image will only be made smaller. + * @param int $cacheTime The number of minutes to cache the image, use 0 for unlimited + * @param int $quality The quality of the output file + * @param boolean $keepType If true and a png file is source, output file is also png + * + * @return string !!!URL!!! to the resulting image (http://...) + */ +function capiImgScaleHQ($img, $maxX, $maxY, $crop = false, $expand = false, $cacheTime = 10, $quality = 75, $keepType = false) { + global $cfgClient, $lang, $client; + + $filename = $img; + $cacheTime = (int) $cacheTime; + $quality = (int) $quality; + + if ($quality <= 0 || $quality > 100) { + $quality = 75; + } + + $filetype = substr($filename, strlen($filename) - 4, 4); + $filesize = filesize($img); + $md5 = capiImgScaleGetMD5CacheFile($img, $maxX, $maxY, $crop, $expand); + + /* Create the target file names for web and server */ + if ($keepType) { // Should we keep the file type? + switch (strtolower($filetype)) { // Just using switch if someone likes to add other types + case ".png": + $cfileName = $md5 . ".png"; + break; + default: + $cfileName = $md5 . ".jpg"; + } + } else { // No... use .jpg + $cfileName = $md5 . ".jpg"; + } + + $cacheFile = $cfgClient[$client]["path"]["frontend"] . "cache/" . $cfileName; + $webFile = $cfgClient[$client]["path"]["htmlpath"] . "cache/" . $cfileName; + + /* Check if the file exists. If it does, check if the file is valid. */ + if (file_exists($cacheFile)) { + if ($cacheTime == 0) { + // Do not check expiration date + return $webFile; + } else if (!function_exists("md5_file")) { // TODO: Explain why this is still needed ... or remove it + if ((filemtime($cacheFile) + (60 * $cacheTime)) < time()) { + /* Cache time expired, unlink the file */ + unlink($cacheFile); + } else { + /* Return the web file name */ + return $webFile; + } + } else { + return $webFile; + } + } + + /* Get out which file we have */ + switch (strtolower($filetype)) { + case ".gif": $function = "imagecreatefromgif"; + break; + case ".png": $function = "imagecreatefrompng"; + break; + case ".jpg": $function = "imagecreatefromjpeg"; + break; + case "jpeg": $function = "imagecreatefromjpeg"; + break; + default: return false; + } + + if (function_exists($function)) { + $imageHandle = @$function($filename); + } + + /* If we can't open the image, return false */ + if (!$imageHandle) { + return false; + } + + $x = imagesx($imageHandle); + $y = imagesy($imageHandle); + + /* Calculate the aspect ratio */ + $aspectXY = $x / $y; + $aspectYX = $y / $x; + + if (($maxX / $x) < ($maxY / $y)) { + $targetY = $y * ($maxX / $x); + $targetX = round($maxX); + + // force wished height + if ($targetY < $maxY) { + $targetY = ceil($targetY); + } else { + $targetY = floor($targetY); + } + } else { + $targetX = $x * ($maxY / $y); + $targetY = round($maxY); + + // force wished width + if ($targetX < $maxX) { + $targetX = ceil($targetX); + } else { + $targetX = floor($targetX); + } + } + + if ($expand == false && (($targetX > $x) || ($targetY > $y))) { + $targetX = $x; + $targetY = $y; + } + + $targetX = ($targetX != 0) ? $targetX : 1; + $targetY = ($targetY != 0) ? $targetY : 1; + + /* Create the target image with the target size, resize it afterwards. */ + if ($crop) { + /* Create the target image with the max size, crop it afterwards. */ + $targetImage = imagecreatetruecolor($maxX, $maxY); + imagecopy($targetImage, $imageHandle, 0, 0, 0, 0, $maxX, $maxY); + } else { + /* Create the target image with the target size, resize it afterwards. */ + $targetImage = imagecreatetruecolor($targetX, $targetY); + imagecopyresampled($targetImage, $imageHandle, 0, 0, 0, 0, $targetX, $targetY, $x, $y); + } + + // Output the file + if ($keepType) { + switch (strtolower($filetype)) { + case ".png": + imagepng($targetImage, $cacheFile); // no quality option available + break; + default: + imagejpeg($targetImage, $cacheFile, $quality); + } + } else { + imagejpeg($targetImage, $cacheFile, $quality); + } + + return ($webFile); +} + +/** + * capiImgScaleImageMagick: Scales (or crops) an image using ImageMagick. + * If scaling, the aspect ratio is maintained. + * + * Note: ImageMagick is required! + * + * Returns the path to the scaled temporary image. + * + * Note that this function does some very poor caching; + * it calculates an md5 hash out of the image plus the + * maximum X and Y sizes, and uses that as the file name. + * If the file is older than the specified cache time, regenerate it. + * + * @param string $img The path to the image (relative to the frontend) + * @param int $maxX The maximum size in x-direction + * @param int $maxY The maximum size in y-direction + * @param boolean $crop If true, the image is cropped and not scaled. + * @param boolean $expand If true, the image is expanded (e.g. really scaled). + * If false, the image will only be made smaller. + * @param int $cacheTime The number of minutes to cache the image, use 0 for unlimited + * @param int $quality The quality of the output file + * @param boolean $keepType If true and a png file is source, output file is also png + * + * @return string !!!URL!!! to the resulting image (http://...) + */ +function capiImgScaleImageMagick($img, $maxX, $maxY, $crop = false, $expand = false, $cacheTime = 10, $quality = 75, $keepType = false) { + global $cfgClient, $lang, $client; + + $filename = $img; + $cacheTime = (int) $cacheTime; + $quality = (int) $quality; + + if ($quality <= 0 || $quality > 100) { + $quality = 75; + } + + $filetype = substr($filename, strlen($filename) - 4, 4); + $filesize = filesize($img); + $md5 = capiImgScaleGetMD5CacheFile($img, $maxX, $maxY, $crop, $expand); + + /* Create the target file names for web and server */ + if ($keepType) { // Should we keep the file type? + switch (strtolower($filetype)) { // Just using switch if someone likes to add other types + case ".png": + $cfileName = $md5 . ".png"; + break; + default: + $cfileName = $md5 . ".jpg"; + } + } else { // No... use .jpg + $cfileName = $md5 . ".jpg"; + } + + $cacheFile = $cfgClient[$client]["path"]["frontend"] . "cache/" . $cfileName; + $webFile = $cfgClient[$client]["path"]["htmlpath"] . "cache/" . $cfileName; + + /* Check if the file exists. If it does, check if the file is valid. */ + if (file_exists($cacheFile)) { + if ($cacheTime == 0) { + // Do not check expiration date + return $webFile; + } else if (!function_exists("md5_file")) { // TODO: Explain why this is still needed ... or remove it + if ((filemtime($cacheFile) + (60 * $cacheTime)) < time()) { + /* Cache time expired, unlink the file */ + unlink($cacheFile); + } else { + /* Return the web file name */ + return $webFile; + } + } else { + return $webFile; + } + } + + list($x, $y) = @getimagesize($filename); + if ($x == 0 || $y == 0) { + return false; + } + + /* Calculate the aspect ratio */ + $aspectXY = $x / $y; + $aspectYX = $y / $x; + + if (($maxX / $x) < ($maxY / $y)) { + $targetY = $y * ($maxX / $x); + $targetX = round($maxX); + + // force wished height + if ($targetY < $maxY) { + $targetY = ceil($targetY); + } else { + $targetY = floor($targetY); + } + } else { + $targetX = $x * ($maxY / $y); + $targetY = round($maxY); + + // force wished width + if ($targetX < $maxX) { + $targetX = ceil($targetX); + } else { + $targetX = floor($targetX); + } + } + + if ($expand == false && (($targetX > $x) || ($targetY > $y))) { + $targetX = $x; + $targetY = $y; + } + + $targetX = ($targetX != 0) ? $targetX : 1; + $targetY = ($targetY != 0) ? $targetY : 1; + + // if is animated gif resize first frame + if ($filetype == ".gif") { + if (isAnimGif($filename)) { + $filename .= "[0]"; + } + } + + /* Try to execute convert */ + $output = array(); + $retVal = 0; + if ($crop) { + exec("convert -gravity center -quality " . $quality . " -crop {$maxX}x{$maxY}+1+1 \"$filename\" $cacheFile", $output, $retVal); + } else { + exec("convert -quality " . $quality . " -geometry {$targetX}x{$targetY} \"$filename\" $cacheFile", $output, $retVal); + } + + if (!file_exists($cacheFile)) { + return false; + } else { + return ($webFile); + } +} + +/** + * check if gif is animated + * + * @param string file path + * + * @return boolean true (gif is animated)/ false (single frame gif) + */ +function isAnimGif($sFile) { + $output = array(); + $retval = 0; + + exec('identify ' . $sFile, $output, $retval); + + if (count($output) == 1) { + return false; + } + + return true; +} + +/** + * capiImgScale: Scales (or crops) an image. + * If scaling, the aspect ratio is maintained. + * + * This function chooses the best method to scale, depending on + * the system environment and/or the parameters. + * + * Returns the path to the scaled temporary image. + * + * Note that this function does some very poor caching; + * it calculates an md5 hash out of the image plus the + * maximum X and Y sizes, and uses that as the file name. + * If the file is older than 10 minutes, regenerate it. + * + * @param string $img The path to the image (relative to the frontend) + * @param int $maxX The maximum size in x-direction + * @param int $maxY The maximum size in y-direction + * @param boolean $crop If true, the image is cropped and not scaled. + * @param boolean $expand If true, the image is expanded (e.g. really scaled). + * If false, the image will only be made smaller. + * @param int $cacheTime The number of minutes to cache the image, use 0 for unlimited + * @param boolean $wantHQ If true, try to force high quality mode + * @param int $quality The quality of the output file + * @param boolean $keepType If true and a png file is source, output file is also png + * + * @return string !!!URL!!! to the resulting image (http://...) + * + * @return string Path to the resulting image + */ +function capiImgScale($img, $maxX, $maxY, $crop = false, $expand = false, $cacheTime = 10, $wantHQ = false, $quality = 75, $keepType = false) { + global $client, $db, $cfg, $cfgClient; + + $deleteAfter = false; + + $sRelativeImg = str_replace($cfgClient[$client]["upl"]["path"], "", $img); + if (is_dbfs($sRelativeImg)) { + // This check should be faster than a file existance check + $dbfs = new DBFSCollection; + + $file = basename($sRelativeImg); + + $dbfs->writeToFile($sRelativeImg, $cfgClient[$client]["path"]["frontend"] . "cache/" . $file); + + $img = $cfgClient[$client]["path"]["frontend"] . "cache/" . $file; + $deleteAfter = true; + } else if (!file_exists($img)) { + /* Try with upload string */ + if (file_exists($cfgClient[$client]["upl"]["path"] . $img) && !is_dir($cfgClient[$client]["upl"]["path"] . $img)) { + $img = $cfgClient[$client]["upl"]["path"] . $img; + } else { + /* No, it's neither in the upload directory nor in the dbfs. return. */ + return false; + } + } + + $filename = $img; + $filetype = substr($filename, strlen($filename) - 4, 4); + + $mxdAvImgEditingPosibility = checkImageEditingPosibility(); + switch ($mxdAvImgEditingPosibility) { + case '1': // gd1 + $method = 'gd1'; + if (!function_exists('imagecreatefromgif') && $filetype == '.gif') { + $method = 'failure'; + } + break; + case '2': //gd2 + $method = 'gd2'; + if (!function_exists('imagecreatefromgif') && $filetype == '.gif') { + $method = 'failure'; + } + break; + case 'im': //imagemagick + $method = 'im'; + break; + case '0': + $method = 'failure'; + break; + default: + $method = 'failure'; + break; + } + + switch ($method) { + case 'gd1': + $return = capiImgScaleLQ($img, $maxX, $maxY, $crop, $expand, $cacheTime, $quality, $keepType); + break; + + case 'gd2': + $return = capiImgScaleHQ($img, $maxX, $maxY, $crop, $expand, $cacheTime, $quality, $keepType); + break; + + case 'im': + $return = capiImgScaleImageMagick($img, $maxX, $maxY, $crop, $expand, $cacheTime, $quality, $keepType); + break; + + case 'failure': + $return = str_replace($cfgClient[$client]["path"]["frontend"], $cfgClient[$client]["path"]["htmlpath"], $img); + break; + } + + if ($deleteAfter == true) { + unlink($img); + } + + return $return; +} + +/** + * check possible image editing functionality + * + * return mixed information about installed image editing extensions/tools + */ +function checkImageEditingPosibility() { + + if (isImageMagickAvailable()) { + return 'im'; + } else { + if (extension_loaded('gd')) { + if (function_exists('gd_info')) { + $arrGDInformations = gd_info(); + + if (preg_match('#([0-9\.])+#', $arrGDInformations['GD Version'], $strGDVersion)) { + if ($strGDVersion[0] >= '2') { + return '2'; + } + return '1'; + } + return '1'; + } + return '1'; + } + return '0'; + } +} + +?> \ No newline at end of file diff --git a/conlite/includes/functions.api.php b/conlite/includes/functions.api.php new file mode 100644 index 0000000..5452bf4 --- /dev/null +++ b/conlite/includes/functions.api.php @@ -0,0 +1,39 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-08-08 + * modified 2008-06-25, Frederic Schneider, add security fix + * + * $Id: functions.api.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude('includes', 'functions.api.category.php'); +cInclude('includes', 'functions.api.string.php'); +cInclude('includes', 'functions.api.images.php'); + +?> diff --git a/conlite/includes/functions.api.string.php b/conlite/includes/functions.api.string.php new file mode 100644 index 0000000..2c45428 --- /dev/null +++ b/conlite/includes/functions.api.string.php @@ -0,0 +1,398 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-08-08 + * modified 2008-06-25, Frederic Schneider, add security fix + * modified 2008-09-15, Murat Purc, add replacement of characters with diacritics + * modified 2009-04-30, Ortwin Pinke, CON-252 + * modified 2010-01-07, Ingo van Peren, CON-293 + * + * $Id: functions.api.string.php 401 2015-11-19 14:07:25Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Info: + * This file contains Contenido String API functions. + * + * If you are planning to add a function, please make sure that: + * 1.) The function is in the correct place + * 2.) The function is documented + * 3.) The function makes sense and is generically usable + * + */ + + +/** + * capiStrTrimAfterWord: Trims a string to a given + * length and makes sure that all words up to + * $maxlen are preserved, without exceeding $maxlen. + * + * Warning: Currently, this function uses a regular + * ASCII-Whitespace to do the seperation test. If + * you are using ' ' to create spaces, this + * function will fail. + * + * Example: + * $string = "This is a simple test"; + * echo capiStrTrimAfterWord ($string, 15); + * + * This would output "This is a", since + * this function respects word boundaries + * and doesn't operate beyond the limit given + * by $maxlen. + * + * @param $string string The string to operate on + * @param $maxlen int The maximum number of characters + * + * @return string The resulting string + */ +function capiStrTrimAfterWord ($string, $maxlen) +{ + /* If the string is smaller than the maximum + lenght, it makes no sense to process it any + further. Return it. */ + if (strlen($string) < $maxlen) + { + return $string; + } + + /* If the character after the $maxlen + position is a space, we can return + the string until $maxlen */ + if (substr($string, $maxlen,1) == ' ') + { + return substr($string, 0, $maxlen); + } + + /* Cut the string up to $maxlen so we can + use strrpos (reverse str position) */ + $cutted_string = substr($string, 0, $maxlen); + + /* Extract the end of the last word */ + $last_word_position = strrpos($cutted_string, ' '); + + return (substr($cutted_string, 0, $last_word_position)); +} + +/** + * capiStrTrimHard: Trims a string to a specific + * length. If the string is longer than $maxlen, + * dots are inserted ("...") right before $maxlen. + * + * Example: + * $string = "This is a simple test"; + * echo capiStrTrimHard ($string, 15); + * + * This would output "This is a si...", since + * the string is longer than $maxlen and the + * resulting string matches 15 characters including + * the dots. + * + * @param $string string The string to operate on + * @param $maxlen int The maximum number of characters + * + * @return string The resulting string + */ +function capiStrTrimHard ($string, $maxlen, $fillup = "...") +{ + + /* If the string is smaller than the maximum + lenght, it makes no sense to process it any + further. Return it. */ + if (strlen($string) < $maxlen) + { + return $string; + } + + /* Calculate the maximum text length */ + $maximum_text_length = $maxlen - strlen($fillup); + + /* Cut it */ + $cutted_string = substr($string, 0, $maximum_text_length); + + /* Append the fillup string */ + $cutted_string .= $fillup; + + return ($cutted_string); +} + +/** + * capiStrTrimSentence: Trims a string to a + * approximate length. Sentence boundaries are + * preserved. + * + * The algorythm inside calculates the sentence + * length to the previous and next sentences. + * The distance to the next sentence which is + * smaller will be taken to trim the string + * to match the approximate length parameter. + * + * Example: + * + * $string = "This contains two sentences. "; + * $string .= "Lets play around with them. "; + * + * echo capiStrTrimSentence($string, 40); + * echo capiStrTrimSentence($string, 50); + * + * The first example would only output the first sentence, + * the second example both sentences. + * + * Explanation: + * + * To match the given max length closely, + * the function calculates the distance to + * the next and previous sentences. Using + * the maxlength of 40 characters, the + * distance to the previous sentence would + * be 8 characters, and to the next sentence + * it would be 19 characters. Therefore, + * only the previous sentence is displayed. + * + * The second example displays the second + * sentence also, since the distance to the + * next sentence is only 9 characters, but + * to the previous it is 18 characters. + * + * If you specify the boolean flag "$hard", + * the limit parameter creates a hard limit + * instead of calculating the distance. + * + * This function ensures that at least one + * sentence is returned. + * + * @param $string string The string to operate on + * @param $approxlen int The approximate number of characters + * @param $hard boolean If true, use a hard limit for the number of characters (default: false) + * @return string The resulting string + */ +function capiStrTrimSentence ($string, $approxlen, $hard = false) +{ + + /* If the string is smaller than the maximum + lenght, it makes no sense to process it any + further. Return it. */ + if (strlen($string) < $approxlen) + { + return $string; + } + + /* Find out the start of the next sentence */ + $next_sentence_start = strpos($string, '.', $approxlen); + + /* If there's no next sentence (somebody forgot the dot?), + set it to the end of the string. */ + if ($next_sentence_start === false) + { + $next_sentence_start = strlen($string); + } + + /* Cut the previous sentence so we can use strrpos */ + $previous_sentence_cutted = substr($string, 0, $approxlen); + + /* Get out the previous sentence start */ + $previous_sentence_start = strrpos($previous_sentence_cutted, '.'); + + /* If the sentence doesn't contain a dot, use the text start. */ + if ($previous_sentence_start === false) + { + $previous_sentence_start = 0; + } + + /* If we have a hard limit, we only want to process + everything before $approxlen */ + if (($hard == true) && ($next_sentence_start > $approxlen)) + { + return (substr($string, 0, $previous_sentence_start+1)); + } + + /* Calculate next and previous sentence distances */ + $distance_previous_sentence = $approxlen - $previous_sentence_start; + $distance_next_sentence = $next_sentence_start - $approxlen; + + /* Sanity: Return at least one sentence. */ + $sanity = substr($string, 0, $previous_sentence_start + 1); + + if (strpos($sanity,'.') === false) + { + return (substr($string, 0, $next_sentence_start + 1)); + } + + /* Decide wether the next or previous sentence is nearer */ + if ($distance_previous_sentence > $distance_next_sentence) + { + return (substr($string, 0, $next_sentence_start+1)); + } else { + return (substr($string, 0, $previous_sentence_start+1)); + } +} + +/** + * capiStrReplaceDiacritics: Converts diactritics + * to english characters whenever possible. + * + * Source and Target-Encoding isn't used anymore, remain for compatibility reasons + * string is always converted to utf-8 + * + * @since CL 2.0 + * + * @staticvar array $aSearch + * @staticvar array $aReplace + * @param string $sString + * @param string $sourceEncoding + * @param string $targetEncoding + * @return string returns cleaned string + */ +function capiStrReplaceDiacritics($sString, $sourceEncoding = null, $targetEncoding = null) { + static $aSearch, $aReplace; + if (!isset($aSearch) || !isset($aReplace)) { + $aSearch = array('Ä','Ö','Ü','ä','ö','ü','ß','Á','À','Â','á','à','â','É','È','Ê','é','è','ê','Í','Ì','Î','í','ì','î','Ó','Ò','Ô','ó','ò','ô','Ú','Ù','Û','ú','ù','û'); + $aReplace = array('Ae','Oe','Ue','ae','oe','ue','ss','A','A','A','a','a','a','E','E','E','e','e','e','I','I','I','i','i','i','O','O','O','o','o','o','U','U','U','u','u','u'); + } + // always use utf-8 + if(function_exists("mb_convert_encoding")) { + $sString = mb_convert_encoding($sString, "UTF-8", mb_detect_encoding($sString, "UTF-8, ISO-8859-1, ISO-8859-15", true)); + } else { + $sString = utf8_encode($sString); + } + $sString = str_replace($aSearch, $aReplace, $sString); + + return $sString; +} + + +/** + * capiStrRecodeString: Converts a string to another encoding. + * This function tries to detect which function to use (either + * recode or iconv). + * + * If $sourceEncoding and $targetEncoding are the same, this + * function returns immediately. + * + * For more information about encodings, refer to + * http://en.wikipedia.org/wiki/Character_encoding + * + * For more information about the supported encodings in recode, + * refer to + * http://www.delorie.com/gnu/docs/recode/recode_toc.html + * + * Note: depending on whether recode or iconv is used, the + * supported charsets differ. The following ones are commonly used + * and are most likely supported by both converters: + * + * - ISO-8859-1 to ISO-8859-15 + * - ASCII + * - UTF-8 + * + * @todo Check if the charset names are the same for both converters + * @todo Implement a converter and charset checker to ensure compilance. + * + * @param $sString string The string to operate on + * @param $targetEncoding string The target encoding (if false, use source encoding) + * @param $sourceEncoding string The source encoding (default: ISO-8859-1) + * @return string The resulting string + * + * @author Timo A. Hummel + * @copyright four for business AG, http://www.4fb.de + */ +function capiStrRecodeString ($sString, $sourceEncoding, $targetEncoding) +{ + /* If sourceEncoding and targetEncoding are the same, return */ + if ($sourceEncoding == $targetEncoding) + { + return $sString; + } + + /* Check for the "recode" support */ + if (function_exists("recode")) + { + $sResult = recode_string("$sourceEncoding..$targetEncoding", $sString); + + return ($sResult); + } + + /* Check for the "iconv" support */ + if (function_exists("iconv")) + { + $sResult = iconv($sourceEncoding, $targetEncoding, $sString); + + return ($sResult); + } + + /* No charset converters found; return with warning */ + cWarning(__FILE__, __LINE__, "capiStrRecodeString could not find either recode or iconv to do charset conversion."); + return ($sString); +} + +/** + * capiStrCleanURLCharacters: Removes or converts all "evil" + * URL characters. + * + * This function removes or converts all characters which can + * make an URL invalid. + * + * Clean characters include: + * - All characters between 32 and 126 which are not alphanumeric and + * aren't one of the following: _-. + * + * @param $sString string The string to operate on + * @param $bReplace string If true, all "unclean" characters are replaced + * @return string The resulting string + * + * @author Timo A. Hummel + * @copyright four for business AG, http://www.4fb.de + */ +function capiStrCleanURLCharacters ($sString, $bReplace = false) +{ + $sString = capiStrReplaceDiacritics($sString); + $sString = str_replace(" ", "-", $sString); + $sString = str_replace("/", "-", $sString); + $sString = str_replace("&", "-", $sString); + $sString = str_replace("+", "-", $sString); + + $iStrLen = strlen($sString); + + for ($i=0; $i < $iStrLen; $i++) + { + $sChar = substr($sString, $i, 1); + + if (preg_match('/^[a-z0-9]*$/i', $sChar) || $sChar == "-" || $sChar == "_" || $sChar == ".") + { + $sResultString .= $sChar; + } else { + if ($bReplace == true) + { + $sResultString .= "_"; + } + } + + } + + return ($sResultString); +} +?> diff --git a/conlite/includes/functions.con.php b/conlite/includes/functions.con.php new file mode 100644 index 0000000..c84534a --- /dev/null +++ b/conlite/includes/functions.con.php @@ -0,0 +1,2247 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-11-24, Mario Diaz, function conFlagOnOffline: Set publish date if article goes online + * modified 2008-06-25, Frederic Schneider, add security fix + * modified 2008-06-26, Timo.Trautmann, add security fix fix setting article online was not possible + * modified 2008-08-29, Murat Purc, add new chain execution, and handling og new field con_cat_lang.urlname + * modified 2008-09-07, Murat Purc, bugfix in conCopyArtLang at chain execution + * modified 2008-09-12, Oliver Lohkemper, bugfix in function conChangeTemplateForCat, add conGenerateCodeForAllartsInCategory() + * modified 2009-04-23, Andreas Lindner, also copy alias of article when syncing article to another language + * modified 2009-05-05, Timo Trautmann - optional use for copy label on copy proccess + * modified 2009-10-07, Murat Purc, bugfix in conMoveArticles (missing apostrophe) + * modified 2009-12-01, Dominik Ziegler, bugfix in conFlagOnOffline (article is still offline if enddate in time management is missing) + * modified 2009-10-27, Murat Purc, fixed/modified CEC_Hook, see [#CON-256] + * modified 2010-10-13, Dominik Ziegler, No copy label per default when copying articles or categories (CON-352) + * + * $Id: functions.con.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/* Compatibility: Include new functions.con2.php */ +cInclude("includes", "functions.con2.php"); + + +/** + * Create a new Article + * + * @param mixed many + * @author Olaf Niemann + * @copyright four for business AG + * + * @return int Id of the new article + */ +function conEditFirstTime($idcat, $idcatnew, $idart, $is_start, $idtpl, + $idartlang, $idlang, $title, $summary, $artspec, $created, + $lastmodified, $author, $online, $datestart, $dateend, + $artsort, $keyart=0) +{ + + global $db; + global $client; + global $lang; + global $cfg; + global $auth; + global $urlname; + global $page_title; + //Some stuff for the redirect + global $redirect; + global $redirect_url; + global $external_redirect; + global $time_move_cat; // Used to indicate "move to cat" + global $time_target_cat; // Used to indicate the target category + global $time_online_move; // Used to indicate if the moved article should be online + global $timemgmt; + global $_POST; + + $page_title = addslashes($page_title); + + $urlname = (trim($urlname) == '') ? trim($title) : trim($urlname); + $urlname = clHtmlSpecialChars(capiStrCleanURLCharacters($urlname), ENT_QUOTES); + $usetimemgmt = ($timemgmt == '1') ? '1' : '0'; + $movetocat = ($time_move_cat == '1') ? '1' : '0'; + $onlineaftermove = ($time_online_move == '1') ? '1' : '0'; + $redirect = ($redirect == '1') ? '1' : '0'; + $external_redirect = ($external_redirect == '1') ? '1' : '0'; + $redirect_url = ($redirect_url == 'http://' || $redirect_url == '') ? '0' : $redirect_url; + + if ($is_start == 1) { + $usetimemgmt = "0"; + } + + $new_idart = $db->nextid($cfg["tab"]["art"]); + + # Table 'cat_art' + # Check if there are articles in this category. + # If not make it a start article + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + + if ( $db->next_record() ) { + + if ($cfg["is_start_compatible"] == true) + { + $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." (idcatart, idcat, idart, is_start) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_art"]))."', '".Contenido_Security::toInteger($idcat)."', + '".Contenido_Security::toInteger($new_idart)."', '0')"; + $db->query($sql); + } else { + $autostart = false; + } + } else { + if ($cfg["is_start_compatible"] == true) + { + $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." (idcatart, idcat, idart, is_start) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_art"]))."', '".Contenido_Security::toInteger($idcat) ."', + '".Contenido_Security::toInteger($new_idart)."', '1')"; + $db->query($sql); + } else { + $autostart = false; + } + } + + # Table 'con_art' + $sql = "INSERT INTO ".$cfg["tab"]["art"]." (idart, idclient) VALUES ('".Contenido_Security::toInteger($new_idart)."', '".Contenido_Security::toInteger($client)."')"; + $db->query($sql); + + # Table 'con_stat' + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idart = '".Contenido_Security::toInteger($new_idart)."'"; + $db->query($sql); + $db->next_record(); + $idcatart = $db->f("idcatart"); + + $a_languages[] = $lang; + foreach ($a_languages as $tmp_lang) { + $sql = "INSERT INTO ".$cfg["tab"]["stat"]." (idstat, idcatart, idlang, idclient, visited) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["stat"]))."', + '".Contenido_Security::toInteger($idcatart)."', '".Contenido_Security::toInteger($tmp_lang)."', '".Contenido_Security::toInteger($client)."', '0')"; + $db->query($sql); + } + + # Table 'con_art_lang' + # One entry for every language + foreach ($a_languages as $tmp_lang) { + + $lastmodified = ( $lang == $tmp_lang ) ? $lastmodified : 0; + + $nextidartlang = $db->nextid($cfg["tab"]["art_lang"]); + if(($online==1)){ + $published_value = date("Y-m-d H:i:s"); + $publishedby_value = $auth->auth["uname"]; + }else{ + $published_value = ''; + $publishedby_value = ''; + } + + $sql = "INSERT INTO + ".$cfg["tab"]["art_lang"]." ( + idartlang, + idart, + idlang, + title, + urlname, + pagetitle, + summary, + artspec, + created, + lastmodified, + author, + published, + publishedby, + online, + redirect, + redirect_url, + external_redirect, + artsort, + timemgmt, + datestart, + dateend, + status, + time_move_cat, + time_target_cat, + time_online_move + ) VALUES ( + '".Contenido_Security::toInteger($nextidartlang)."', + '".Contenido_Security::toInteger($new_idart)."', + '".Contenido_Security::toInteger($tmp_lang)."', + '".Contenido_Security::escapeDB($title, $db)."', + '".Contenido_Security::escapeDB($urlname, $db)."', + '".Contenido_Security::escapeDB($page_title, $db)."', + '".Contenido_Security::escapeDB($summary, $db)."', + '".Contenido_Security::escapeDB($artspec, $db)."', + '".Contenido_Security::escapeDB($created, $db)."', + '".Contenido_Security::escapeDB($lastmodified, $db)."', + '".Contenido_Security::escapeDB($auth->auth["uname"], $db)."', + '".Contenido_Security::escapeDB($published_value, $db)."', + '".Contenido_Security::escapeDB($publishedby_value, $db)."', + '".Contenido_Security::escapeDB($online, $db)."', + '".Contenido_Security::escapeDB($redirect, $db)."', + '".Contenido_Security::escapeDB($redirect_url, $db)."', + '".Contenido_Security::escapeDB($external_redirect, $db)."', + '".Contenido_Security::escapeDB($artsort, $db)."', + '".Contenido_Security::escapeDB($usetimemgmt, $db)."', + '".Contenido_Security::escapeDB($datestart, $db)."', + '".Contenido_Security::escapeDB($dateend, $db)."', + '0', + '".Contenido_Security::escapeDB($movetocat, $db)."', + '".Contenido_Security::escapeDB($time_target_cat, $db)."', + '".Contenido_Security::escapeDB($onlineaftermove, $db)."')"; + + $db->query($sql); + + if ($cfg["is_start_compatible"] == false) + { + if ($autostart == true) + { + conMakeStart($idcatart, 1); + } else { + conMakeStart($idcatart, 0); + } + + } + + $availableTags = conGetAvailableMetaTagTypes(); + + foreach ($availableTags as $key => $value) + { + conSetMetaValue($nextidartlang, + $key, + $_POST['META'.$value["name"]]); + } + } + + # Set new idart + $idart = $new_idart; + + # Table 'cat_art' + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".Contenido_Security::toInteger($idart)."'"; // get all idcats that contain art + $db->query($sql); + + while ($db->next_record()) { + $tmp_idcat[] = $db->f("idcat"); + } + + if ( !is_array($idcatnew) ) { $idcatnew[0] = 0; } + if ( !is_array($tmp_idcat) ) { $tmp_idcat[0] = 0; } + + foreach ($idcatnew as $value) { + + if ( !in_array($value, $tmp_idcat) ) { + + # INSERT -> Table 'cat_art' + $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." (idcatart, idcat, idart) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_art"]))."', '".Contenido_Security::toInteger($value)."', + '".Contenido_Security::toInteger($idart)."')"; + $db->query($sql); + + # Entry in 'stat'-table for all languages + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($value)."' AND idart='".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + $db->next_record(); + $tmp_idcatart = $db->f("idcatart"); + + $a_languages = getLanguagesByClient($client); + + foreach ($a_languages as $tmp_lang) { + + $sql = "INSERT INTO ".$cfg["tab"]["stat"]." (idstat, idcatart, idlang, idclient, visited) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["stat"]))."', + '".Contenido_Security::toInteger($tmp_idcatart)."', '".Contenido_Security::toInteger($tmp_lang)."', '".Contenido_Security::toInteger($client)."', '0')"; + $db->query($sql); + } + } + } + + + foreach ($tmp_idcat as $value) { + + if ( !in_array($value, $idcatnew) ) { + + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($value)."' AND idart='".Contenido_Security::toInteger($idart)."'"; // get all idcatarts that will no longer exist + $db->query($sql); + + //******** delete from 'code'-table *************** // and delete corresponding code + $sql = "DELETE FROM ".$cfg["tab"]["code"]." WHERE idcatart='".Contenido_Security::toInteger($db->f("idcatart"))."'"; + $db->query($sql); + + //******* delete from 'stat'-table **************** + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($value)."' AND idart='".Contenido_Security::toInteger($idart)."' "; + $db->query($sql); + + while ($db->next_record()) { + $a_idcatart[] = $db->f("idcatart"); + } + + if (is_array($a_idcatart)) { + + foreach ($a_idcatart AS $value2) { + //****** delete from 'stat'-table ************ + $sql = "DELETE FROM ".$cfg["tab"]["stat"]." WHERE idcatart='".Contenido_Security::toInteger($value2)."'"; + $db->query($sql); + } + } + + //******** delete from 'cat_art'-table *************** + $sql = "DELETE FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idcat='".Contenido_Security::toInteger($value)."'"; + $db->query($sql); + + /* Remove startidartlang */ + if (isStartArticle($idartlang, $idcat, $lang)) + { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET startidartlang='0' WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } + + //******** delete from 'tpl_conf'-table *************** + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + $tmp_idtplcfg = $db->f('idtplcfg'); + + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($tmp_idtplcfgm)."'"; + $db->query($sql); + + } + } + + + //********* update into 'art_lang'-table for all languages ****** + if ( !$title ) $title = "--- " . i18n("Default title"). " ---"; + + $a_languages = getLanguagesByClient($client); + + foreach ($a_languages as $tmp_lang) { + $tmp_online = ( $lang == $tmp_lang ) ? $online : 0; + $tmp_lastmodified = ( $lang == $tmp_lang ) ? $lastmodified : 0; + + $sql = "UPDATE + ".$cfg["tab"]["art_lang"]." + SET + title = '".Contenido_Security::escapeDB($title, $db)."', + urlname = '".Contenido_Security::escapeDB($urlname, $db)."', + pagetitle = '".Contenido_Security::escapeDB($page_title, $db)."', + summary = '".Contenido_Security::escapeDB($summary, $db)."', + artspec = '".Contenido_Security::escapeDB($artspec, $db)."', + created = '".Contenido_Security::escapeDB($created, $db)."', + lastmodified = '".Contenido_Security::escapeDB($tmp_lastmodified, $db)."', + modifiedby = '".Contenido_Security::escapeDB($author, $db)."', + online = '".Contenido_Security::toInteger($tmp_online)."', + datestart = '".Contenido_Security::escapeDB($datestart, $db)."', + dateend = '".Contenido_Security::escapeDB($dateend, $db)."', + redirect = '".Contenido_Security::escapeDB($redirect, $db)."', + external_redirect = '".Contenido_Security::escapeDB($external_redirect, $db)."', + redirect_url = '".Contenido_Security::escapeDB($redirect_url, $db)."', + artsort = '".Contenido_Security::escapeDB($artsort, $db)."' + WHERE + idart = '".Contenido_Security::toInteger($new_idart)."' AND + idlang = '".Contenido_Security::toInteger($tmp_lang)."'"; + + $db->query($sql); + } + + return $new_idart; +} + + + + +/** + * Edit an existing article + * + * @param mixed many + * @return void + * + * @author Olaf Niemann + * @copyright four for business AG + */ +function conEditArt($idcat, $idcatnew, $idart, $is_start, $idtpl, $idartlang, + $idlang, $title, $summary, $artspec, $created, $lastmodified, $author, + $online, $datestart, $dateend, $artsort, $keyart = 0) +{ + $args = func_get_args(); + + global $db, $client, $lang, $cfg, $redirect, $redirect_url, $external_redirect, $perm; + global $urlname; + global $time_move_cat, $time_target_cat; + global $time_online_move; // Used to indicate if the moved article should be online + global $timemgmt; + global $page_title; + global $_POST; + + /* Add slashes because single quotes + will crash the db */ + $page_title = addslashes($page_title); + + $urlname = (trim($urlname) == '') ? trim($title) : trim($urlname); + $urlname = clHtmlSpecialChars(capiStrCleanURLCharacters($urlname), ENT_QUOTES); + $usetimemgmt = ($timemgmt == '1') ? '1': '0'; + $onlineaftermove = ($time_online_move == '1') ? '1' : '0'; + $movetocat = ($time_move_cat == '1') ? '1' : '0'; + $redirect = ('1' == $redirect ) ? 1 : 0; + $redirect_url = ($redirect_url == 'http://' || $redirect_url == '') ? '0' : $redirect_url; + $external_redirect = ($external_redirect == '1') ? 1 : 0; + + if ($is_start == 1) + { + $usetimemgmt = "0"; + } + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".Contenido_Security::toInteger($idart)."'"; // get all idcats that contain art + $db->query($sql); + + while ($db->next_record()) { + $tmp_idcat[] = $db->f("idcat"); + } + + if ( !is_array($idcatnew) ) { + $idcatnew[0] = 0; + } + + if ( !is_array($tmp_idcat) ) { + $tmp_idcat[0] = 0; + } + + // if (is_array($idcatnew)) { + foreach ($idcatnew as $value) { + + if (!in_array($value, $tmp_idcat) ) { + + # INSERT insert 'cat_art' table + $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." (idcatart, idcat, idart) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_art"]))."', '".Contenido_Security::toInteger($value)."', + '".Contenido_Security::toInteger($idart)."')"; + $db->query($sql); + + # entry in 'stat'-table for all languages + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($value)."' AND idart='".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + $db->next_record(); + + $tmp_idcatart = $db->f("idcatart"); + + $a_languages = getLanguagesByClient($client); + + foreach ($a_languages as $tmp_lang) { + $sql = "INSERT INTO ".$cfg["tab"]["stat"]." (idstat, idcatart, idlang, idclient, visited) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["stat"]))."', + '".Contenido_Security::toInteger($tmp_idcatart)."', '".Contenido_Security::toInteger($tmp_lang)."', '".Contenido_Security::toInteger($client)."', '0')"; + $db->query($sql); + } + } + } + + + foreach ($tmp_idcat as $value) { + + if (!in_array($value, $idcatnew)) { + + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($value)."' AND idart='".Contenido_Security::toInteger($idart)."'"; // get all idcatarts that will no longer exist + $db->query($sql); + + //******** delete from 'code'-table *************** // and delete corresponding code + $sql = "DELETE FROM ".$cfg["tab"]["code"]." WHERE idcatart='".Contenido_Security::toInteger($db->f("idcatart"))."'"; + $db->query($sql); + + //******* delete from 'stat'-table **************** + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($value)."' AND idart='".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + while ($db->next_record()) { + $a_idcatart[] = $db->f("idcatart"); + } + + if (is_array($a_idcatart)) { + foreach ($a_idcatart as $value2) { + //****** delete from 'stat'-table ************ + $sql = "DELETE FROM ".$cfg["tab"]["stat"]." WHERE idcatart='".Contenido_Security::toInteger($value2)."'"; + $db->query($sql); + } + } + + //******** delete from 'cat_art'-table *************** + $sql = "DELETE FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idcat='".Contenido_Security::toInteger($value)."'"; + $db->query($sql); + + /* Remove startidartlang */ + if (isStartArticle($idartlang, $idcat, $lang)) + { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET startidartlang='0' WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } + + } + + } + + // If the user has no right for makeonline, don't update it. + if (!$perm->have_perm_area_action("con","con_makeonline") && + !$perm->have_perm_area_action_item("con","con_makeonline", $idcat)) + { + $sqlonline = ""; + } else { + $sqlonline = "online = '".Contenido_Security::escapeDB($online, $db)."',"; + if($online=='1'){ + //Check if online id is currently 0 + $sql = "SELECT online FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang='".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); + if($db->next_record()){ + if($db->f("online")==0){ + //Only update if value changed from 0 to 1 + $sqlonline.="published = '".date("Y-m-d H:i:s")."', publishedby='".Contenido_Security::escapeDB($author, $db)."',"; + } + } + } + } + + if ($title == "") + { + $title = "--- ".i18n("Default title")." ---"; + } + + //******** update 'art_lang'-table ********** + $sql = "UPDATE + ".$cfg["tab"]["art_lang"]." + SET + title = '".Contenido_Security::escapeDB($title, $db)."', + urlname = '".Contenido_Security::escapeDB($urlname, $db)."', + pagetitle = '".Contenido_Security::escapeDB($page_title, $db)."', + summary = '".Contenido_Security::escapeDB($summary, $db)."', + artspec = '".Contenido_Security::escapeDB($artspec, $db)."', + created = '".Contenido_Security::escapeDB($created, $db)."', + lastmodified = '".Contenido_Security::escapeDB($lastmodified, $db)."', + modifiedby = '".Contenido_Security::escapeDB($author, $db)."', + $sqlonline + timemgmt = '".Contenido_Security::escapeDB($usetimemgmt, $db)."', + redirect = '".Contenido_Security::escapeDB($redirect, $db)."', + external_redirect = '".Contenido_Security::escapeDB($external_redirect, $db)."', + redirect_url = '".Contenido_Security::escapeDB($redirect_url, $db)."', + artsort = '".Contenido_Security::toInteger($artsort)."'"; + + if ($perm->have_perm_area_action("con", "con_makeonline") || + $perm->have_perm_area_action_item("con","con_makeonline", $idcat)) + { + $sql .= ", datestart = '".Contenido_Security::escapeDB($datestart, $db)."', + dateend = '".Contenido_Security::escapeDB($dateend, $db)."', + time_move_cat = '".Contenido_Security::toInteger($movetocat)."', + time_target_cat = '".Contenido_Security::toInteger($time_target_cat)."', + time_online_move = '".Contenido_Security::toInteger($onlineaftermove)."'"; + } + + + $sql .= "WHERE idartlang='".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); + + $availableTags = conGetAvailableMetaTagTypes(); + + foreach ($availableTags as $key => $value) + { + conSetMetaValue($idartlang, + $key, + $_POST['META'.$value["name"]]); + } + +} + +/** + * Save a content element and generate index + * + * @param integer $idartlang idartlang of the article + * @param string $type Type of content element + * @param integer $typeid Serial number of the content element + * @param string $value Content + * + * @return void + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + * + */ +function conSaveContentEntry($idartlang, $type, $typeid, $value, $bForce = false) +{ + global $auth, $cfg, $cfgClient, $client, $lang, $_cecRegistry; + + if ($bForce == true) { + $db = new DB_ConLite; + } else { + global $db; + } + + $date = date("Y-m-d H:i:s"); + $author = $auth->auth["uname"]; + + $cut_path = $cfgClient[$client]["path"]["htmlpath"]; + + $value = str_replace($cut_path, "", $value); + $value = stripslashes($value); + + $iterator = $_cecRegistry->getIterator("Contenido.Content.SaveContentEntry"); + + while ($chainEntry = $iterator->next()) + { + $value = $chainEntry->execute($idartlang, $type, $typeid, $value); + } + $value = urlencode($value); + + $sql = "SELECT * FROM ".$cfg["tab"]["type"]." WHERE type = '".Contenido_Security::escapeDB($type, $db)."'"; + $db->query($sql); + $db->next_record(); + $idtype=$db->f("idtype"); + + $sql = "SELECT * FROM ".$cfg["tab"]["content"]." WHERE idartlang='".Contenido_Security::toInteger($idartlang)."' AND idtype='".Contenido_Security::toInteger($idtype)."' AND typeid='".Contenido_Security::toInteger($typeid)."'"; + $db->query($sql); + + if ($db->next_record()) { + $sql = "UPDATE ".$cfg["tab"]["content"]." SET value='".Contenido_Security::escapeDB($value, $db)."', author='".Contenido_Security::escapeDB($author, $db)."', lastmodified='".Contenido_Security::escapeDB($date, $db)."' + WHERE idartlang='".Contenido_Security::toInteger($idartlang)."' AND idtype='".Contenido_Security::toInteger($idtype)."' AND typeid='".Contenido_Security::toInteger($typeid)."'"; + $db->query($sql); + } else { + + $sql = "INSERT INTO ".$cfg["tab"]["content"]." (idcontent, idartlang, idtype, typeid, value, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["content"]))."', + '".Contenido_Security::toInteger($idartlang)."', '".Contenido_Security::toInteger($idtype)."', '".Contenido_Security::toInteger($typeid)."', '".Contenido_Security::escapeDB($value, $db)."', + '".Contenido_Security::escapeDB($author, $db)."', '".Contenido_Security::escapeDB($date, $db)."', '".Contenido_Security::escapeDB($date, $db)."')"; + $db->query($sql); + } + + /* Touch the article to update last modified date */ + $lastmodified = date("Y-m-d H:i:s"); + + $sql = "UPDATE + ".$cfg["tab"]["art_lang"]." + SET + lastmodified = '".Contenido_Security::escapeDB($lastmodified, $db)."', + modifiedby = '".Contenido_Security::escapeDB($author, $db)."' + WHERE + idartlang='".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); +} + +/** + * generate index of article content + * + * added by stese + * removed from function conSaveContentEntry before + * Touch the article to update last modified date + * + * @see conSaveContentEntry + * @param integer $idart + */ +function conMakeArticleIndex ( $idartlang, $idart ) { + global $db, $auth, $cfg; + + # generate index of article content + $oIndex = new Index($db); + $aOptions = array("img", "link", "linktarget", "swf"); // cms types to be excluded from indexing + # indexing an article depends on the complete content with all content types, i.e it can not by differentiated by specific content types. + # Therefore one must fetch the complete content arrray. + + $aContent = conGetContentFromArticle($idartlang); + $oIndex->start($idart, $aContent, 'auto', $aOptions); +} + +/** + * Toggle the online status + * of an article + * + * @param int $idart Article Id + * @param ing $lang Language Id + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + */ +function conMakeOnline($idart, $lang) +{ + global $db, $cfg, $auth; + + $sql = "SELECT online FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + $db->next_record(); + + $set = ( $db->f("online") == 0 ) ? 1 : 0; + + if($set==1){ + $publisher_info ="published = '".date("Y-m-d H:i:s")."', publishedby='".$auth->auth["uname"]."',"; + }else{ + $publisher_info = ''; + } + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET ".$publisher_info." online = '".Contenido_Security::toInteger($set)."' WHERE idart = '".Contenido_Security::toInteger($idart)."' + AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); +} + +/** + * Toggle the lock status + * of an article + * + * @param int $idart Article Id + * @param ing $lang Language Id + * + */ +function conLock($idart, $lang) +{ + global $db, $cfg; + + $sql = "SELECT locked FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + $db->next_record(); + + $set = ( $db->f("locked") == 0 ) ? 1 : 0; + + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET locked = '".Contenido_Security::toInteger($set)."' WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); +} + +/** + * Toggle the online status of + * a category + * + * @param int $idcat id of the category + * @param int $lang id of the language + * @param int $status status of the category + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function conMakeCatOnline($idcat, $lang, $status) +{ + global $cfg, $db; + + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET visible = '".Contenido_Security::toInteger($status)."', + lastmodified = '".Contenido_Security::escapeDB(date("Y-m-d H:i:s"), $db)."' + WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + if ($cfg["pathresolve_heapcache"] == true && !$status = 0) + { + $pathresolve_tablename = $cfg["sql"]["sqlprefix"]."_pathresolve_cache"; + $sql = "DELETE FROM %s WHERE idlang = '%s' AND idcat = '%s'"; + $db->query(sprintf(Contenido_Security::escapeDB($sql, $db), $pathresolve_tablename, $lang, $idcat)); + } +} + +/** + * Toggle the public status of a category + * + * Almost the same function as strMakePublic in + * functions.str.php (conDeeperCategoriesArray instead of + * strDeeperCategoriesArray) + * + * @param int $idcat Article Id + * @param int $idcat Language Id + * @param bool $is_start Start status of the Article + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + */ +function conMakePublic($idcat, $lang, $public) +{ + global $db, $cfg; + $public = (int) $public; + if ($public != 1) { + $public = 0; + } + + $a_catstring = conDeeperCategoriesArray($idcat); + foreach ($a_catstring as $value) { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]. + " SET public='".Contenido_Security::toInteger($public)."', lastmodified = '".Contenido_Security::escapeDB(date("Y-m-d H:i:s"), $db). + "' WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."' "; + $db->query($sql); + } +} + +/** + * Delete an Article + * + * @param int $idart Article Id + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + */ +function conDeleteart($idart) +{ + global $db, $cfg, $lang, $_cecRegistry; + + /* Delete current language */ + $sql = "SELECT idartlang, idtplcfg FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + + $idartlang = $db->f("idartlang"); + $idtplcfg = $db->f("idtplcfg"); + + /* Fetch idcat */ + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + $db->next_record(); + + $idcat = $db->f("idcat"); + + /* Remove startidartlang */ + if (isStartArticle($idartlang, $idcat, $lang)) + { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET startidartlang='0' WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } + + $sql = "DELETE FROM ".$cfg["tab"]["content"]." WHERE idartlang = '".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang = '".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); + + if ($idtplcfg != "0") { + + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."'"; + $db->query($sql); + + } + + /* Check if there are remaining languages */ + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + if ($db->num_rows() > 0) + { + return; + } + + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + while ( $db->next_record() ) { + $idcatart[] = $db->f("idcatart"); + } + + if ( is_array($idcatart) ) { + + foreach ($idcatart AS $value) { + + //********* delete from code table ********** + $sql = "DELETE FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($value)."'"; + $db->query($sql); + + //****** delete from 'stat'-table ************ + $sql = "DELETE FROM ".$cfg["tab"]["stat"]." WHERE idcatart = '".Contenido_Security::toInteger($value)."'"; + $db->query($sql); + + } + } + + $sql = "SELECT * FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + + $db->query($sql); + + while ( $db->next_record() ) { + $idartlang[] = $db->f("idartlang"); + } + + if ( is_array($idartlang) ) { + + foreach ($idartlang AS $value) { + + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET startidartlang='0' WHERE startidartlang ='".Contenido_Security::toInteger($value)."'"; + $db->query($sql); + + //********* delete from content table ********** + $sql = "DELETE FROM ".$cfg["tab"]["content"]." WHERE idartlang = '".Contenido_Security::toInteger($value)."'"; + $db->query($sql); + } + } + + $sql = "DELETE FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + # Contenido Extension Chain + # @see docs/techref/plugins/Contenido Extension Chainer.pdf + # + # Usage: + # One could define the file contenido/includes/config.local.php + # with following code. + # + # global $_cecRegistry; + # cInclude("plugins", "extension/extension.php"); + # $_cecRegistry->addChainFunction("Contenido.Content.DeleteArticle", "AdditionalFunction1"); + # + # If function "AdditionalFunction1" is defined in file extension.php, it would be called via + # $chainEntry->execute($idart); + + $iterator = $_cecRegistry->getIterator("Contenido.Content.DeleteArticle"); + + while ($chainEntry = $iterator->next()) + { + $chainEntry->execute($idart); + } +} + +/** + * Extract a number from a string + * + * @param string $string String var by reference + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + */ +function extractNumber(&$string) +{ + $string = preg_replace("/[^0-9]/","",$string); +} + + + +/** + * Change the template of a category + * + * @param int $idcat Category Id + * @param int $idtpl Template Id + * + * @return void + * @author Jan Lengowski + * @copyright four for business AG + */ +function conChangeTemplateForCat($idcat, $idtpl) +{ + /* Global vars */ + global $db, $db2, $cfg, $lang; + + /* DELETE old entries */ + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + $old_idtplcfg = $db->f("idtplcfg"); + + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($old_idtplcfg)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($old_idtplcfg)."'"; + $db->query($sql); + + /* parameter $idtpl is 0, + reset the template */ + if ( 0 == $idtpl ) { + + /* get $idtplcfg */ + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + + $db->query($sql); + $db->next_record(); + + $idtplcfg = $db->f("idtplcfg"); + + /* DELETE 'template_conf' entry */ + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."'"; + $db->query($sql); + + /* DELETE 'container_conf entries' */ + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."'"; + $db->query($sql); + + /* UPDATE 'cat_lang' table */ + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET idtplcfg = '0' WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + } else { + + if ( !is_object($db2) ) $db2 = new DB_ConLite; + + /* check if a pre-configuration + is assigned */ + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["tpl"]." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + + $db->query($sql); + $db->next_record(); + + if ( 0 != $db->f("idtplcfg") ) { + + /* template is pre-configured, + create new configuration and + copy data from pre-cfg */ + + /* get new id */ + $new_idtplcfg = $db2->nextid($cfg["tab"]["tpl_conf"]); + + /* create new configuration */ + $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, idtpl) VALUES ('".Contenido_Security::toInteger($new_idtplcfg)."', '".Contenido_Security::toInteger($idtpl)."')"; + $db->query($sql); + + /* extract pre-configuration data */ + $sql = "SELECT * FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; + $db->query($sql); + + while ( $db->next_record() ) { + + /* get data */ + $nextid = $db2->nextid($cfg["tab"]["container_conf"]); + $number = $db->f("number"); + $container = $db->f("container"); + + /* write new entry */ + $sql = "INSERT INTO + ".$cfg["tab"]["container_conf"]." + (idcontainerc, idtplcfg, number, container) + VALUES + ('".Contenido_Security::toInteger($nextid)."', '".Contenido_Security::toInteger($new_idtplcfg)."', '".Contenido_Security::toInteger($number)."', '".Contenido_Security::escapeDB($container, $db2)."')"; + + $db2->query($sql); + + } + + /* extract old idtplcfg */ + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + $tmp_idtplcfg = $db->f("idtplcfg"); + + if ( $tmp_idtplcfg != 0 ) { + + /* DELETE 'template_conf' entry */ + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($tmp_idtplcfg)."'"; + $db->query($sql); + + /* DELETE 'container_conf entries' */ + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($tmp_idtplcfg)."'"; + $db->query($sql); + + } + + /* update 'cat_lang' table */ + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET idtplcfg = '".Contenido_Security::toInteger($new_idtplcfg)."' WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + } else { + + /* template is not pre-configured, + create a new configuration. */ + $new_idtplcfg = $db->nextid($cfg["tab"]["tpl_conf"]); + + $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." + (idtplcfg, idtpl) VALUES + ('".Contenido_Security::toInteger($new_idtplcfg)."', '".Contenido_Security::toInteger($idtpl)."')"; + + $db->query($sql); + + /* update 'cat_lang' table */ + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET idtplcfg = '".Contenido_Security::toInteger($new_idtplcfg)."' WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + } + + } + conGenerateCodeForAllartsInCategory($idcat); +} // end function + + +function conFetchCategoryTree ($client = false, $lang = false) +{ + global $db, $cfg; + + if ($client === false) + { + $client = $GLOBALS["client"]; + } + + if ($lang === false) + { + $lang = $GLOBALS["lang"]; + } + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B, + ".$cfg["tab"]["cat_lang"]." AS C + WHERE + A.idcat = B.idcat AND + B.idcat = C.idcat AND + C.idlang = '".Contenido_Security::toInteger($lang)."' AND + idclient = '".Contenido_Security::toInteger($client)."' + ORDER BY + idtree"; + + $catarray = array(); + + $db->query($sql); + + while ($db->next_record()) + { + $catarray[$db->f("idtree")] = array( + "idcat" => $db->f("idcat"), + "level" => $db->f("level"), + "idtplcfg" => $db->f("idtplcfg"), + "visible" => $db->f("visible"), + "name" => $db->f("name"), + "public" => $db->f("public"), + "urlname" => $db->f("urlname"), + "is_start" => $db->f("is_start") + ); + } + + return ($catarray); +} + +/** + * + * Fetch all deeper categories by a given id + * + * @param int $idcat Id of category + * @return array Array with all deeper categories + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + */ +function conDeeperCategoriesArray($idcat_start) +{ + global $db, $client, $cfg; + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B + WHERE + A.idcat = B.idcat AND + idclient = '".Contenido_Security::toInteger($client)."' + ORDER BY + idtree"; + + $db->query($sql); + + $found = false; + $curLevel = 0; + + while ( $db->next_record() ) { + + if ($found && $db->f("level") <= $curLevel) { // ending part of tree + $found = false; + } + + if ($db->f("idcat") == $idcat_start) { // starting part of tree + $found = true; + $curLevel = $db->f("level"); + } + + if ($found) { + $catstring[] = $db->f("idcat"); + } + } + + return $catstring; +} + +/** + * Recursive function to create an location string + * + * @param int $idcat ID of the starting category + * @param string $seperator Seperation string + * @param string $cat_str Category location string (by reference) + * @param boolean $makeLink create location string with links + * @param string $linkClass stylesheet class for the links + * @param integer first navigation level location string should be printed out (first level = 0!!) + * + * @return string location string + * + * @author Jan Lengowski + * @author Marco Jahn + * + * @copyright four for business AG + */ +function conCreateLocationString($idcat, $seperator, &$cat_str, $makeLink = false, $linkClass = "", $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false) +{ + global $cfg, $client, $cfgClient, $lang, $sess, $_locationStringCache; + + if ($idcat == 0) + { + $cat_str = "Lost and Found"; + return; + } + + if ($uselang == 0) + { + $uselang = $lang; + } + + if ($final == true && $usecache == true) + { + if (!is_array($_locationStringCache)) + { + if (file_exists($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt")) + { + $_locationStringCache = unserialize(file_get_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt")); + } else { + $_locationStringCache = array(); + } + } + + if (array_key_exists($idcat, $_locationStringCache)) + { + if ($_locationStringCache[$idcat]["expires"] > time()) + { + $cat_str = $_locationStringCache[$idcat]["name"]; + return; + } + } + } + + $db = new DB_ConLite; + + $sql = "SELECT + a.name AS name, + a.idcat AS idcat, + b.parentid AS parentid, + c.level as level + FROM + ".$cfg["tab"]["cat_lang"]." AS a, + ".$cfg["tab"]["cat"]." AS b, + ".$cfg["tab"]["cat_tree"]." AS c + WHERE + a.idlang = '".Contenido_Security::toInteger($uselang)."' AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idcat = '".Contenido_Security::toInteger($idcat)."' AND + a.idcat = b.idcat AND + c.idcat = b.idcat"; + + $db->query($sql); + $db->next_record(); + + if ($db->f("level") >= $firstTreeElementToUse) + { + + $name = $db->f("name"); + $parentid = $db->f("parentid"); + + //create link + if ($makeLink == true) + { + $linkUrl = $sess->url("front_content.php?idcat=$idcat"); + $name = ''.$name.''; + } + + $tmp_cat_str = $name . $seperator . $cat_str; + $cat_str = $tmp_cat_str; + + } + + if ( $parentid != 0 ) { + conCreateLocationString($parentid, $seperator, $cat_str, $makeLink, $linkClass, $firstTreeElementToUse ,$uselang, false); + + } else { + $sep_length = strlen($seperator); + $str_length = strlen($cat_str); + $tmp_length = $str_length - $sep_length; + $cat_str = substr($cat_str, 0, $tmp_length); + } + + if ($final == true && $usecache == true) + { + $_locationStringCache[$idcat]["name"] = $cat_str; + $_locationStringCache[$idcat]["expires"] = time() + 3600; + + if (is_writable($cfgClient[$client]["path"]["frontend"]."cache/")) + { + file_put_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt", serialize($_locationStringCache)); + } + } +} + +/** + * Set a start-article + * + * @param int $idcatart Idcatart of the article + * + * @return void + * + * @author Olaf Niemann + * Jan Lengowski + * + * @copyright four for business AG + */ +function conMakeStart($idcatart, $is_start) +{ + global $db, $cfg, $lang; + + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."'"; + + $db->query($sql); + $db->next_record(); + + $tmp_idcat = $db->f("idcat"); + + + $sql = "SELECT tblCatArt.idcatart ". + "FROM ".$cfg["tab"]["cat_art"]." tblCatArt, ". $cfg["tab"]["art_lang"]." tblArtLang ". + "WHERE tblCatArt.idart = tblArtLang.idart AND tblCatArt.is_start = '1' AND ". + "tblArtLang.idlang = '".Contenido_Security::toInteger($lang)."' AND tblCatArt.idcat = '".Contenido_Security::toInteger($tmp_idcat)."'"; + $db->query($sql); + + $aIDs = array(); + while ($db->next_record()) + { + $aIDs[] = Contenido_Security::toInteger($db->f("idcatart")); + } + + if (count($aIDs) > 0) + { + $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET is_start = 0 WHERE idcatart IN ('" . implode("','", $aIDs) . "')"; + $db->query($sql); + } + + $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET is_start='".Contenido_Security::toInteger($is_start)."' WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); + } else { + $sql = "SELECT idcat, idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); + $db->next_record(); + + $idart = $db->f("idart"); + $idcat = $db->f("idcat"); + + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + + $idartlang = $db->f("idartlang"); + + if ($is_start == 1) + { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET startidartlang='".Contenido_Security::toInteger($idartlang)."' WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } else { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET startidartlang='0' WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."' AND startidartlang='".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); + } + } + + if ( $is_start == 1 ) + { + // Deactivate time management if article is a start article + $sql = "SELECT idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."'"; + + $db->query($sql); + $db->next_record(); + + $idart = $db->f("idart"); + + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET timemgmt = 0 WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } +} + +/** + * Create code for one article in all categorys + * + * @param int $idart Article ID + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForArtInAllCategories($idart) +{ + global $lang, $client, $cfg; + $db = new DB_ConLite; + + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + + $db->query($sql); + + while ($db->next_record()) + { + conSetCodeFlag($db->f("idcatart")); + } +} + + +/** + * Generate code for all articles in a category + * + * @param int $idcat Category ID + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForAllArtsInCategory($idcat) +{ + global $cfg; + $db = new DB_ConLite; + + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + + while ($db->next_record()) + { + conSetCodeFlag($db->f("idcatart")); + } +} + +/** + * Generate code for the active client + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForClient() { + + global $client, $cfg; + $db = new DB_ConLite; + + $sql = "SELECT A.idcatart + FROM ".$cfg["tab"]["cat_art"]." as A, ".$cfg["tab"]["cat"]." as B + WHERE B.idclient=''".Contenido_Security::toInteger($client)."' AND B.idcat=A.idcat"; + $db->query($sql); + + while ($db->next_record()) + { + conSetCodeFlag($db->f("idcatart")); + } +} + +/** + * Create code for all arts using the + * same layout + * + * @param int $idlay Layout-ID + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForAllartsUsingLayout($idlay) +{ + global $cfg; + $db = new DB_ConLite; + + $sql = "SELECT idtpl FROM ".$cfg["tab"]["tpl"]." WHERE idlay='".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + while ($db->next_record()) + { + conGenerateCodeForAllartsUsingTemplate($db->f("idtpl")); + } +} + +/** + * Create code for all articles using + * the same module + * + * @param int $idmod Module id + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForAllartsUsingMod($idmod) +{ + global $cfg; + $db = new DB_ConLite; + + $sql = "SELECT idtpl FROM ".$cfg["tab"]["container"]." WHERE idmod = '".Contenido_Security::toInteger($idmod)."'"; + $db->query($sql); + + while($db->next_record()) + { + conGenerateCodeForAllArtsUsingTemplate($db->f("idtpl")); + } +} + + +/** + * Generate code for all articles + * using one template + * + * @param int $idtpl Template-Id + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForAllArtsUsingTemplate($idtpl) +{ + global $cfg, $lang, $client; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + /* Search all categories */ + $sql = "SELECT + b.idcat + FROM + ".$cfg["tab"]["tpl_conf"]." AS a, + ".$cfg["tab"]["cat_lang"]." AS b, + ".$cfg["tab"]["cat"]." AS c + WHERE + a.idtpl = '".Contenido_Security::toInteger($idtpl)."' AND + b.idtplcfg = a.idtplcfg AND + c.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idcat = c.idcat"; + + $db->query($sql); + + while ($db->next_record()) + { + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($db->f("idcat"))."'"; + $db2->query($sql); + + while ($db2->next_record()) + { + conSetCodeFlag($db2->f("idcatart")); + } + } + + /* Search all articles */ + $sql = "SELECT + b.idart + FROM + ".$cfg["tab"]["tpl_conf"]." AS a, + ".$cfg["tab"]["art_lang"]." AS b, + ".$cfg["tab"]["art"]." AS c + WHERE + a.idtpl = '".Contenido_Security::toInteger($idtpl)."' AND + b.idtplcfg = a.idtplcfg AND + c.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idart = c.idart"; + + $db->query($sql); + + while ($db->next_record()) + { + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".Contenido_Security::toInteger($db->f("idart"))."'"; + $db2->query($sql); + + while ($db2->next_record()) + { + conSetCodeFlag($db2->f("idcatart")); + } + } +} + + +/** + * Create code for all articles + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conGenerateCodeForAllArts() +{ + global $cfg; + $db = new DB_ConLite; + + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]; + $db->query($sql); + + while ($db->next_record()) + { + conSetCodeFlag($db->f("idcatart")); + } +} + +/** + * Set code creation flag to true + * + * @param int $idcatart Contenido Category-Article-ID + * + * @author Jan Lengowski + * @copyright four for business AG 2003 + */ +function conSetCodeFlag($idcatart) +{ + global $cfg; + $db = new DB_ConLite; + + $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET createcode = '1' WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); + + /* Setting the createcode flag is not enough due to a bug in the + * database structure. Remove all con_code entries for a specific + * idcatart in the con_code table. + */ + + $sql = "DELETE FROM ".$cfg["tab"]["code"] ." WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); +} + + +/** + * Set articles on/offline for the time management function + * + * @param none + * + * @author Timo A. Hummel + * @copyright four for business AG 2003 + */ +function conFlagOnOffline() { + global $cfg; + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + /* Set all articles which are before our starttime to offline */ + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() < datestart AND datestart != '0000-00-00 00:00:00' AND datestart IS NOT NULL AND timemgmt = 1"; + + $db->query($sql); + + while ($db->next_record()) { + $sql = "UPDATE ".$cfg["tab"]["art_lang"] ." SET online = 0 WHERE idartlang = '".Contenido_Security::toInteger($db->f("idartlang"))."'"; + $db2->query($sql); + } + + /* Set all articles which are in between of our start/endtime to online */ + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > datestart AND (NOW() < dateend OR dateend = '0000-00-00 00:00:00') AND " . + "online = 0 AND timemgmt = 1"; + + $db->query($sql); + + while ($db->next_record()) { + // modified 2007-11-14: Set publish date if article goes online + $sql = "UPDATE " . $cfg["tab"]["art_lang"] . " SET online = 1, published = datestart " . + "WHERE idartlang = " . Contenido_Security::toInteger($db->f("idartlang")); + $db2->query($sql); + } + + /* Set all articles after our endtime to offline */ + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > dateend AND dateend != '0000-00-00 00:00:00' AND timemgmt = 1"; + + $db->query($sql); + + while ($db->next_record()) + { + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET online = 0 WHERE idartlang = '" . Contenido_Security::toInteger($db->f("idartlang")) . "'"; + $db2->query($sql); + } + +} +/** + * Move articles for the time management function + * @param none + * + * @author Timo A. Hummel + * @copyright four for business AG 2003 + */ +function conMoveArticles() +{ + global $cfg; + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + /* Perform after-end updates */ + $sql = "SELECT idartlang, idart, time_move_cat, time_target_cat, time_online_move FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > dateend AND dateend != '0000-00-00 00:00:00' AND timemgmt = 1"; + + $db->query($sql); + + while ($db->next_record()) + { + if ($db->f("time_move_cat") == "1") + { + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET timemgmt = 0, online = 0 WHERE idartlang = '".Contenido_Security::toInteger($db->f("idartlang"))."'"; + $db2->query($sql); + + $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET idcat = '" . Contenido_Security::toInteger($db->f("time_target_cat")) . "', createcode = '1' WHERE idart = '" . Contenido_Security::toInteger($db->f("idart")) . "'"; + $db2->query($sql); + + if ($db->f("time_online_move") == "1") + { + $sql = "UPDATE ".$cfg["tab"]["art_lang"] ." SET online = 1 WHERE idart = '".Contenido_Security::toInteger($db->f("idart"))."'"; + } else { + $sql = "UPDATE ".$cfg["tab"]["art_lang"] ." SET online = 0 WHERE idart = '".Contenido_Security::toInteger($db->f("idart"))."'"; + } + $db2->query($sql); + + // execute CEC hook + CEC_Hook::execute('Contenido.Article.conMoveArticles_Loop', $db->Record); + } + } + +} + + +function conCopyTemplateConfiguration ($srcidtplcfg) +{ + global $cfg; + + $sql = "SELECT idtpl FROM ".$cfg["tab"]["tpl_conf"] ." WHERE idtplcfg = '".Contenido_Security::toInteger($srcidtplcfg)."'"; + $db = new DB_ConLite; + $db->query($sql); + + if (!$db->next_record()) + { + return false; + } + + $idtpl = $db->f("idtpl"); + + $nextidtplcfg = $db->nextid($cfg["tab"]["tpl_conf"]); + $created = date("Y-m-d H:i:s"); + + $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"] . " (idtplcfg, idtpl, created) VALUES ('".Contenido_Security::toInteger($nextidtplcfg)."', '".Contenido_Security::toInteger($idtpl)."', '".Contenido_Security::escapeDB($created, $db)."')"; + $db->query($sql); + + return $nextidtplcfg; +} + +function conCopyContainerConf ($srcidtplcfg, $dstidtplcfg) +{ + global $cfg; + + $db = new DB_ConLite; + $sql = "SELECT number, container FROM ".$cfg["tab"]["container_conf"] . " WHERE idtplcfg = '".Contenido_Security::toInteger($srcidtplcfg)."'"; + + $db->query($sql); + + while ($db->next_record()) + { + $val[$db->f("number")] = $db->f("container"); + } + + if (!is_array($val)) + { + return false; + } + + foreach ($val as $key => $value) + { + $nextidcontainerc = $db->nextid($cfg["tab"]["container_conf"]); + + $sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." (idcontainerc, idtplcfg, number, container) VALUES ('".Contenido_Security::toInteger($nextidcontainerc)."', '".Contenido_Security::toInteger($dstidtplcfg)."', + '".Contenido_Security::toInteger($key)."', '".Contenido_Security::escapeDB($value, $db)."')"; + $db->query($sql); + } + + return true; + +} + +function conCopyContent ($srcidartlang, $dstidartlang) +{ + global $cfg; + + $db = new DB_ConLite; + + $sql = "SELECT idtype, typeid, value, version, author FROM ".$cfg["tab"]["content"]." WHERE idartlang = '".Contenido_Security::toInteger($srcidartlang)."'"; + + $db->query($sql); + + $id = 0; + + while ($db->next_record()) + { + $id++; + $val[$id]["idtype"] = $db->f("idtype"); + $val[$id]["typeid"] = $db->f("typeid"); + $val[$id]["value"] = $db->f("value"); + $val[$id]["version"] = $db->f("version"); + $val[$id]["author"] = $db->f("author"); + } + + if (!is_array($val)) + { + return false; + } + + foreach ($val as $key => $value) + { + $nextid = $db->nextid($cfg["tab"]["content"]); + $idtype = $value["idtype"]; + $typeid = $value["typeid"]; + $lvalue = $value["value"]; + $version = $value["version"]; + $author = $value["author"]; + $created = date("Y-m-d H:i:s"); + + $sql = "INSERT INTO ".$cfg["tab"]["content"] + ." (idcontent, idartlang, idtype, typeid, value, version, author, created) ". + "VALUES ('".Contenido_Security::toInteger($nextid)."', '".Contenido_Security::toInteger($dstidartlang)."', '".Contenido_Security::toInteger($idtype)."', '".Contenido_Security::toInteger($typeid)."', + '".Contenido_Security::escapeDB($lvalue, $db)."', '".Contenido_Security::escapeDB($version, $db)."', '".Contenido_Security::escapeDB($author, $db)."', '".Contenido_Security::escapeDB($created, $db)."')"; + + $db->query($sql); + + } +} + +function conCopyArtLang ($srcidart, $dstidart, $newtitle, $bUseCopyLabel = true) +{ + global $cfg, $lang; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + $sql = "SELECT idartlang, idlang, idtplcfg, title, pagetitle, summary, + author, online, redirect, redirect, redirect_url, + artsort, timemgmt, datestart, dateend, status, free_use_01, + free_use_02, free_use_03, time_move_cat, time_target_cat, + time_online_move, external_redirect, locked FROM + ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($srcidart)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + while ($db->next_record()) + { + + $nextid = $db2->nextid($cfg["tab"]["art_lang"]); + /* Copy the template configuration */ + if ($db->f("idtplcfg") != 0) + { + $newidtplcfg = conCopyTemplateConfiguration($db->f("idtplcfg")); + conCopyContainerConf($db->f("idtplcfg"), $newidtplcfg); + } + + conCopyContent($db->f("idartlang"), $nextid); + + $idartlang = $nextid; + $idart = $dstidart; + $idlang = $db->f("idlang"); + $idtplcfg = $newidtplcfg; + + if ($newtitle != "") + { + $title = sprintf($newtitle, addslashes($db->f("title"))); + } else { + if ($bUseCopyLabel == true) { + $title = sprintf(i18n("%s (Copy)"), addslashes($db->f("title"))); + } else { + $title = addslashes($db->f("title")); + } + } + $pagetitle = addslashes($db->f("pagetitle")); + $summary = addslashes($db->f("summary")); + $created = date("Y-m-d H:i:s"); + $author = $db->f("author"); + $online = 0; + $redirect = $db->f("redirect"); + $redirecturl = $db->f("redirect_url"); + $artsort = $db->f("artsort"); + $timemgmt = $db->f("timemgmt"); + $datestart = $db->f("datestart"); + $dateend = $db->f("dateend"); + $status = $db->f("status"); + $freeuse01 = $db->f("free_use_01"); + $freeuse02 = $db->f("free_use_02"); + $freeuse03 = $db->f("free_use_03"); + $timemovecat = $db->f("time_move_cat"); + $timetargetcat = $db->f("time_target_cat"); + $timeonlinemove = $db->f("time_online_move"); + $externalredirect = $db->f("external_redirect"); + $locked = $db->f("locked"); + + $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." + (idartlang, idart, idlang, idtplcfg, title, + pagetitle, summary, created, lastmodified, + author, online, redirect, redirect_url, + artsort, timemgmt, datestart, dateend, + status, free_use_01, free_use_02, free_use_03, + time_move_cat, time_target_cat, time_online_move, + external_redirect, locked) VALUES ('".Contenido_Security::toInteger($idartlang)."', + '".Contenido_Security::toInteger($idart)."', + '".Contenido_Security::toInteger($idlang)."', + '".Contenido_Security::toInteger($idtplcfg)."', + '".Contenido_Security::escapeDB($title, $db2)."', + '".Contenido_Security::escapeDB($pagetitle, $db2)."', + '".Contenido_Security::escapeDB($summary, $db2)."', + '".Contenido_Security::escapeDB($created, $db2)."', + '".Contenido_Security::escapeDB($created, $d2b)."', + '".Contenido_Security::escapeDB($author, $db2)."', + '".Contenido_Security::toInteger($online)."', + '".Contenido_Security::escapeDB($redirect, $db2)."', + '".Contenido_Security::escapeDB($redirecturl, $db2)."', + '".Contenido_Security::toInteger($artsort)."', + '".Contenido_Security::toInteger($timemgmt)."', + '".Contenido_Security::escapeDB($datestart, $db2)."', + '".Contenido_Security::escapeDB($dateend, $db2)."', + '".Contenido_Security::toInteger($status)."', + '".Contenido_Security::toInteger($freeuse01)."', + '".Contenido_Security::toInteger($freeuse02)."', + '".Contenido_Security::toInteger($freeuse03)."', + '".Contenido_Security::toInteger($timemovecat)."', + '".Contenido_Security::toInteger($timetargetcat)."', + '".Contenido_Security::toInteger($timeonlinemove)."', + '".Contenido_Security::escapeDB($externalredirect, $db)."', + '".Contenido_Security::toInteger($locked)."')"; + + $db2->query($sql); + + // execute CEC hook + CEC_Hook::execute('Contenido.Article.conCopyArtLang_AfterInsert', array( + 'idartlang' => Contenido_Security::toInteger($idartlang), + 'idart' => Contenido_Security::toInteger($idart), + 'idlang' => Contenido_Security::toInteger($idlang), + 'idtplcfg' => Contenido_Security::toInteger($idtplcfg), + 'title' => Contenido_Security::escapeDB($title, $db2) + )); + + /* Copy meta tags */ + $sql = "SELECT idmetatype, metavalue FROM ".$cfg["tab"]["meta_tag"]." WHERE idartlang = '".Contenido_Security::toInteger($db->f("idartlang"))."'"; + $db->query($sql); + + while ($db->next_record()) + { + $nextidmetatag = $db2->nextid($cfg["tab"]["meta_tag"]); + $metatype = $db->f("idmetatype"); + $metavalue = $db->f("metavalue"); + $sql = "INSERT INTO ".$cfg["tab"]["meta_tag"]." + (idmetatag, idartlang, idmetatype, metavalue) + VALUES + ('".Contenido_Security::toInteger($nextidmetatag)."', '".Contenido_Security::toInteger($idartlang)."', '".Contenido_Security::toInteger($metatype)."', '".Contenido_Security::escapeDB($metavalue, $db2)."')"; + $db2->query($sql); + } + + /* Update keyword list for new article */ + conMakeArticleIndex ($idartlang, $idart); + } +} + +function conCopyArticle ($srcidart, $targetcat = 0, $newtitle = "", $bUseCopyLabel = true) +{ + global $cfg, $_cecRegistry; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + $sql = "SELECT idclient FROM ".$cfg["tab"]["art"] ." WHERE idart = '".Contenido_Security::toInteger($srcidart)."'"; + + $db->query($sql); + + if (!$db->next_record()) + { + return false; + } + + $idclient = $db->f("idclient"); + $dstidart = $db->nextid($cfg["tab"]["art"]); + + $sql = "INSERT INTO ".$cfg["tab"]["art"]." (idart, idclient) VALUES ('".Contenido_Security::toInteger($dstidart)."', '".Contenido_Security::toInteger($idclient)."')"; + $db->query($sql); + + conCopyArtLang($srcidart, $dstidart, $newtitle, $bUseCopyLabel); + + // Update category relationship + $sql = "SELECT idcat, status FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($srcidart)."'"; + $db->query($sql); + + while ($db->next_record()) + { + $nextid = $db2->nextid($cfg["tab"]["cat_art"]); + + // These are the insert values + $aFields = Array("idcatart" => Contenido_Security::toInteger($nextid), + "idcat" => ($targetcat != 0) ? Contenido_Security::toInteger($targetcat) : Contenido_Security::toInteger($db->f("idcat")), + "idart" => Contenido_Security::toInteger($dstidart), + "is_start" => 0, + "status" => ($db->f("status") != '') ? Contenido_Security::toInteger($db->f("status")) : 0, + "createcode" => 1); + + $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." (".implode(", ", array_keys($aFields)).") VALUES (".implode(", ", array_values($aFields)).");"; + $db2->query($sql); + + if ($targetcat != 0) { // If true, exit while routine, only one category entry is needed + break; + } + } + + # Contenido Extension Chain + # @see docs/techref/plugins/Contenido Extension Chainer.pdf + # + # Usage: + # One could define the file contenido/includes/config.local.php + # with following code. + # + # global $_cecRegistry; + # cInclude("plugins", "extension/extenison.php"); + # $_cecRegistry->addChainFunction("Contenido.Content.CopyArticle", "AdditionalFunction1"); + # + # If function "AdditionalFunction1" is defined in file extension.php, it would be called via + # $chainEntry->execute($srcidart, $dstidart); + + $iterator = $_cecRegistry->getIterator("Contenido.Content.CopyArticle"); + + while ($chainEntry = $iterator->next()) + { + $chainEntry->execute($srcidart, $dstidart); + } + + return $dstidart; + +} + +function conGetTopmostCat($idcat, $minLevel = 0) +{ + global $cfg, $client, $lang; + + $db = new DB_ConLite; + + $sql = "SELECT + a.name AS name, + a.idcat AS idcat, + b.parentid AS parentid, + c.level AS level + FROM + ".$cfg["tab"]["cat_lang"]." AS a, + ".$cfg["tab"]["cat"]." AS b, + ".$cfg["tab"]["cat_tree"]." AS c + WHERE + a.idlang = '".Contenido_Security::toInteger($lang)."' AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idcat = '".Contenido_Security::toInteger($idcat)."' AND + c.idcat = b.idcat AND + a.idcat = b.idcat"; + + $db->query($sql); + $db->next_record(); + + $name = $db->f("name"); + $parentid = $db->f("parentid"); + $thislevel = $db->f("level"); + + if ( $parentid != 0 && $thislevel >= $minLevel) { + return conGetTopmostCat($parentid, $minLevel); + } else { + return $idcat; + } +} + + +function conSyncArticle ($idart, $srclang, $dstlang) +{ + global $cfg; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + #Check if article has already been synced to target language + $sql = "SELECT * FROM ".$cfg['tab']['art_lang']." WHERE (idart = ".Contenido_Security::toInteger($idart).") AND (idlang= ".Contenido_Security::toInteger($dstlang).")"; + $db2->query($sql); + + $sql = "SELECT idartlang, idart, idlang, idtplcfg, title, urlname, pagetitle, + summary, created, lastmodified, redirect, redirect_url, + artsort, status, external_redirect + FROM + ".$cfg["tab"]["art_lang"]." + WHERE + idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($srclang)."'"; + $db->query($sql); + + if ($db->next_record() && ($db2->num_rows() == 0) ) { + $newidartlang = $db2->nextid($cfg["tab"]["art_lang"]); + + if ($db->f("idtplcfg") != 0) + { + $newidtplcfg = tplcfgDuplicate($db->f("idtplcfg")); + } else { + $newidtplcfg = 0; + } + + + $idartlang = $db->f("idartlang"); + $idart = $db->f("idart"); + $idlang = $db->f("idlang"); + $title = addslashes($db->f("title")); + $urlname = addslashes($db->f("urlname")); + $pagetitle = addslashes($db->f("pagetitle")); + $summary = addslashes($db->f("summary")); + $created = $db->f("created"); + $lastmodified = $db->f("lastmodified"); + $redirect = $db->f("redirect"); + $redirect_url = $db->f("redirect_url"); + $artsort = $db->f("artsort"); + $status = $db->f("status"); + $external_redirect = $db->f("external_redirect"); + + $sql = "INSERT INTO + ".$cfg["tab"]["art_lang"]." + (idartlang, idart, idlang, idtplcfg, title,urlname, + pagetitle, summary, created, lastmodified, + author, modifiedby, online, redirect, redirect_url, + artsort, status, external_redirect) + VALUES + ('".Contenido_Security::toInteger($newidartlang)."', '".Contenido_Security::toInteger($idart)."', + '".Contenido_Security::toInteger($dstlang)."', '".Contenido_Security::toInteger($newidtplcfg)."', + '".Contenido_Security::escapeDB($title, $db2)."', + '".Contenido_Security::escapeDB($urlname, $db2)."', + '".Contenido_Security::escapeDB($pagetitle, $db2)."', + '".Contenido_Security::escapeDB($summary, $db2)."', + '".Contenido_Security::escapeDB($created, $db2)."', + '".Contenido_Security::escapeDB($lastmodified, $db2)."', + '".Contenido_Security::escapeDB($author, $db2)."', + '".Contenido_Security::escapeDB($modifiedby, $db2)."', + '".Contenido_Security::toInteger($online)."', + '".Contenido_Security::escapeDB($redirect, $db2)."', + '".Contenido_Security::escapeDB($redirect_url, $db2)."', + '".Contenido_Security::toInteger($artsort)."', + '".Contenido_Security::toInteger($status)."', + '".Contenido_Security::escapeDB($external_redirect, $db2)."')"; + $db2->query($sql); + + // execute CEC hook + $param['src_art_lang'] = $db->Record; + $param['dest_art_lang'] = $db2->Record; + $param['dest_art_lang']['idartlang'] = Contenido_Security::toInteger($newidartlang); + $param['dest_art_lang']['idlang'] = Contenido_Security::toInteger($dstlang); + $param['dest_art_lang']['idtplcfg'] = Contenido_Security::toInteger($newidtplcfg); + CEC_Hook::execute('Contenido.Article.conSyncArticle_AfterInsert', $param); + + /* Copy content */ + $sql = "SELECT + idtype, typeid, value, version, author, + created, lastmodified + FROM + ".$cfg["tab"]["content"]." + WHERE + idartlang = '".Contenido_Security::toInteger($idartlang)."'"; + + $db->query($sql); + + while ($db->next_record()) + { + $newidcontent = $db2->nextid($cfg["tab"]["content"]); + $idtype = $db->f("idtype"); + $typeid = $db->f("typeid"); + $value = $db->f("value"); + $version = $db->f("version"); + $author = $db->f("author"); + $created = $db->f("created"); + $lastmodified = $db->f("lastmodified"); + + $sql = "INSERT INTO + ".$cfg["tab"]["content"]." + (idcontent, idartlang, idtype, typeid, + value, version, author, created, lastmodified) + VALUES + ('".Contenido_Security::toInteger($newidcontent)."', '".Contenido_Security::toInteger($newidartlang)."', + '".Contenido_Security::toInteger($idtype)."', '".Contenido_Security::toInteger($typeid)."', + '".Contenido_Security::escapeDB($value, $db2)."', + '".Contenido_Security::escapeDB($version, $db2)."', + '".Contenido_Security::escapeDB($author, $db2)."', + '".Contenido_Security::escapeDB($created, $db2)."', + '".Contenido_Security::escapeDB($lastmodified, $db2)."')"; + + $db2->query($sql); + } + + /* Copy meta tags */ + $sql = "SELECT idmetatype, metavalue FROM ".$cfg["tab"]["meta_tag"]." WHERE idartlang = '$idartlang'"; + $db->query($sql); + + while ($db->next_record()) + { + $nextidmetatag = $db2->nextid($cfg["tab"]["meta_tag"]); + $metatype = $db->f("idmetatype"); + $metavalue = $db->f("metavalue"); + $sql = "INSERT INTO ".$cfg["tab"]["meta_tag"]." + (idmetatag, idartlang, idmetatype, metavalue) + VALUES + ('".Contenido_Security::toInteger($nextidmetatag)."', '".Contenido_Security::toInteger($newidartlang)."', '".Contenido_Security::toInteger($metatype)."', '".Contenido_Security::escapeDB($metavalue, $db2)."')"; + $db2->query($sql); + } + + + } +} + +function isStartArticle ($idartlang, $idcat, $idlang, $db = null) +{ + global $cfg; + + if (!is_object($db)) { + $db = new DB_ConLite; + } + + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang='".Contenido_Security::toInteger($idartlang)."'"; + $db->query($sql); + + if (!$db->next_record()) + { + return false; + } else { + $idart = $db->f("idart"); + $sql = "SELECT is_start FROM ".$cfg["tab"]["cat_art"]." WHERE is_start = '1' AND idcat='".Contenido_Security::toInteger($idcat)."' AND idart='".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + if ($db->next_record()) + { + return true; + } else { + return false; + } + } + } else { + $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." + WHERE startidartlang='".Contenido_Security::toInteger($idartlang)."' AND idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + + $db->query($sql); + + if ($db->next_record()) + { + return true; + } else { + return false; + } + } +} + +/** + * Returns all categories in which the given article is in. + * + * @param idart int Article ID + * @param db object Optional; if specified, uses the given db object + * @return array Flat array which contains all category id's + */ +function conGetCategoryAssignments ($idart, $db = false) +{ + global $cfg; + + if ($db === false) + { + $db = new DB_ConLite; + } + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."'"; + $db->query($sql); + + $categories = array(); + + while ($db->next_record()) + { + $categories[] = $db->f("idcat"); + } + + return ($categories); +} +?> diff --git a/conlite/includes/functions.con2.php b/conlite/includes/functions.con2.php new file mode 100644 index 0000000..4383190 --- /dev/null +++ b/conlite/includes/functions.con2.php @@ -0,0 +1,772 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: functions.con2.php 367 2015-10-19 10:08:51Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Generates the code for one + * article + * + * @param int $idcat Id of category + * @param int $idart Id of article + * @param int $lang Id of language + * @param int $client Id of client + * @param int $layout Layout-ID of alternate Layout (if false, use associated layout) + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function conGenerateCode($idcat, $idart, $lang, $client, $layout = false) +{ + global $frontend_debug, $_cecRegistry; + + $debug = 0; + + if ($debug) + echo "conGenerateCode($idcat, $idart, $lang, $client, $layout);
"; + + global $db, $db2, $sess, $cfg, $code, $cfgClient, $client, $lang, $encoding; + + if (!is_object($db2)) + $db2 = new DB_ConLite; + + /* extract IDCATART */ + $sql = "SELECT + idcatart + FROM + ".$cfg["tab"]["cat_art"]." + WHERE + idcat = '".Contenido_Security::toInteger($idcat)."' AND + idart = '".Contenido_Security::toInteger($idart)."'"; + + $db->query($sql); + $db->next_record(); + + $idcatart = $db->f("idcatart"); + + /* If neither the + article or the category is + configured, no code will be + created and an error occurs. */ + $sql = "SELECT + a.idtplcfg AS idtplcfg + FROM + ".$cfg["tab"]["art_lang"]." AS a, + ".$cfg["tab"]["art"]." AS b + WHERE + a.idart = '".Contenido_Security::toInteger($idart)."' AND + a.idlang = '".Contenido_Security::escapeDB($lang, $db)."' AND + b.idart = a.idart AND + b.idclient = '".Contenido_Security::escapeDB($client, $db)."'"; + + $db->query($sql); + $db->next_record(); + + if ($db->f("idtplcfg") != 0) + { + + /* Article is configured */ + $idtplcfg = $db->f("idtplcfg"); + + if ($debug) + echo "configuration for article found: $idtplcfg

"; + + $a_c = array (); + + $sql2 = "SELECT + * + FROM + ".$cfg["tab"]["container_conf"]." + WHERE + idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' + ORDER BY + number ASC"; + + $db2->query($sql2); + + while ($db2->next_record()) + { + $a_c[$db2->f("number")] = $db2->f("container"); + + } + + } else + { + + /* Check whether category is + configured. */ + $sql = "SELECT + a.idtplcfg AS idtplcfg + FROM + ".$cfg["tab"]["cat_lang"]." AS a, + ".$cfg["tab"]["cat"]." AS b + WHERE + a.idcat = '".Contenido_Security::toInteger($idcat)."' AND + a.idlang = '".Contenido_Security::escapeDB($lang, $db)."' AND + b.idcat = a.idcat AND + b.idclient = '".Contenido_Security::escapeDB($client, $db)."'"; + + $db->query($sql); + $db->next_record(); + + if ($db->f("idtplcfg") != 0) + { + + /* Category is configured, + extract varstring */ + $idtplcfg = $db->f("idtplcfg"); + + if ($debug) + echo "configuration for category found: $idtplcfg

"; + + $a_c = array (); + + $sql2 = "SELECT + * + FROM + ".$cfg["tab"]["container_conf"]." + WHERE + idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' + ORDER BY + number ASC"; + + $db2->query($sql2); + + while ($db2->next_record()) + { + $a_c[$db2->f("number")] = $db2->f("container"); + + } + + } else + { + + /* Article nor Category + is configured. Creation of + Code is not possible. Write + Errormsg to DB. */ + + if ($debug) + echo "Neither CAT or ART are configured!

"; + + $code = 'No code was created for this art in this category.'; + + $sql = "SELECT * FROM ".$cfg["tab"]["code"]." WHERE idcatart='".Contenido_Security::toInteger($idcatart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; + + $db->query($sql); + + if ($db->next_record()) + { + $sql = "UPDATE ".$cfg["tab"]["code"]." SET code='".Contenido_Security::escapeDB($code, $db)."', idlang='".Contenido_Security::escapeDB($lang, $db)."', idclient='".Contenido_Security::escapeDB($client, $db)."' + WHERE idcatart='".Contenido_Security::toInteger($idcatart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; + $db->query($sql); + } else + { + $sql = "INSERT INTO ".$cfg["tab"]["code"]." (idcode, idcatart, code, idlang, idclient) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["code"]))."', '".Contenido_Security::toInteger($idcatart)."', + '".Contenido_Security::escapeDB($code, $db)."', '".Contenido_Security::escapeDB($lang, $db)."', '".Contenido_Security::escapeDB($client, $db)."')"; + $db->query($sql); + } + + return "0601"; + + } + + } + + /* Get IDLAY and IDMOD array */ + $sql = "SELECT + a.idlay AS idlay, + a.idtpl AS idtpl + FROM + ".$cfg["tab"]["tpl"]." AS a, + ".$cfg["tab"]["tpl_conf"]." AS b + WHERE + b.idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' AND + b.idtpl = a.idtpl"; + + $db->query($sql); + $db->next_record(); + + $idlay = $db->f("idlay"); + + if ($layout != false) + { + $idlay = $layout; + } + + $idtpl = $db->f("idtpl"); + + if ($debug) + echo "Using Layout: $idlay and Template: $idtpl for generation of code.

"; + + /* List of used modules */ + $sql = "SELECT + number, + idmod + FROM + ".$cfg["tab"]["container"]." + WHERE + idtpl = '".Contenido_Security::toInteger($idtpl)."' + ORDER BY + number ASC"; + + $db->query($sql); + + while ($db->next_record()) + { + $a_d[$db->f("number")] = $db->f("idmod"); + } + + $oLayout = new cApiLayout(Contenido_Security::toInteger($idlay)); + $raw_code = $oLayout->getLayout(); + $code = AddSlashes($raw_code); + + /* Create code for all containers */ + if ($idlay) + { + tplPreparseLayout($idlay, $raw_code); + $tmp_returnstring = tplBrowseLayoutForContainers($idlay, $raw_code); + $a_container = explode("&", $tmp_returnstring); + + foreach ($a_container as $key => $value) + { + + $sql = "SELECT * FROM ".$cfg["tab"]["mod"]." WHERE idmod='".$a_d[$value]."'"; + + $db->query($sql); + $db->next_record(); + + if (is_numeric($a_d[$value])) + { + $thisModule = ''; + $thisContainer = ''; + } + /* dceModFileEdit (c)2009 www.dceonline.de */ + if($cfg['dceModEdit']['use'] + && ($cfg['dceModEdit']['allModsFromFile'] == true + || in_array((int) $a_d[$value], $cfg['dceModEdit']['modsFromFile']))) { + cInclude('classes', 'contenido/class.module.php'); + $tmpModule = new cApiModule; + $tmpModule->loadByPrimaryKey($a_d[$value]); + $output = $thisModule.$thisContainer.$tmpModule->get("output"); + unset($tmpModule); + } else { + $output = $thisModule.$thisContainer.$db->f("output"); + } + /* dceModFileEdit (c)2009 www.dceonline.de */ + $output = AddSlashes($output)."\n"; + + $template = $db->f("template"); + + $a_c[$value] = preg_replace("/(&\$)/", "", $a_c[$value]); + + $tmp1 = preg_split("/&/", $a_c[$value]); + + $varstring = array (); + + foreach ($tmp1 as $key1 => $value1) + { + + $tmp2 = explode("=", $value1); + foreach ($tmp2 as $key2 => $value2) + { + $varstring["$tmp2[0]"] = $tmp2[1]; + } + } + + $CiCMS_Var = '$C'.$value.'CMS_VALUE'; + $CiCMS_VALUE = ''; + + foreach ($varstring as $key3 => $value3) + { + $tmp = urldecode($value3); + $tmp = str_replace("\'", "'", $tmp); + $CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; '; + $output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output); + $output = str_replace("CMS_VALUE[$key3]", $tmp, $output); + } + + $output = str_replace("CMS_VALUE", $CiCMS_Var, $output); + $output = str_replace("\$".$CiCMS_Var, $CiCMS_Var, $output); + + $output = preg_replace("/(CMS_VALUE\[)([0-9]*)(\])/i", "", $output); + + if ($frontend_debug["container_display"] == true) + { + $fedebug .= "Container: CMS_CONTAINER[$value]".'\\\\n'; + } + if ($frontend_debug["module_display"] == true) + { + $fedebug .= "Modul: ".$db->f("name").'\\\\n'; + } + if ($frontend_debug["module_timing_summary"] == true || $frontend_debug["module_timing"] == true) + { + $fedebug .= 'Eval-Time: $modtime'.$value.'\\\\n'; + $output = ''.$output.''; + } + + if ($fedebug != "") + { + $output = addslashes('\'; ?'.'>'."
").$output; + $output = $output.addslashes('function showmod'.$value.' () { window.alert(\\\'\'. "'.addslashes($fedebug).'".\'\\\');} \'; ?'.'>'); + } + + if ($frontend_debug["module_timing_summary"] == true) + { + $output .= addslashes(' '); + $output .= addslashes(' f("name")).'"; ?>'); + } + /* Replace new containers */ + $code = preg_replace("/(.*)<\/container>/Uis", "CMS_CONTAINER[$value]", $code); + + $code = preg_replace("//i", "CMS_CONTAINER[$value]", $code); + + $code = str_ireplace("CMS_CONTAINER[$value]", "\r\n".$output, $code); + + $fedebug = ""; + + } + } + + /* Find out what kind of CMS_... Vars are in use */ + $sql = "SELECT + * + FROM + ".$cfg["tab"]["content"]." AS A, + ".$cfg["tab"]["art_lang"]." AS B, + ".$cfg["tab"]["type"]." AS C + WHERE + A.idtype = C.idtype AND + A.idartlang = B.idartlang AND + B.idart = '".Contenido_Security::toInteger($idart)."' AND + B.idlang = '".Contenido_Security::escapeDB($lang, $db)."'"; + + $db->query($sql); + + while ($db->next_record()) + { + $a_content[$db->f("type")][$db->f("typeid")] = $db->f("value"); + } + + $sql = "SELECT idartlang, pagetitle FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; + + $db->query($sql); + $db->next_record(); + + $idartlang = $db->f("idartlang"); + + $pagetitle = stripslashes($db->f("pagetitle")); + + if ($pagetitle == '') { + CEC_Hook::setDefaultReturnValue($pagetitle); + $pagetitle = CEC_Hook::executeAndReturn('Contenido.Content.CreateTitletag'); + } + + /* replace all CMS_TAGS[] */ + $sql = "SELECT type, code FROM ".$cfg["tab"]["type"]; + + $db->query($sql); + + $match = array (); + while ($db->next_record()) + { + + $tmp = preg_match_all("/(".$db->f("type")."\[+\d+\])/i", $code, $match); + $a_[strtolower($db->f("type"))] = $match[0]; + + $success = array_walk($a_[strtolower($db->f("type"))], 'extractNumber'); + + $search = array (); + $replacements = array (); + + foreach ($a_[strtolower($db->f("type"))] as $val) + { + eval ($db->f("code")); + + $search[$val] = $db->f("type")."[$val]"; + $replacements[$val] = $tmp; + $keycode[$db->f("type")][$val] = $tmp; + } + + $code = str_ireplace($search, $replacements, $code); + + } + + /* add/replace title */ + if ($pagetitle != "") + { + $code = preg_replace("/.*?<\/title>/is", "{TITLE}", $code, 1); + + if (strstr($code, "{TITLE}")) + { + $code = str_ireplace("{TITLE}", addslashes("<title>$pagetitle"), $code); + } else + { + $code = str_ireplace_once("", addslashes("".$pagetitle."\n"), $code); + } + } else + { + $code = str_replace('', '', $code); + } + + // metatags + $availableTags = conGetAvailableMetaTagTypes(); + $metatags = array (); + foreach ($availableTags as $key => $value) { + $metavalue = conGetMetaValue($idartlang, $key); + if (strlen($metavalue) > 0) { + //$metatags[$value["name"]] = array(array("attribute" => $value["fieldname"], "value" => $metavalue), ...); + $metatags[] = array ($value["fieldname"] => $value["name"], 'content' => $metavalue); + } + } + + // generator tag + $aVersion = explode('.', $cfg['version']); + $sCLVersion = $aVersion[0] . '.' . $aVersion[1]; + $metatags[] = array ('name' => 'generator', 'content' => 'CMS ConLite ' . $sCLVersion); + + // charset/encoding tag + if(getEffectiveSetting('generator', 'html5', "false") == "true") { + $metatags[] = array('charset' => $encoding[$lang]); + } else if(getEffectiveSetting('generator', 'xhtml', "false") == "true") { + $metatags[] = array ('http-equiv' => 'Content-Type', 'content' => 'application/xhtml+xml; charset='.$encoding[$lang]); + } else { + $metatags[] = array ('http-equiv' => 'Content-Type', 'content' => 'text/html; charset='.$encoding[$lang]); + } + + // check chains + $_cecIterator = $_cecRegistry->getIterator("Contenido.Content.CreateMetatags"); + + if($_cecIterator->count() > 0) { + $tmpMetatags = $metatags; + if(!is_array($tmpMetatags)) { + $tmpMetatags = array(); + } + + while($chainEntry = $_cecIterator->next()) { + $tmpMetatags = $chainEntry->execute($tmpMetatags); + } + + //added 2008-06-25 Timo Trautmann + //system metatags were merged to user meta tags + //and user meta tags were not longer replaced by system meta tags + /** @todo recode whole meta tag handling */ + if(is_array($tmpMetatags)) { + //check for all system meta tags if there is already a user meta tag + foreach ($tmpMetatags as $aAutValue) { + $bExists = false; + + //get name of meta tag for search + $sSearch = ''; + if (array_key_exists('name', $aAutValue)) { + $sSearch = $aAutValue['name']; + } else if (array_key_exists('http-equiv', $aAutValue)) { + $sSearch = $aAutValue['http-equiv']; + } + + //check if meta tag is already in list of user meta tags + if (strlen($sSearch) > 0) { + foreach ($metatags as $aValue) { + if (array_key_exists('name', $aValue)) { + if ($sSearch == $aValue['name']) { + $bExists = true; + break; + } + } else if (array_key_exists('http-equiv', $aAutValue)) { + if ($sSearch == $aValue['http-equiv']) { + $bExists = true; + break; + } + } + } + } + + //add system meta tag if there is no user meta tag + if ($bExists == false && strlen($aAutValue['content']) > 0) { + array_push($metatags, $aAutValue); + } + } + } + } + $sMetatags = ''; + + foreach ($metatags as $value) { + if(getEffectiveSetting('generator', 'html5', "false") == "true") { + if($value['name'] == 'date') continue; + } + if(!empty($value['content'])) { + $value['content'] = clHtmlEntityDecode($value['content'], ENT_QUOTES, strtoupper($encoding[$lang])); + $value['content'] = htmlspecialchars_decode($value['content'], ENT_QUOTES); + } + + // build up metatag string + $oMetaTagGen = new cHTML5Meta(); + $oMetaTagGen->updateAttributes($value); + + /* HTML does not allow ID for meta tags */ + $oMetaTagGen->removeAttribute("id"); + + /*Check if metatag already exists*/ + if (preg_match('/(]+)>\r?\n?)/i', $code, $aTmetatagfound)) { + $code = str_replace($aTmetatagfound[1], $oMetaTagGen->render()."\n", $code); + } else if(array_key_exists ("charset", $value) + && preg_match('/(]+)\r?\n?)/i', $code, $aTmetatagfound)) { + $code = str_replace($aTmetatagfound[1], $oMetaTagGen->render()."\n", $code); + } else { + $sMetatags .= $oMetaTagGen->render()."\n"; + } + } + + /* Add meta tags */ + $code = str_ireplace_once("", $sMetatags."", $code); + $code = str_ireplace_once("", "\n", $code); + + /* write code into the database */ + $date = date("Y-m-d H:i:s"); + + if ($layout == false) + { + $sql = "SELECT * FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."' AND idlang = '".Contenido_Security::escapeDB($lang, $db)."'"; + + $db->query($sql); + + if ($db->next_record()) + { + if ($debug) + echo "UPDATED code for lang:$lang, client:$client, idcatart:$idcatart"; + $sql = "UPDATE ".$cfg["tab"]["code"]." SET code='".Contenido_Security::escapeDB($code, $db, false)."', idlang='".Contenido_Security::escapeDB($lang, $db)."', idclient='".Contenido_Security::escapeDB($client, $db)."' + WHERE idcatart='".Contenido_Security::toInteger($idcatart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; + $db->query($sql); + } else + { + if ($debug) + echo "INSERTED code for lang:$lang, client:$client, idcatart:$idcatart"; + $sql = "INSERT INTO ".$cfg["tab"]["code"]." (idcode, idcatart, code, idlang, idclient) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["code"]))."', '".Contenido_Security::toInteger($idcatart)."', + '".Contenido_Security::escapeDB($code, $db, false)."', '".Contenido_Security::escapeDB($lang, $db)."', '".Contenido_Security::escapeDB($client, $db)."')"; + $db->query($sql); + } + + $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET createcode = '0' WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; + $db->query($sql); + } + + // execute CEC hook + $code = CEC_Hook::executeAndReturn('Contenido.Content.conGenerateCode', $code); + + return $code; +} + +/** + * Returns the idartlang for a given article and language + * + * @deprecated since version 2.0, use renamed conGetArtLang instead + * @param $idart ID of the article + * @param $idlang ID of the language + * @return mixed idartlang of the article or false if nothing was found + */ +function getArtLang($idart, $idlang) { + return conGetArtLang($idart, $idlang); +} + +/** + * Returns the idartlang for a given article and language + * + * @param $idart ID of the article + * @param $idlang ID of the language + * @return mixed idartlang of the article or false if nothing was found + */ +function conGetArtLang($iIdart, $iIdlang) { + $oArtLangs = new cApiArticleLanguageCollection(); + $iRet = $oArtLangs->getIdArtLang($iIdart, $iIdlang); + unset($oArtLangs); // save mem + return $iRet; +} + +/** + * Returns all available meta tag types + * + * @return array Array with available meta types + */ +function conGetAvailableMetaTagTypes() { + $oMetaTypes = new cApiMetaTypeCollection(); + $aRet = $oMetaTypes->getAvailableMetaTypes(); + unset($oMetaTypes); // save mem + return $aRet; +} + +/** + * Get the meta tag value for a specific article + * + * @param int $idartlang + * @param int $idmetatype + * @return string tag value or empty string + */ +function conGetMetaValue($idartlang, $idmetatype) { + + if($idartlang == 0) return; + + $oMetaTags = new cApiMetaTagCollection(); + $oMetaTags->setWhere('idartlang', Contenido_Security::toInteger($idartlang)); + $oMetaTags->setWhere('idmetatype', Contenido_Security::toInteger($idmetatype)); + $oMetaTags->query(); + + if($oMetaTags->count() > 0) { + $sRet = $oMetaTags->next()->get('metavalue'); + } else { + $sRet = ""; + } + unset($oMetaTags); // save mem + return $sRet; +} + +/** + * Set the meta tag value for a specific article + * + * @param $idartlang ID of the article + * @param $idmetatype Metatype-ID + * @param $value Value of the meta tag + * + * @author Timo A. Hummel + * @copyright four for business AG 2003 + */ +function conSetMetaValue($idartlang, $idmetatype, $value) +{ + global $cfg; + + $db = new DB_ConLite; + $sql = "DELETE FROM ".$cfg["tab"]["meta_tag"]." + WHERE idartlang = '".Contenido_Security::toInteger($idartlang)."' + AND idmetatype = '".Contenido_Security::toInteger($idmetatype)."'"; + + $db->query($sql); + + $nextid = $db->nextid($cfg["tab"]["meta_tag"]); + + $sql = "INSERT INTO ".$cfg["tab"]["meta_tag"]." SET idartlang = '".Contenido_Security::toInteger($idartlang)."', + idmetatype = '".Contenido_Security::toInteger($idmetatype)."', + idmetatag = '".Contenido_Security::toInteger($nextid)."', + metavalue = '".Contenido_Security::escapeDB($value, $db)."'"; + + $db->query($sql); + +} + +/** + * (re)generate keywords for all articles of a given client (with specified language) + * @param $client Client + * @param $lang Language of a client + * @return void + * + * @author Willi Man + * Created : 12.05.2004 + * Modified : 13.05.2004 + * @copyright four for business AG 2003 + */ +function conGenerateKeywords($client, $lang) +{ + global $cfg; + $db_art = new DB_ConLite; + + $options = array ("img", "link", "linktarget", "swf"); // cms types to be excluded from indexing + + $sql = "SELECT + a.idart, b.idartlang + FROM + ".$cfg["tab"]["art"]." AS a, + ".$cfg["tab"]["art_lang"]." AS b + WHERE + a.idart = b.idart AND + a.idclient = ".Contenido_Security::escapeDB($client, $db)." AND + b.idlang = ".Contenido_Security::escapeDB($lang, $db); + + $db_art->query($sql); + + $articles = array (); + while ($db_art->next_record()) + { + $articles[$db_art->f("idart")] = $db_art->f("idartlang"); + } + + if (count($articles) > 0) + { + foreach ($articles as $artid => $article_lang) + { + $article_content = array (); + $article_content = conGetContentFromArticle($article_lang); + + if (count($article_content) > 0) + { + $art_index = new Index($db_art); + $art_index->lang = $lang; + $art_index->start($artid, $article_content, 'auto', $options); + } + + } + } + +} + +/** + * get content from article + * @param $article_lang ArticleLanguageId of an article (idartlang) + * @return array Array with content of an article indexed by content-types + * + * @author Willi Man + * Created : 12.05.2004 + * Modified : 13.05.2004 + * @copyright four for business AG 2003 + */ +function conGetContentFromArticle($article_lang) +{ + + global $cfg; + $db_con = new DB_ConLite; + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["content"]." AS A, + ".$cfg["tab"]["art_lang"]." AS B, + ".$cfg["tab"]["type"]." AS C + WHERE + A.idtype = C.idtype AND + A.idartlang = B.idartlang AND + A.idartlang = '".Contenido_Security::escapeDB($article_lang, $db_con)."' "; + + $db_con->query($sql); + + while ($db_con->next_record()) + { + $a_content[$db_con->f("type")][$db_con->f("typeid")] = urldecode($db_con->f("value")); + } + + return $a_content; + +} +?> diff --git a/conlite/includes/functions.database.php b/conlite/includes/functions.database.php new file mode 100644 index 0000000..f297d5a --- /dev/null +++ b/conlite/includes/functions.database.php @@ -0,0 +1,459 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-06-04 + * modified 2008-06-25, Frederic Schneider, add security fix + * modified 2008-07-11, Dominik Ziegler, removed deprecated functions + * modified 2011-05-17, Murat Purc, documented functions and some optimizations + * + * $Id: functions.database.php 320 2015-01-16 16:06:38Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Returns existing indexes of a specific table. + * @param DB_ConLite $db + * @param string $table + * @return array Assoziative array where the key and the value is the index name + */ +function dbGetIndexes($db, $table) +{ + if (!is_object($db)) { + return false; + } + + $sql = "SHOW INDEX FROM ".Contenido_Security::escapeDB($table, $db); + $db->query($sql); + + $indexes = array(); + + while ($db->next_record()) { + $indexes[$db->f("Key_name")] = $db->f("Key_name"); + } + + return ($indexes); +} + + +/** + * Updates a specific table. Used e. g. by Contenido setup to create or update + * tables. + * Function logic: + * 1 .) Check, if the table exists + * 2a.) If not, create it with the field specification, exit + * 2b.) If the table exists, check, if the field exist + * 3 .) If not, try to find the field using previous names (if specified in $field like "name1,name2") + * 4a.) If the field hasn't been found, create the field as specified, exit + * 4b.) If the field has been found using a previous name (if specified) rename the column to $field + * 5 .) As the field has been found, check, if the field's type is matching + * 5a.) If the type is matching, exit + * 5b.) If the field's content type is not matching, try to convert first (e.g. string to int + * or int to string), then use the upgrade statement if applicable + * + * Note about the upgrade statement: + * - the code must be eval'able + * - the code needs to read $oldVal (old field value) and needs to set $newVal (value to which the field will be set) + * - $oldVal might be empty if the field didn't exist + * - $tableValues['fieldname'] contains the already existing values + * + * @param DB_ConLite $db Database instance + * @param string $table Name of table to create/update + * @param string $field Name of field to create/update + * @param string $type Data type of field. Feasible values are all possible data types + * e. g. int(10), varchar(32), datetime, varchar(255), text, tinyint(1) + * @param string $null Parameter to forbid null values, feasible values "", "NULL" or "YES" + * where "NULL" or "YES" allows null values and "" doesn't + * @param string $key The field will be added as a primary key, if value is "PRI", + * otherwhise the value should be empty "" + * @param string $default The default value for the field. Feasible is each possible + * value depending on passed $type + * @param string $extra Additional info for the field, e. g. "auto_increment", if the + * field should have the AUTO_INCREMENT attribute and empty otherwise. + * @param string $upgradeStatement NOT USED AT THE MOMENT + * @param bool $bRemoveIndexes Flag to remove all indexes + * @return bool + */ +function dbUpgradeTable($db, $table, $field, $type, $null, $key, $default, $extra, + $upgradeStatement, $bRemoveIndexes = false) +{ + global $columnCache; + global $tableCache; + + if (!is_object($db)) { + return false; + } + + $bDebug = false; + if (($table == 'pica_alloc') && ($field == 'parentid')) { + $bDebug = true; + } + + // Parameter checking for $null. If parameter is "" or "NULL" or "YES", we + // know that we want the colum to forbid null entries. + if ($null == "NULL" || $null == "YES") { + $parameter['NULL'] = "NULL"; + $null = "YES"; + } else { + $parameter['NULL'] = "NOT NULL"; + $null = ""; + } + + // Parameter checking for $key. If parameter is "" or "NULL" or "YES", we + // know that we want the primary key. + if ($key == "PRI") { + $parameter['KEY'] = "PRIMARY KEY"; + } else { + $parameter['KEY'] = ""; + } + + // Parameter check for $default. If set, create a default value + if ($default != "") { + if (((strpos($type, 'timestamp') !== FALSE) && ($default != '')) || ($default == 'NULL')) { + $parameter['DEFAULT'] = "DEFAULT ".Contenido_Security::escapeDB($default, $db); + } else { + $parameter['DEFAULT'] = "DEFAULT '".Contenido_Security::escapeDB($default, $db)."'"; + } + } + + if (!dbTableExists($db, $table)) { + $createTable = " CREATE TABLE ".Contenido_Security::escapeDB($table, $db)." (".Contenido_Security::escapeDB($field, $db)." $type ".$parameter['NULL']." ".$parameter['DEFAULT']." ".$parameter['KEY'] .") ENGINE = MYISAM"; + $db->query($createTable); + $tableCache[] = $table; + return true; + } + + // Remove auto_increment + $structure = dbGetColumns($db, $table); + + if ($structure[$field]["Extra"] == "auto_increment") { + if ($structure[$field]['NULL'] == "") { + $structure[$field]['NULL'] = "NOT NULL"; + } + $alterField = "ALTER TABLE ".Contenido_Security::escapeDB($table, $db)." CHANGE COLUMN ".Contenido_Security::escapeDB($field, $db)." ".Contenido_Security::escapeDB($field, $db)." + ".Contenido_Security::escapeDB($type, $db)." ".$structure[$field]['NULL']." ".$structure[$field]['DEFAULT']." ".$structure[$field]['KEY']; + + $db->query($alterField); + } + + // Remove all keys, as they are being recreated during an upgrade + if ($bRemoveIndexes == true) { + $indexes = dbGetIndexes($db, $table); + + foreach ($indexes as $index) { + if ($index == "PRIMARY") { + if ($structure[$field]['Key'] == "PRI") { + $sql = " ALTER TABLE ".Contenido_Security::escapeDB($table, $db)." DROP PRIMARY KEY"; + } else { + $sql = ""; + } + } else { + $sql = " ALTER TABLE ".Contenido_Security::escapeDB($table, $db)."' DROP INDEX ".Contenido_Security::escapeDB($index, $db); + } + + $db->query($sql); + unset($columnCache[$table]); + } + } + + $structure = dbGetColumns($db, $table); + + // If $field contains "," previous names has been specified; separate from $field + $sepPos = strpos($field, ","); + if ($sepPos === false) { + $previousName = ""; + } else { + $previousName = substr($field, $sepPos + 1); + $field = substr($field, 0, $sepPos); + } + + if (!array_key_exists($field,$structure)) { + // HerrB: Search field using $previousName + $blnFound = false; + if ($previousName != "") { + $arrPreviousName = explode(",", $previousName); + foreach ($arrPreviousName as $strPrevious) { + // Maybe someone has used field1, field2, ..., trim spaces + $strPrevious = trim($strPrevious); + if (array_key_exists($strPrevious,$structure)) { + $blnFound = true; + break; + } + } + } + + if ($blnFound) { + // Rename column, update array, proceed + if ($structure[$strPrevious]['Null'] == 'YES') { + $alterField = " ALTER TABLE `".Contenido_Securiy::escapeDB($table, $db)."` CHANGE COLUMN `".Contenido_Security::escapeDB($strPrevious, $db)."` `".Contenido_Security::escapeDB($field, $db)."` + ".$structure[$strPrevious]['Type']." DEFAULT '".$structure[$strPrevious]['Default']."'"; + } else { + $alterField = " ALTER TABLE `".Contenido_Security::escapeDB($table, $db)."` CHANGE COLUMN `".Contenido_Security::escapeDB($strPrevious, $db)."` `".Contenido_Security::escapeDB($field, $db)."` + ".$structure[$strPrevious]['Type']." NOT NULL DEFAULT '".$structure[$strPrevious]['Default']."'"; + } + + $db->query($alterField); + + $columnCache[$table] = ""; + $structure = dbGetColumns($db, $table); + } else { + // Add column as specified + $createField = " ALTER TABLE ".Contenido_Security::escapeDB($table, $db)." ADD COLUMN ".Contenido_Security::escapeDB($field, $db)." ".Contenido_Security::escapeDB($type, $db)." + ".$parameter['NULL']." ".$parameter['DEFAULT']." ".$parameter['KEY']; + $db->query($createField); +if ($bDebug) {echo 'createField:'.$createField.'
';} + $columnCache[$table] = ""; + return true; + } + } + + $structure = dbGetColumns($db, $table); + + // Third check: Compare field properties + if (($structure[$field]['Type'] != $type) || + ($structure[$field]['Null'] != $null) || + ($structure[$field]['Key'] != $key) || + ($structure[$field]['Default'] != $default) || + ($structure[$field]['Extra'] != $extra)) { + + if ($structure[$field]['Key'] == "PRI") { + $alterField = " ALTER TABLE ".Contenido_Security::escapeDB($table, $db)." ADD PRIMARY KEY ('".Contenido_Security::escapeDB($field, $db)."') "; + } else { + $alterField = " ALTER TABLE ".Contenido_Security::escapeDB($table, $db)." CHANGE COLUMN $field $field $type ".$parameter['NULL']." ".$parameter['DEFAULT']." ".$parameter['KEY']; + } + + $db->query($alterField); + + $columnCache[$table] = ""; + } + + return true; +} + + +/** + * Checks, if passed table exists in the database + * @param DB_ConLite $db + * @param string $table + * @return bool + */ +function dbTableExists($db, $table) +{ + global $tableCache; + + if (!is_object($db)) { + return false; + } + + if (!is_array($tableCache)) { + $sql = "SHOW TABLES"; + $db->query($sql); + + $tableCache = array(); + + while ($db->next_record()) { + $tableCache[] = $db->f(0); + } + } + + if (in_array($table, $tableCache)) { + return true; + } else { + return false; + } +} + + +/** + * Returns the column structure of a table + * @param DB_ConLite $db + * @param string $table + * @return array|bool Either assoziative column array or false + */ +function dbGetColumns($db, $table) +{ + global $columnCache; + + if (!is_object($db)) { + return false; + } + + if (isset($columnCache[$table]) && is_array($columnCache[$table])) { + return $columnCache[$table]; + } + + $sql = "SHOW COLUMNS FROM ".Contenido_Security::escapeDB($table, $db); + $db->query($sql); + + $structure = array(); + + while ($db->next_record()) { + $structure[$db->f("Field")] = $db->toArray(); + } + + $columnCache[$table] = $structure; + + return $structure; +} + + +/** + * Returns the primary key column of a table + * @param DB_ConLite $db + * @param string $table + * @return string + */ +function dbGetPrimaryKeyName($db, $table) +{ + $sReturn = ""; + $structure = dbGetColumns($db, $table); + + if (is_array($structure)) { + foreach ($structure as $mykey => $value) { + if ($value['Key'] == "PRI") { + $sReturn = $mykey; + } + } + } + + return $sReturn; +} + + +/** + * Updates the sequence table, stores the highest primary key value of a table in it. + * Retrieves the primary key field of the table, retrieves the highes value and + * saves the value in the sequence table. + * + * @param string $sequencetable Name of sequence table + * @param string $table Name of table + * @param DB_ConLite|bool $db Database instance or false + */ +function dbUpdateSequence($sequencetable, $table, $db = false) +{ + if ($db === false) { + $bClose = true; + $db = new DB_Upgrade; + } else { + $bClose = false; + } + + $key = dbGetPrimaryKeyName($db, $table); + + if ($key != "" && $key != $sequencetable) { + $sql = "SELECT ".Contenido_Security::escapeDB($key, $db)." FROM ". Contenido_Security::escapeDB($table, $db) ." ORDER BY " . Contenido_Security::escapeDB($key, $db) ." DESC"; + $db->query($sql); + + if ($db->next_record()) { + $highestval = $db->f($key); + } else { + $highestval = 0; + } + + $sql = "DELETE FROM " . Contenido_Security::escapeDB($sequencetable, $db) . " WHERE seq_name = '".Contenido_Security::escapeDB($table, $db)."'"; + $db->query($sql); + + $sql = "INSERT INTO " . Contenido_Security::escapeDB($sequencetable, $db) ." SET seq_name = '".Contenido_Security::escapeDB($table, $db)."', nextid = '".Contenido_Security::toInteger($highestval)."'"; + $db->query($sql); + } + + if ($bClose == true) { + $db->close(); + } +} + + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbDumpStructure($db, $table, $return = false) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbDumpArea($db, $id) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbDumpAreasAsArray($arrayname, $db) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbDumpNavSub($arrayname, $db, $nextidarea) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbInsertData($table, $data) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbDumpData($table) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} + +/** + * @deprecated + * @since 2008-07-11 + */ +function dbUpgradeData($table, $valuesArray) +{ + /* this function is deprecated since Contenido 4.8.7 - 2008-07-11 */ + return; +} +?> \ No newline at end of file diff --git a/conlite/includes/functions.domxml-php4-to-php5.php b/conlite/includes/functions.domxml-php4-to-php5.php new file mode 100644 index 0000000..59c6f17 --- /dev/null +++ b/conlite/includes/functions.domxml-php4-to-php5.php @@ -0,0 +1,445 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-06-05 + * modified 2008-06-26, Frederic Schneider, add security fix + * + * $Id: functions.domxml-php4-to-php5.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Requires PHP5, uses built-in DOM extension, + * and if domxml_xslt functions are used, needs XSL extension (included). + * + * To be used in PHP4 scripts using DOMXML extension. + * Allows PHP4/DOMXML scripts to run on PHP5/DOM + * http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/ + **/ + +define('DOMXML_LOAD_PARSING',0); +define('DOMXML_LOAD_VALIDATING',1); +define('DOMXML_LOAD_RECOVERING',2); +define('DOMXML_LOAD_SUBSTITUTE_ENTITIES',4); +define('DOMXML_LOAD_DONT_KEEP_BLANKS',16); + +function domxml_new_doc($version) {return new php4DOMDocument();} +function domxml_new_xmldoc($version) {return new php4DOMDocument();} +function domxml_open_file($filename,$mode=DOMXML_LOAD_PARSING,&$error=null) +{ + $dom=new php4DOMDocument($mode); + $errorMode=(func_num_args()>2); + if ($errorMode) libxml_use_internal_errors(true); + if (!$dom->myDOMNode->load($filename)) $dom=null; + if ($errorMode) + { + $error=array_map('_error_report',libxml_get_errors()); + libxml_clear_errors(); + } + return $dom; +} +function domxml_open_mem($str,$mode=DOMXML_LOAD_PARSING,&$error=null) +{ + $dom=new php4DOMDocument($mode); + $errorMode=(func_num_args()>2); + if ($errorMode) libxml_use_internal_errors(true); + if (!$dom->myDOMNode->loadXML($str)) $dom=null; + if ($errorMode) + { + $error=array_map('_error_report',libxml_get_errors()); + libxml_clear_errors(); + } + return $dom; +} +function html_doc($html_doc,$from_file=false) +{ + $dom=new php4DOMDocument(); + if ($from_file) $result=$dom->myDOMNode->loadHTMLFile($html_doc); + else $result=$dom->myDOMNode->loadHTML($html_doc); + return $result ? $dom : null; +} +function html_doc_file($filename) {return html_doc($filename,true);} +function xmldoc($str) {return domxml_open_mem($str);} +function xmldocfile($filename) {return domxml_open_file($filename);} +function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->xpath_eval($eval_str,$contextnode);} +function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);} +function xpath_register_ns($xpath_context,$prefix,$namespaceURI) {return $xpath_context->myDOMXPath->registerNamespace($prefix,$namespaceURI);} +function _error_report($error) {return array('errormessage'=>$error->message,'nodename'=>'','line'=>$error->line,'col'=>$error->column)+($error->file==''?array():array('directory'=>dirname($error->file),'file'=>basename($error->file)));} + +class php4DOMAttr extends php4DOMNode +{ + function name() {return $this->myDOMNode->name;} + function set_value($content) {return $this->myDOMNode->value=$content;} + function specified() {return $this->myDOMNode->specified;} + function value() {return $this->myDOMNode->value;} +} + +class php4DOMDocument extends php4DOMNode +{ + function php4DOMDocument($mode=DOMXML_LOAD_PARSING) + { + $this->myDOMNode=new DOMDocument(); + $this->myOwnerDocument=$this; + if ($mode & DOMXML_LOAD_VALIDATING) $dom->myDOMNode->validateOnParse=true; + if ($mode & DOMXML_LOAD_RECOVERING) $dom->myDOMNode->recover=true; + if ($mode & DOMXML_LOAD_SUBSTITUTE_ENTITIES) $dom->myDOMNode->substituteEntities=true; + if ($mode & DOMXML_LOAD_DONT_KEEP_BLANKS) $dom->myDOMNode->preserveWhiteSpace=false; + } + function add_root($name) + { + if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild); + return new php4DOMElement($this->myDOMNode->appendChild($this->myDOMNode->createElement($name)),$this->myOwnerDocument); + } + function create_attribute($name,$value) + { + $myAttr=$this->myDOMNode->createAttribute($name); + $myAttr->value=$value; + return new php4DOMAttr($myAttr,$this); + } + function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);} + function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);} + function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);} + function create_element_ns($uri,$name,$prefix=null) + { + if ($prefix==null) $prefix=$this->myDOMNode->lookupPrefix($uri); + if (($prefix==null)&&($this->myDOMNode->hasChildNodes())&&(!$this->myDOMNode->firstChild->isDefaultNamespace($uri))) $prefix='a'.sprintf('%u',crc32($uri)); + return new php4DOMElement($this->myDOMNode->createElementNS($uri,$prefix==null ? $name : $prefix.':'.$name),$this); + } + function create_entity_reference($content) {return new php4DOMNode($this->myDOMNode->createEntityReference($content),$this);} //By Walter Ebert 2007-01-22 + function create_text_node($content) {return new php4DOMText($this->myDOMNode->createTextNode($content),$this);} + function document_element() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);} + function dump_file($filename,$compressionmode=false,$format=false) + { + $format0=$this->myDOMNode->formatOutput; + $this->myDOMNode->formatOutput=$format; + $res=$this->myDOMNode->save($filename); + $this->myDOMNode->formatOutput=$format0; + return $res; + } + function dump_mem($format=false,$encoding=false) + { + $format0=$this->myDOMNode->formatOutput; + $this->myDOMNode->formatOutput=$format; + $encoding0=$this->myDOMNode->encoding; + if ($encoding) $this->myDOMNode->encoding=$encoding; + $dump=$this->myDOMNode->saveXML(); + $this->myDOMNode->formatOutput=$format0; + if ($encoding) $this->myDOMNode->encoding= $encoding0=='' ? 'UTF-8' : $encoding0; //UTF-8 is XML default encoding + return $dump; + } + function free() + { + if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild); + $this->myDOMNode=null; + $this->myOwnerDocument=null; + } + function get_element_by_id($id) {return parent::_newDOMElement($this->myDOMNode->getElementById($id),$this);} + function get_elements_by_tagname($name) + { + $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name); + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this); + return $nodeSet; + } + function html_dump_mem() {return $this->myDOMNode->saveHTML();} + function root() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);} + function xpath_new_context() {return new php4DOMXPath($this);} +} + +class php4DOMElement extends php4DOMNode +{ + function add_namespace($uri,$prefix) + { + if ($this->myDOMNode->hasAttributeNS('http://www.w3.org/2000/xmlns/',$prefix)) return false; + else + { + $this->myDOMNode->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$prefix,$uri); + return true; + } + } + function get_attribute($name) {return $this->myDOMNode->getAttribute($name);} + function get_attribute_node($name) {return parent::_newDOMElement($this->myDOMNode->getAttributeNode($name),$this->myOwnerDocument);} + function get_elements_by_tagname($name) + { + $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name); + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument); + return $nodeSet; + } + function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);} + function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);} + function set_attribute($name,$value) + { + $myAttr=$this->myDOMNode->ownerDocument->createAttribute($name); + $myAttr->value=$value; + $this->myDOMNode->setAttributeNode($myAttr); + return new php4DOMAttr($myAttr,$this->myOwnerDocument); + } + function set_attribute_node($attr) + { + $this->myDOMNode->setAttributeNode($this->_importNode($attr)); + return $attr; + } + function set_name($name) + { + if ($this->myDOMNode->prefix=='') $newNode=$this->myDOMNode->ownerDocument->createElement($name); + else $newNode=$this->myDOMNode->ownerDocument->createElementNS($this->myDOMNode->namespaceURI,$this->myDOMNode->prefix.':'.$name); + $myDOMNodeList=$this->myDOMNode->attributes; + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) + if ($node->namespaceURI=='') $newNode->setAttribute($node->name,$node->value); + else $newNode->setAttributeNS($node->namespaceURI,$node->nodeName,$node->value); + $myDOMNodeList=$this->myDOMNode->childNodes; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item(0)) $newNode->appendChild($node); + $this->myDOMNode->parentNode->replaceChild($newNode,$this->myDOMNode); + $this->myDOMNode=$newNode; + return true; + } + function tagname() {return $this->myDOMNode->tagName;} +} + +class php4DOMNode +{ + public $myDOMNode; + public $myOwnerDocument; + function php4DOMNode($aDomNode,$aOwnerDocument) + { + $this->myDOMNode=$aDomNode; + $this->myOwnerDocument=$aOwnerDocument; + } + function __get($name) + { + switch ($name) + { + case 'type': return $this->myDOMNode->nodeType; + case 'tagname': return $this->myDOMNode->tagName; + case 'content': return $this->myDOMNode->textContent; + case 'name': return $this->myDOMNode->name; + case 'value': return $this->myDOMNode->value; + default: + $myErrors=debug_backtrace(); + trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE); + return false; + } + } + function add_child($newnode) {return append_child($newnode);} + function add_namespace($uri,$prefix) {return false;} + function append_child($newnode) {return self::_newDOMElement($this->myDOMNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);} + function append_sibling($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);} + function attributes() + { + $myDOMNodeList=$this->myDOMNode->attributes; + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument); + return $nodeSet; + } + function child_nodes() + { + $myDOMNodeList=$this->myDOMNode->childNodes; + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=self::_newDOMElement($node,$this->myOwnerDocument); + return $nodeSet; + } + function children() {return $this->child_nodes();} + function clone_node($deep=false) {return self::_newDOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);} + function dump_node($node=null) {return $node==null ? $this->myOwnerDocument->myDOMNode->saveXML($this->myDOMNode) : $this->myOwnerDocument->myDOMNode->saveXML($node->myDOMNode);} + function first_child() {return self::_newDOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);} + function get_content() {return $this->myDOMNode->textContent;} + function has_attributes() {return $this->myDOMNode->hasAttributes();} + function has_child_nodes() {return $this->myDOMNode->hasChildNodes();} + function insert_before($newnode,$refnode) {return self::_newDOMElement($this->myDOMNode->insertBefore($this->_importNode($newnode),$refnode==null?null:$refnode->myDOMNode),$this->myOwnerDocument);} + function is_blank_node() {return ($this->myDOMNode->nodeType===XML_TEXT_NODE)&&preg_match('%^\s*$%',$this->myDOMNode->nodeValue);} + function last_child() {return self::_newDOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);} + function new_child($name,$content) + { + $mySubNode=$this->myDOMNode->ownerDocument->createElement($name); + $mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(clHtmlEntityDecode($content,ENT_QUOTES))); + $this->myDOMNode->appendChild($mySubNode); + return new php4DOMElement($mySubNode,$this->myOwnerDocument); + } + function next_sibling() {return self::_newDOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);} + function node_name() {return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->nodeName;} //Avoid namespace prefix for DOMElement + function node_type() {return $this->myDOMNode->nodeType;} + function node_value() {return $this->myDOMNode->nodeValue;} + function owner_document() {return $this->myOwnerDocument;} + function parent_node() {return self::_newDOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);} + function prefix() {return $this->myDOMNode->prefix;} + function previous_sibling() {return self::_newDOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);} + function remove_child($oldchild) {return self::_newDOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);} + function replace_child($newnode,$oldnode) {return self::_newDOMElement($this->myDOMNode->replaceChild($this->_importNode($newnode),$oldnode->myDOMNode),$this->myOwnerDocument);} + function set_content($text) {return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode($text));} + function set_namespace($uri,$prefix=null) + {//Contributions by Daniel Walker 2006-09-08 + $nsprefix=$this->myDOMNode->lookupPrefix($uri); + if ($nsprefix==null) + { + $nsprefix= $prefix==null ? $nsprefix='a'.sprintf('%u',crc32($uri)) : $prefix; + if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) + { + if (($prefix!=null)&&$this->myDOMNode->ownerElement->hasAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)&& + ($this->myDOMNode->ownerElement->getAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)!=$uri)) + {//Remove namespace + $parent=$this->myDOMNode->ownerElement; + $parent->removeAttributeNode($this->myDOMNode); + $parent->setAttribute($this->myDOMNode->localName,$this->myDOMNode->nodeValue); + $this->myDOMNode=$parent->getAttributeNode($this->myDOMNode->localName); + return; + } + $this->myDOMNode->ownerElement->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$nsprefix,$uri); + } + } + if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) + { + $parent=$this->myDOMNode->ownerElement; + $parent->removeAttributeNode($this->myDOMNode); + $parent->setAttributeNS($uri,$nsprefix.':'.$this->myDOMNode->localName,$this->myDOMNode->nodeValue); + $this->myDOMNode=$parent->getAttributeNodeNS($uri,$this->myDOMNode->localName); + } + elseif ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) + { + $NewNode=$this->myDOMNode->ownerDocument->createElementNS($uri,$nsprefix.':'.$this->myDOMNode->localName); + foreach ($this->myDOMNode->attributes as $n) $NewNode->appendChild($n->cloneNode(true)); + foreach ($this->myDOMNode->childNodes as $n) $NewNode->appendChild($n->cloneNode(true)); + $xpath=new DOMXPath($this->myDOMNode->ownerDocument); + $myDOMNodeList=$xpath->query('namespace::*[name()!="xml"]',$this->myDOMNode); //Add old namespaces + foreach ($myDOMNodeList as $n) $NewNode->setAttributeNS('http://www.w3.org/2000/xmlns/',$n->nodeName,$n->nodeValue); + $this->myDOMNode->parentNode->replaceChild($NewNode,$this->myDOMNode); + $this->myDOMNode=$NewNode; + } + } + function unlink_node() + { + if ($this->myDOMNode->parentNode!=null) + { + if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) $this->myDOMNode->parentNode->removeAttributeNode($this->myDOMNode); + else $this->myDOMNode->parentNode->removeChild($this->myDOMNode); + } + } + //To import DOMNode from another DOMDocument + protected function _importNode($newnode) {return $this->myOwnerDocument===$newnode->myOwnerDocument ? $newnode->myDOMNode : $this->myOwnerDocument->myDOMNode->importNode($newnode->myDOMNode,true);} + static function _newDOMElement($aDOMNode,$aOwnerDocument) + {//Check the PHP5 DOMNode before creating a new associated PHP4 DOMNode wrapper + if ($aDOMNode==null) return null; + switch ($aDOMNode->nodeType) + { + case XML_ELEMENT_NODE: return new php4DOMElement($aDOMNode,$aOwnerDocument); + case XML_TEXT_NODE: return new php4DOMText($aDOMNode,$aOwnerDocument); + case XML_ATTRIBUTE_NODE: return new php4DOMAttr($aDOMNode,$aOwnerDocument); + default: return new php4DOMNode($aDOMNode,$aOwnerDocument); + } + } +} + +class php4DOMText extends php4DOMNode +{ + function __get($name) + { + if ($name==='tagname') return '#text'; + else return parent::__get($name); + } + function tagname() {return '#text';} +} + +if (!defined('XPATH_NODESET')) +{ + define('XPATH_UNDEFINED',0); + define('XPATH_NODESET',1); +} + +class php4DOMNodelist +{ + private $myDOMNodelist; + public $nodeset; + public $type; + function php4DOMNodelist($aDOMNodelist,$aOwnerDocument) + { + $this->myDOMNodelist=$aDOMNodelist; + $this->nodeset=array(); + $i=0; + if (isset($this->myDOMNodelist)) + { + $this->type=XPATH_NODESET; + while ($node=$this->myDOMNodelist->item($i++)) $this->nodeset[]=php4DOMNode::_newDOMElement($node,$aOwnerDocument); + } + else $this->type=XPATH_UNDEFINED; + } +} + +class php4DOMXPath +{ + public $myDOMXPath; + private $myOwnerDocument; + function php4DOMXPath($dom_document) + { + $this->myOwnerDocument=$dom_document->myOwnerDocument; + $this->myDOMXPath=new DOMXPath($this->myOwnerDocument->myDOMNode); + } + function xpath_eval($eval_str,$contextnode=null) {return isset($contextnode) ? new php4DOMNodelist($this->myDOMXPath->query($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument) : new php4DOMNodelist($this->myDOMXPath->query($eval_str),$this->myOwnerDocument);} + function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);} +} + +if (extension_loaded('xsl')) +{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/ + function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));} + function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);} + function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));} + class php4DomXsltStylesheet + { + private $myxsltProcessor; + function php4DomXsltStylesheet($dom_document) + { + $this->myxsltProcessor=new xsltProcessor(); + $this->myxsltProcessor->importStyleSheet($dom_document); + } + function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false) + { + foreach ($xslt_parameters as $param=>$value) $this->myxsltProcessor->setParameter('',$param,$value); + $myphp4DOMDocument=new php4DOMDocument(); + $myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode); + return $myphp4DOMDocument; + } + function result_dump_file($dom_document,$filename) + { + $html=$dom_document->myDOMNode->saveHTML(); + file_put_contents($filename,$html); + return $html; + } + function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();} + } +} +?> \ No newline at end of file diff --git a/conlite/includes/functions.encoding.php b/conlite/includes/functions.encoding.php new file mode 100644 index 0000000..bdbd964 --- /dev/null +++ b/conlite/includes/functions.encoding.php @@ -0,0 +1,95 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-11-12, Andreas Lindner, add function htmlentities_iso88592 + * + * $Id: functions.encoding.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Returns encoding for language with ID $iLang (global $lang in contenido style). + * The parameter $oDb has to be an instance of DB_ConLite (global $db in con) and + * $cfg is the equivalent to global $cfg array in contenido. + * If no encoding is found or any parameter is not valid, the function will return + * false, otherwise the encoding as string like it is stored in database. + * modified 18.03.2008 - Removed special mySQl behaviour (using db object instead) Timo Trautmann + * + * @param DB_ConLite $oDb + * @param int $iLang + * @param array $cfg + * @return string + */ +function getEncodingByLanguage (&$oDb, $iLang, $cfg) { + $sResult = false; + + if (!is_object($oDb)) { + $oDb = new DB_ConLite(); + } + + $iLang = (int) $iLang; + if ($iLang > 0 && is_array($cfg) && is_array($cfg['tab'])) { + // prepare query + $sQuery = " + SELECT + encoding + FROM + " . $cfg["tab"]["lang"] . " + WHERE + idlang = " . Contenido_Security::toInteger($iLang); + + if ($oDb->query($sQuery)) { + if ($oDb->next_record()) { + $sResult = trim($oDb->f('encoding')); + } + } + } + + return $sResult; +} + +/** + * Special version of htmlentites for iso-8859-2 + * Returns transformed string + * + * @param string $sInput + * @return string + */ + +function htmlentities_iso88592 ($sInput = '') { + + $arrEntities_pl = array('ê', 'ó', '±', '¶', '³', '¿', '¼', 'æ', 'ñ', 'Ê', 'Ó', '¡', '¦', '£', '¬', '¯', 'Æ', 'Ñ'); + $arrEntities = clGetHtmlTranslationTable(HTML_ENTITIES); + $arrEntities = array_diff($arrEntities, $arrEntities_pl); + + return strtr($sInput, $arrEntities); + +} + +?> diff --git a/conlite/includes/functions.file.php b/conlite/includes/functions.file.php new file mode 100644 index 0000000..cebc7ca --- /dev/null +++ b/conlite/includes/functions.file.php @@ -0,0 +1,369 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release >= 4.6 + * + * {@internal + * created 2004-07-13 + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-08-14, Timo.Trautmann added file_information functions for storing file meta indormations + * modified 2009-10-23, Murat Purc, removed deprecated function (PHP 5.3 ready), added new function fileValidateFilename() and commented code + * + * $Id: functions.file.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Function removes file meta information from database (used when a file is deleted) + * + * @author Timo Trautmann + * @param integer $iIdClient - id of client which contains this file + * @param string $sFilename - name of corresponding file + * @param string $sType - type of file (css, js or templates) + * @param object $oDb - contenido database object + * + * @return void + */ +function removeFileInformation($iIdClient, $sFilename, $sType, $oDb) { + global $cfg; + + if (!isset($oDb) || !is_object($oDb)) { + $oDb = new DB_ConLite(); + } + + $iIdClient = Contenido_Security::toInteger($iIdClient); + $sFilename = Contenido_Security::filter((string) $sFilename, $oDb); + $sType = Contenido_Security::filter((string) $sType, $oDb); + + $sSql = "DELETE FROM `".$cfg["tab"]["file_information"]."` WHERE idclient=$iIdClient AND + filename='$sFilename' AND + type='$sType';"; + $oDb->query($sSql); + $oDb->free(); +} + +/** + * Function returns file meta information from database (used when files were versionned or description is displayed) + * + * @author Timo Trautmann + * @param integer $iIdClient - id of client which contains this file + * @param string $sFilename - name of corresponding file + * @param string $sType - type of file (css, js or templates) + * @param object $oDb - contenido database object + * + * @return array Indexes: + * idsfi - Primary key of database record + * created - Datetime when file was created + * lastmodified - Datetime when file was last modified + * author - Author of file (Contenido Backend User) + * modifiedby - Last modifier of file (Contenido Backend User) + * description - Description which was inserted for this file + * + */ +function getFileInformation ($iIdClient, $sFilename, $sType, $oDb) { + global $cfg; + + if (!isset($oDb) || !is_object($oDb)) { + $oDb = new DB_ConLite(); + } + + $iIdClient = Contenido_Security::toInteger($iIdClient); + $sFilename = Contenido_Security::filter((string) $sFilename, $oDb); + $sType = Contenido_Security::filter((string) $sType, $oDb); + + $aFileInformation = array(); + $sSql = "SELECT * FROM `".$cfg["tab"]["file_information"]."` WHERE idclient=$iIdClient AND + filename='$sFilename' AND + type='$sType';"; + $oDb->query($sSql); + if ($oDb->num_rows() > 0) { + $oDb->next_record(); + $aFileInformation['idsfi'] = $oDb->f('idsfi'); + $aFileInformation['created'] = $oDb->f('created'); + $aFileInformation['lastmodified'] = $oDb->f('lastmodified'); + $aFileInformation['author'] = Contenido_Security::unFilter($oDb->f('author')); + $aFileInformation['modifiedby'] = $oDb->f('modifiedby'); + $aFileInformation['description'] = Contenido_Security::unFilter($oDb->f('description')); + } + $oDb->free(); + + return $aFileInformation; +} + +/** + * Function updates file meta information (used when files were created or edited). + * It creates new database record for file meta informations if database record does + * not exist. Otherwise, existing record will be updated + * + * @author Timo Trautmann + * @param integer $iIdClient - id of client which contains this file + * @param string $sFilename - name of corresponding file + * @param string $sType - type of file (css, js or templates) + * @param string $sAuthor - author of file + * @param string $sDescription - description of file + * @param object $oDb - contenido database object + * @param string $sFilenameNew - new filename if filename was changed (optional) + * + * @return void + */ +function updateFileInformation($iIdClient, $sFilename, $sType, $sAuthor, $sDescription, $oDb, $sFilenameNew = '') { + global $cfg; + + if (!isset($oDb) || !is_object($oDb)) { + $oDb = new DB_ConLite(); + } + + if ($sFilenameNew == '') { + $sFilenameNew = $sFilename; + } + + $iIdClient = Contenido_Security::toInteger($iIdClient); + $sFilename = Contenido_Security::filter((string) $sFilename, $oDb); + $sType = Contenido_Security::filter((string) $sType, $oDb); + $sDescription = Contenido_Security::filter((string) stripslashes($sDescription), $oDb); + $sAuthor = Contenido_Security::filter((string) $sAuthor, $oDb); + + $sSql = "SELECT * from `".$cfg["tab"]["file_information"]."` WHERE idclient=$iIdClient AND + filename='$sFilename' AND + type='$sType';"; + $oDb->query($sSql); + if ($oDb->num_rows() == 0) { + $iNextId = $oDb->nextid('con_style_file_information'); + $sSql = "INSERT INTO `".$cfg["tab"]["file_information"]."` ( `idsfi` , + `idclient` , + `type` , + `filename` , + `created` , + `lastmodified` , + `author` , + `modifiedby` , + `description` ) + VALUES ( + $iNextId , + $iIdClient, + '$sType', + '$sFilenameNew', + NOW(), + '0000-00-00 00:00:00', + '$sAuthor', + '', + '$sDescription' + );"; + } else { + $sSql = "UPDATE `".$cfg["tab"]["file_information"]."` SET `lastmodified` = NOW(), + `modifiedby` = '$sAuthor', + `description` = '$sDescription', + `filename` = '$sFilenameNew' + + WHERE idclient=$iIdClient AND + filename='$sFilename' AND + type='$sType';"; + } + + $oDb->free(); + $oDb->query($sSql); + $oDb->free(); +} + + +/** + * Writes passed data into a file using binary mode. + * + * Exits the script, if file could not opened! + * + * @param string $filename The file to write the content + * @param string $sCode File content to write + * @param string $path Path to the file + * @return (string|void) Either content of file o nothing + */ +function fileEdit($filename, $sCode, $path) { + global $notification; + + // FIXME: fileValidateFilename does also the validation but display another message! + if (strlen(trim($filename)) == 0) { + $notification->displayNotification("error", i18n("Please insert filename.")); + return false; + } + + fileValidateFilename($filename, true); + + // FIXME: Should be replaced against file_put_contents($path . $filename, FILE_BINARY | LOCK_EX | FILE_APPEND) + + if (is_writable($path.$filename)) { + if (strlen(stripslashes(trim($sCode))) > 0) { + # open file + if (!$handle = fopen($path.$filename, "wb+")) { + $notification->displayNotification("error", sprintf(i18n("Could not open file %s"), $path.$filename)); + exit; + } + # write file + if (!fwrite($handle, stripslashes($sCode))) { + $notification->displayNotification("error", sprintf(i18n("Could not write file %s"), $path.$filename)); + exit; + } + + fclose($handle); + return true; + + } else { + return false; + } + } else { + $notification->displayNotification("error", sprintf(i18n("%s is not writable"), $path.$filename)); + exit; + } +} + + +/** + * Reads content of file into memory using binary mode and returns it back. + * + * Exits the script, if file could not opened! + * + * @param string $filename The file to get the content + * @param string $path Path to the file + * @return (string|void) Either content of file o nothing + */ +function getFileContent($filename, $path) { + global $notification; + + // FIXME: Should be replaced against file_get_contents($path . $filename, FILE_BINARY) + + if (!$handle = fopen($path.$filename, "rb")) { + $notification->displayNotification("error", sprintf(i18n("Can not open file%s "), $path.$filename)); + exit; + } + + do { + $_data = fread($handle, 4096); + if (strlen($_data) == 0) { + break; + } + $sFileContents .= $_data; + } while(true); + + fclose($handle); + return $sFileContents; +} + + +/** + * Returns the filetype (extension). + * + * @param string $filename The file to get the type + * @return string Filetype + */ +function getFileType($filename) { + $aFileName = explode(".", $filename); + return $aFileName[count($aFileName) - 1]; +} + + +/** + * Creates a file. + * + * Exits the script, if filename is not valid or creation (touch or chmod) fails! + * + * @param string $filename The file to create + * @param string $path Path to the file + * @return (void|bool) Either true on success or nothing + */ +function createFile($filename, $path) { + global $notification; + + fileValidateFilename($filename, true); + + # create the file + if (touch($path.$filename)) { + # change file access permission + if(chmod ($path.$filename, 0777)) { + return true; + } else { + $notification->displayNotification("error", $path.$filename." ".i18n("Unable to change file access permission.")); + exit; + } + } else { + $notification->displayNotification("error", sprintf(i18n("Unable to create file %s"), $path.$filename)); + exit; + } +} + + +/** + * Renames a existing file. + * + * Exits the script, if new filename is not valid or renaming fails! + * + * @param string $sOldFile Old filename + * @param string $sNewFile New filename + * @param string $path Path to the file + * @return (void|string) Either new filename or nothing + */ +function renameFile($sOldFile, $sNewFile, $path) { + global $notification; + + fileValidateFilename($sNewFile, true); + + if (is_writable($path.$sOldFile)) { + # rename file + if (rename($path.$sOldFile, $path.$sNewFile)) { + return $sNewFile; + } else { + $notification->displayNotification("error", sprintf(i18n("Can not rename file %s"),$path.$sOldFile)); + exit; + } + } else { + $notification->displayNotification("error", sprintf(i18n("%s is not writable"), $path.$sOldFile)); + exit; + } +} + + +/** + * Validates passed filename. Filename can contain alphanumeric characters, dot, underscore or a hyphen. + * + * Exits the script, if second parameter is set to true and validation fails! + * + * @param string $filename The filename to validate + * @param bool $notifyAndExitOnFailure Flag to display notification and to exit further script + * execution, ifd validation fails + * @return (void|bool) Either validation result or nothing (depends on second parameter) + */ +function fileValidateFilename($filename, $notifyAndExitOnFailure = true) { + global $notification; + + if (preg_match('/[^a-z0-9._-]/i', $filename)) { + // validation failure... + if ($notifyAndExitOnFailure == true) { + // display notification and exit + $notification->displayNotification('error', i18n('Wrong filename.')); + exit; + } + return false; + } + return true; +} + +?> \ No newline at end of file diff --git a/conlite/includes/functions.forms.php b/conlite/includes/functions.forms.php new file mode 100644 index 0000000..cd6df11 --- /dev/null +++ b/conlite/includes/functions.forms.php @@ -0,0 +1,98 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-20 + * modified 2008-06-26, Frederic Schneider, add security fix + * + * $Id: functions.forms.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Generates textial Input Form elements + * + * @param $type Either "text", "password" or "textbox" + * @param $name Name of the field + * @param $initvalue Init value of the field + * @param $size Size of the field + * @param $maxlen Maximum length of the field + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return Generated field code + * + */ +function formGenerateField ($type, $name, $initvalue, $width, $maxlen) +{ + switch ($type) + { + case "text": + return (''); + break; + case "password": + return (''); + break; + case "textbox": + return (''); + break; + default: + return(''); + break; + } + + +} + +/** + * Generates check box elements + * + * @param $name Name of the checkbox + * @param $value Value of the checkbox + * @param $checked Initially checked? + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return Generated field code + * + */ +function formGenerateCheckbox ($name, $value, $checked, $caption = "") +{ + if (strlen($caption) > 0) + { + $label = ''; + } else { + $label = ""; + } + + if ($checked) { + return(''.$label); + } else { + return(''.$label); + } + +} +?> \ No newline at end of file diff --git a/conlite/includes/functions.general.php b/conlite/includes/functions.general.php new file mode 100644 index 0000000..2a1caa4 --- /dev/null +++ b/conlite/includes/functions.general.php @@ -0,0 +1,2205 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: functions.general.php 378 2015-11-09 20:01:25Z oldperl $: + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Extracts the available content-types from the database + * + * Creates an array $a_content[type][number] = content string + * f.e. $a_content['CMS_HTML'][1] = content string + * Same for array $a_description + * + * @param int $idartlang Language specific ID of the arcticle + * @return void + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function getAvailableContentTypes($idartlang) { + global $db, $cfg, $a_content, $a_description; + + $sql = "SELECT + * + FROM + " . $cfg["tab"]["content"] . " AS a, + " . $cfg["tab"]["art_lang"] . " AS b, + " . $cfg["tab"]["type"] . " AS c + WHERE + a.idtype = c.idtype AND + a.idartlang = b.idartlang AND + b.idartlang = '" . Contenido_Security::toInteger($idartlang) . "'"; + + $db->query($sql); + + while ($db->next_record()) { + $a_content[$db->f("type")][$db->f("typeid")] = urldecode($db->f("value")); + $a_description[$db->f("type")][$db->f("typeid")] = i18n($db->f("description")); + } +} + +/** + * Checks if an article is assigned to multiple categories + * + * @param int $idart Article-Id + * @return bool Article assigned to multiple categories + */ +function isArtInMultipleUse($idart) { + global $cfg, $client; + + $db = new DB_ConLite; + $sql = "SELECT idart FROM " . $cfg["tab"]["cat_art"] . " WHERE idart = '" . Contenido_Security::toInteger($idart) . "'"; + $db->query($sql); + + return ($db->affected_rows() > 1); +} + +/** + * Checks if a value is alphanumeric + * + * @param mixed $test Value to test + * @param bool $umlauts [Use german Umlaute] Optional + * @return bool Value is alphanumeric + */ +function is_alphanumeric($test, $umlauts = true) { + + if ($umlauts == true) { + $match = "/^[a-z0-9������� ]+$/i"; + } else { + $match = "/^[a-z0-9 ]+$/i"; + } + + return (preg_match($match, $test)); +} + +/** + * Returns multi-language month name (canonical) by its numeric value + * + * @param int $month + * @return string + */ +function getCanonicalMonth($month) { + switch ($month) { + case 1 : + return (i18n("January")); + break; + case 2 : + return (i18n("February")); + break; + case 3 : + return (i18n("March")); + break; + case 4 : + return (i18n("April")); + break; + case 5 : + return (i18n("May")); + break; + case 6 : + return (i18n("June")); + break; + case 7 : + return (i18n("July")); + break; + case 8 : + return (i18n("August")); + break; + case 9 : + return (i18n("September")); + break; + case 10 : + return (i18n("October")); + break; + case 11 : + return (i18n("November")); + break; + case 12 : + return (i18n("December")); + break; + } +} + +/** + * Get multi-language day + * + * @param int $iDay The day number of date(w) + * @return string Dayname of current language + */ +function getCanonicalDay($iDay) { + switch ($iDay) { + case 1 : + return (i18n("Monday")); + break; + case 2 : + return (i18n("Tuesday")); + break; + case 3 : + return (i18n("Wednesday")); + break; + case 4 : + return (i18n("Thursday")); + break; + case 5 : + return (i18n("Friday")); + break; + case 6 : + return (i18n("Saterday")); + break; + case 0 : + return (i18n("Sunday")); + break; + default: break; + } +} + +/** + * Returns the id of passed area + * + * @param mixed $area Area name + * @return int + */ +function getIDForArea($area) { + global $client, $lang, $cfg, $sess; + + $db = new DB_ConLite; + + if (!is_numeric($area)) { + $sql = "SELECT + idarea + FROM + " . $cfg["tab"]["area"] . " + WHERE + name = '" . Contenido_Security::escapeDB($area, $db) . "'"; + + $db->query($sql); + if ($db->next_record()) { + $area = $db->f(0); + } + } + + return $area; +} + +/** + * Returns the parent id of passed area + * + * @param mixed $area + * @return int + */ +function getParentAreaId($area) { + global $client, $lang, $cfg, $sess; + + $db = new DB_ConLite; + + if (is_numeric($area)) { + $sql = "SELECT + b.name + FROM + " . $cfg["tab"]["area"] . " AS a, + " . $cfg["tab"]["area"] . " AS b + WHERE + a.idarea = '" . Contenido_Security::toInteger($area) . "' AND + b.name = a.parent_id"; + } else { + $sql = "SELECT + b.name + FROM + " . $cfg["tab"]["area"] . " AS a, + " . $cfg["tab"]["area"] . " AS b + WHERE + a.name = '" . Contenido_Security::escapeDB($area, $db) . "' AND + b.name = a.parent_id"; + } + $db->query($sql); + + if ($db->next_record()) { + return $db->f(0); + } else { + return $area; + } +} + +/** + * Write JavaScript to mark + * + * @param int $menuitem Which menuitem to mark + * @param bool $return Return or echo script + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function markSubMenuItem($menuitem, $return = false) { + $str = ''; + + if ($return) { + return $str; + } else { + echo $str; + } +} + +/** + * Redirect to main area + * + * @param bool $send Redirect Yes/No + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function backToMainArea($send) { + if ($send) { + /* Global vars */ + global $area, $cfg, $db, $sess, $idart, $idcat, $idartlang, $idcatart, $frame; + + /* Get main area */ + $sql = "SELECT + a.name + FROM + " . $cfg["tab"]["area"] . " AS a, + " . $cfg["tab"]["area"] . " AS b + WHERE + b.name = '" . Contenido_Security::escapeDB($area, $db) . "' AND + b.parent_id = a.name"; + + $db->query($sql); + $db->next_record(); + + $parent = $db->f("name"); + + /* Create url string */ + $url_str = 'main.php?' . 'area=' . $parent . '&' . 'idcat=' . $idcat . '&' . 'idart=' . $idart . '&' . 'idartlang=' . $idartlang . '&' . 'idcatart=' . $idcatart . '&' . 'force=1&' . 'frame=' . $frame; + + $url = $sess->url($url_str); + + /* Redirect */ + header("location: $url"); + } +} + +function showLocation($area) { + global $db; + global $cfgPath, $lngArea; + global $cfg; + global $belang; + + //Create new xml Class and load the file + + $xml = new XML_doc; + if ($xml->load($cfg['path']['xml'] . $cfg['lang'][$belang]) == false) { + if ($xml->load($cfg['path']['xml'] . 'lang_en_US.xml') == false) { + die("Unable to load any XML language file"); + } + } + + $sql = "SELECT location + FROM " . $cfg["tab"]["area"] . " as A, " . $cfg["tab"]["nav_sub"] . " as B + Where A.name='" . Contenido_Security::escapeDB($area, $db) . "' AND A.idarea=B.idarea AND A.online='1'"; + + $db->query($sql); + if ($db->next_record()) { + + echo "" . $xml->valueOf($db->f("location")) . ""; + } else { + + $sql = "SELECT parent_id + FROM " . $cfg["tab"]["area"] . " + WHERE name='" . Contenido_Security::escapeDB($area, $db) . "' AND online='1'"; + $db->query($sql); + $db->next_record(); + $parent = $db->f("parent_id"); + + $sql = "SELECT location + FROM " . $cfg["tab"]["area"] . " as A, " . $cfg["tab"]["nav_sub"] . " as B + Where A.name='" . Contenido_Security::escapeDB($parent, $db) . "' AND A.idarea = B.idarea AND A.online='1'"; + + $db->query($sql); + $db->next_record(); + echo "" . $xml->valueOf($db->f("location")) . $lngArea[$area] . ""; + } +} + +function showTable($tablename) { + global $db; + + $sql = "SELECT * FROM $tablename"; + $db->query($sql); + while ($db->next_record()) { + while (list ($key, $value) = each($db->Record)) { + print (is_string($key) ? "$key: $value | " : ""); + } + print ("
"); + } +} + +/** + * Get languages for given client + * + * @deprecated since ConLite version 2.0.0, use method in class cApiLanguageCollection instead + * + * @param int $client + * @return array Array of language ids + */ +function getLanguagesByClient($client) { + $oClLangs = new cApiLanguageCollection(); + return $oClLangs->getClientLanguages($client); +} + +/** + * Returns all languages (language ids and names) of an client + * + * @param int $client + * @return array List of languages where the key is the language id and value the language name + */ +function getLanguageNamesByClient($client) { + global $db; + global $cfg; + + $sql = "SELECT + a.idlang AS idlang, + b.name AS name + FROM + " . $cfg["tab"]["clients_lang"] . " AS a, + " . $cfg["tab"]["lang"] . " AS b + WHERE + idclient='" . Contenido_Security::toInteger($client) . "' AND + a.idlang = b.idlang + ORDER BY + idlang ASC"; + + $db->query($sql); + while ($db->next_record()) { + $list[$db->f("idlang")] = $db->f("name"); + } + + return $list; +} + +function set_magic_quotes_gpc(&$code) { + global $cfg; + + if (!$cfg['simulate_magic_quotes']) { + if (get_magic_quotes_gpc() == 0) { + $code = addslashes($code); + } + } +} + +/** + * Returns a list with all clients and languages. + * + * @return array Indexed array where the value is an assoziative array as follows: + * - $arr[0]['idlang'] + * - $arr[0]['langname'] + * - $arr[0]['idclient'] + * - $arr[0]['clientname'] + */ +function getAllClientsAndLanguages() { + global $db, $cfg; + + $sql = "SELECT + a.idlang as idlang, + a.name as langname, + b.name as clientname, + b.idclient as idclient + FROM + " . $cfg["tab"]["lang"] . " as a, + " . $cfg["tab"]["clients_lang"] . " as c, + " . $cfg["tab"]["clients"] . " as b + WHERE + a.idlang = c.idlang AND + c.idclient = b.idclient"; + $db->query($sql); + + $aRs = array(); + while ($db->next_record()) { + $aRs[] = array( + 'idlang' => $db->f('idlang'), + 'langname' => $db->f('langname'), + 'idclient' => $db->f('idclient'), + 'clientname' => $db->f('clientname'), + ); + } + return $aRs; +} + +function fakeheader($time) { + global $con_time0; + if (!isset($con_time0)) { + $con_time0 = $time; + } + + if ($time >= $con_time0 + 1000) { + $con_time0 = $time; + header('X-pmaPing: Pong'); + } // end if +} + +function recursive_copy($from_path, $to_path) { + $oldumask = umask(0); + if (mkdir($to_path, 0777)) { + umask($oldumask); + $old_path = getcwd(); + $this_path = getcwd(); + if (is_dir($from_path)) { + chdir($from_path); + $myhandle = opendir('.'); + + while (($myfile = readdir($myhandle)) !== false) { + if (($myfile != ".") && ($myfile != "..")) { + if (is_dir($myfile)) { + recursive_copy($from_path . $myfile . "/", $to_path . $myfile . "/"); + chdir($from_path); + } else if (file_exists($myfile)) { + copy($from_path . $myfile, $to_path . $myfile); + } + } + } + closedir($myhandle); + } + chdir($old_path); + return true; + } else { + umask($oldumask); + return false; + } +} + +function getmicrotime() { + list ($usec, $sec) = explode(" ", microtime()); + return ((float) $usec + (float) $sec); +} + +/* Small hack to clean up unused sessions. + As we are probably soon rewriting the + session management, this hack is OK. */ + +function cleanupSessions() { + global $cfg; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + $col = new InUseCollection; + + $temp = new Contenido_Challenge_Crypt_Auth; + + $maxdate = date("YmdHis", time() - ($temp->lifetime * 60)); + + /* Expire old sessions */ + $sql = "SELECT changed, sid FROM " . $cfg["tab"]["phplib_active_sessions"]; + $db->query($sql); + + while ($db->next_record()) { + if ($db->f("changed") < $maxdate) { + $sql = "DELETE FROM " . $cfg["tab"]["phplib_active_sessions"] . " WHERE sid = '" . Contenido_Security::escapeDB($db->f("sid"), $db2) . "'"; + $db2->query($sql); + $col->removeSessionMarks($db->f("sid")); + } + } + + /* Expire invalid InUse-Entries */ + $col->select(); + + while ($c = $col->next()) { + $sql = "SELECT sid FROM " . $cfg["tab"]["phplib_active_sessions"] . " WHERE sid = '" . Contenido_Security::escapeDB($c->get("session"), $db2) . "'"; + $db2->query($sql); + if (!$db2->next_record()) { + $col->delete($c->get("idinuse")); + } + } +} + +function isGroup($uid) { + $users = new User; + + if ($users->loadUserByUserID($uid) == false) { + return true; + } else { + return false; + } +} + +function getGroupOrUserName($uid) { + $users = new User; + + if ($users->loadUserByUserID($uid) === false) { + $groups = new Group; + /* Yes, it's a group. Let's try to load the group members! */ + if ($groups->loadGroupByGroupID($uid) === false) { + return false; + } else { + return substr($groups->getField("groupname"), 4); + } + } else { + return $users->getField("realname"); + } +} + +/** + * getPhpModuleInfo - parses phpinfo() output + * + * parses phpinfo() output + * (1) get informations for a specific module (parameter $modulname) + * (2) get informations for all modules (no parameter for $modulname needed) + * + * if a specified extension doesn't exists or isn't activated an array will be returned: + * Array + * ( + * [error] => extension is not available + * ) + * + * + * to get specified information on one module use (1): + * getPhpModuleInfo($moduleName = 'gd'); + * + * to get all informations use (2): + * getPhpModuleInfo($moduleName); + * + * + * EXAMPLE OUTPUT (1): + * Array + * ( + * [GD Support] => Array + * ( + * [0] => enabled + * ) + * ... + * ) + * + * + * EXAMPLE OUTPUT (2): + * Array + * ( + * [yp] => Array + * ( + * [YP Support] => Array + * ( + * [0] => enabled + * ) + * + * ) + * ... + * } + * + * foreach ($moduleSettings as $setting => $value) + * $setting contains the modul settings + * $value contains the settings as an array ($value[0] => Local Value && $value[1] => Master Value) + * + * @param $modulName string specify modul name or if not get all settings + * + * @return array see above for example + * @author Marco Jahn + */ +function getPhpModuleInfo($moduleName) { + $moduleSettings = array(); + ob_start(); + phpinfo(INFO_MODULES); // get information vor modules + $string = ob_get_contents(); + ob_end_clean(); + + $pieces = explode("]*)\">/", $val, $sub_key); + + // perform a regular expression match on tabs with 2 columns + preg_match_all("/]*> + ]*>(.*)<\/td> + ]*>(.*)<\/td>/Ux", $val, $sub); + + // perform a regular expression match on tabs with 3 columns + preg_match_all("/]*> + ]*>(.*)<\/td> + ]*>(.*)<\/td> + ]*>(.*)<\/td>/Ux", $val, $sub_ext); + + if (isset($moduleName)) { // if $moduleName is specified + if (extension_loaded($moduleName)) { //check if specified extension exists or is loaded + if ($sub_key[1] == $moduleName) { //create array only for specified $moduleName + foreach ($sub[0] as $key => $val) { + $moduleSettings[strip_tags($sub[1][$key])] = array(strip_tags($sub[2][$key])); + } + } + } else { //specified extension is not loaded or doesn't exists + $moduleSettings['error'] = 'extension is not available'; + } + } else { // $moduleName isn't specified => get everything + foreach ($sub[0] as $key => $val) { + $moduleSettings[$sub_key[1]][strip_tags($sub[1][$key])] = array(strip_tags($sub[2][$key])); + } + + foreach ($sub_ext[0] as $key => $val) { + $moduleSettings[$sub_key[1]][strip_tags($sub_ext[1][$key])] = array(strip_tags($sub_ext[2][$key]), strip_tags($sub_ext[3][$key])); + } + } + } + return $moduleSettings; +} + +function isValidMail($sEMail, $bStrict = false) { + if ($bStrict) { + // HerrB (14.02.2008), code posted by Calvini + // See http://www.contenido.org/forum/viewtopic.php?p=106612#106612 + // Note, that IDNs are currently only supported if given as punycode + // "Strict" just means "95% real-world match", + // e.g. a.b@c.de, a-b@c.de, a_b@c.de and some special chars (not \n, ;) + // See also http://www.php.net/manual/en/function.eregi.php#52458, + // but note http://www.php.net/manual/en/function.eregi.php#55215 + // or just kill yourself, as being dumb to even try to validate an + // email address: http://www.php.net/manual/en/function.preg-match.php#76615 + + $sLocalChar = '-a-z0-9_!#\\$&\'\\*\\+\\/=\\?\\^`\\{\\|\\}~'; + $sLocalRegEx = '[' . $sLocalChar . '](\\.*[' . $sLocalChar . '])*'; + $sDomainChar = 'a-z���'; + $sDomainRegEx = $sDomainRegEx = '(([' . $sDomainChar . ']|[' . $sDomainChar . '][' . $sDomainChar . '0-9-]{0,61}[' . $sDomainChar . '0-9])\\.)+'; + $sTLDChar = 'a-z'; + $sTLDRegEx = '[' . $sTLDChar . ']{2,}'; + return preg_match('/^' . $sLocalRegEx . '@' . $sDomainRegEx . $sTLDRegEx . '$/i', $sEMail); + } else { + return preg_match("/^[0-9a-z]([-_.]*[0-9a-z]*)*@[a-z0-9-]+\.([a-z])/i", $sEMail); + } +} + +function htmldecode($string) { + $trans_tbl = clGetHtmlTranslationTable(HTML_ENTITIES); + $trans_tbl = array_flip($trans_tbl); + $ret = strtr($string, $trans_tbl); + + return $ret; +} + +/** + * build or rebuild array $cfgClient + * + * @global array $cfgClient + * @global int $errsite_idcat + * @global int $errsite_idart + * @global DB_ConLite $db + * @global array $cfg + */ +function rereadClients() { + global $cfgClient; + global $errsite_idcat; + global $errsite_idart; + global $db; + global $cfg; + + if (!is_object($db)) { + $db = new DB_ConLite(); + } + + if (!is_array($cfgClient)) { + $cfgClient = array(); + } + + $sql = "SELECT + idclient, + frontendpath, + htmlpath, + errsite_cat, + errsite_art + FROM + " . $cfg["tab"]["clients"]; + + $db->query($sql); + + if ($db->affected_rows() <= 0) { + return; + } + while ($db->next_record()) { + $cfgClient["set"] = "set"; + $cfgClient[$db->f("idclient")]["path"]["frontend"] = $db->f("frontendpath"); + $cfgClient[$db->f("idclient")]["path"]["htmlpath"] = $db->f("htmlpath"); + $errsite_idcat[$db->f("idclient")] = $db->f("errsite_cat"); + $errsite_idart[$db->f("idclient")] = $db->f("errsite_art"); + + $cfgClient[$db->f("idclient")]["images"] = $db->f("htmlpath") . "images/"; + $cfgClient[$db->f("idclient")]["upload"] = "upload/"; + + $cfgClient[$db->f("idclient")]["htmlpath"]["frontend"] = $cfgClient[$db->f("idclient")]["path"]["htmlpath"]; + $cfgClient[$db->f("idclient")]["upl"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "upload/"; + $cfgClient[$db->f("idclient")]["upl"]["htmlpath"] = $cfgClient[$db->f("idclient")]["htmlpath"]["frontend"] . "upload/"; + $cfgClient[$db->f("idclient")]["upl"]["frontendpath"] = "upload/"; + $cfgClient[$db->f("idclient")]["css"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "css/"; + $cfgClient[$db->f("idclient")]["js"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "js/"; + $cfgClient[$db->f("idclient")]["tpl"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "templates/"; + } +} + +/** + * Sets a system property entry + * + * @modified Timo Trautmann 22.02.2008 Support for editing name and type + * + * @param string $type The type of the item + * @param string $name The name of the item + * @param string $value The value of the item + * @param int $idsystemprop The sysprop id, use optional. If set it allows to modify type name and value + */ +function setSystemProperty($type, $name, $value, $idsystemprop = 0) { + global $cfg; + if ($type == "" || $name == "") { + return false; + } + + $idsystemprop = Contenido_Security::toInteger($idsystemprop); + + $db_systemprop = new DB_ConLite; + + if ($idsystemprop == 0) { + $sql = "SELECT idsystemprop FROM " . $cfg["tab"]["system_prop"] . " WHERE type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "' AND name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "'"; + } else { + $sql = "SELECT idsystemprop FROM " . $cfg["tab"]["system_prop"] . " WHERE idsystemprop='$idsystemprop'"; + } + + $db_systemprop->query($sql); + + if ($db_systemprop->num_rows() > 0) { + if ($idsystemprop == 0) { + $sql = "UPDATE " . $cfg["tab"]["system_prop"] . " SET value='" . Contenido_Security::filter($value, $db_systemprop) . "' WHERE type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "' + AND name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "'"; + } else { + $sql = "UPDATE " . $cfg["tab"]["system_prop"] . " SET value='" . Contenido_Security::filter($value, $db_systemprop) . "', type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "', + name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "' WHERE idsystemprop='$idsystemprop'"; + } + } else { + $idsystemprop = $db_systemprop->nextid($cfg["tab"]["system_prop"]); + $sql = "INSERT INTO " . $cfg["tab"]["system_prop"] . " (idsystemprop, value, type, name) VALUES ('$idsystemprop', '" . Contenido_Security::filter($value, $db_systemprop) . "', + '" . Contenido_Security::escapeDB($type, $db_systemprop) . "', '" . Contenido_Security::escapeDB($name, $db_systemprop) . "')"; + } + + $db_systemprop->query($sql); +} + +/** + * Remove a system property entry + * + * @param string $type The type of the item + * @param string $name The name of the item + */ +function deleteSystemProperty($type, $name) { + global $cfg; + + $db_systemprop = new DB_ConLite; + + $sql = "DELETE FROM " . $cfg["tab"]["system_prop"] . " WHERE type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "' AND name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "'"; + $db_systemprop->query($sql); +} + +/** + * Retrieves all available system properties. + * Array format: + * + * $array[$type][$name] = $value; + * + * @modified Timo Trautmann 22.02.2008 Support for editing name and type editing by primaray key idsystemprop + * if bGetPropId is set: + * $array[$type][$name][value] = $value; + * $array[$type][$name][idsystemprop] = $idsystemprop; + * + * @param boolean bGetPropId - if true special mode is activated which generates for each property a third array, which also contains idsystemprop value + * @return array + */ +function getSystemProperties($bGetPropId = 0) { + global $cfg; + + $db_systemprop = new DB_ConLite; + + $sql = "SELECT idsystemprop, type, name, value FROM " . $cfg["tab"]["system_prop"] . " ORDER BY type ASC, name ASC, value ASC"; + $db_systemprop->query($sql); + $results = array(); + + if ($bGetPropId) { + while ($db_systemprop->next_record()) { + $results[$db_systemprop->f("type")][$db_systemprop->f("name")]['value'] = urldecode($db_systemprop->f("value")); + $results[$db_systemprop->f("type")][$db_systemprop->f("name")]['idsystemprop'] = urldecode($db_systemprop->f("idsystemprop")); + } + } else { + while ($db_systemprop->next_record()) { + $results[$db_systemprop->f("type")][$db_systemprop->f("name")] = urldecode($db_systemprop->f("value")); + } + } + + return ($results); +} + +/** + * Gets a system property entry + * + * @param string $type The type of the item + * @param string $name The name of the item + * @return mixed boolean false if nothing was found, or + */ +function getSystemProperty($sType, $sName) { + + $oProperties = new cApiSystemPropertyCollection(); + return $oProperties->getSystemProperty($sType, $sName); + + + /* + global $cfg; + + $db_systemprop = new DB_ConLite; + + $sql = "SELECT value FROM ".$cfg["tab"]["system_prop"]." WHERE type='".Contenido_Security::escapeDB($type, $db_systemprop)."' AND name='".Contenido_Security::escapeDB($name, $db_systemprop)."'"; + $db_systemprop->query($sql); + + if ($db_systemprop->next_record()) + { + return urldecode($db_systemprop->f("value")); + } else + { + return false; + } */ +} + +/** + * Gets system property entries + * + * @param string $type The type of the item + * @return array Value + */ +function getSystemPropertiesByType($sType) { + global $cfg; + + $aResult = array(); + + $db_systemprop = new DB_ConLite; + + $sSQL = "SELECT name, value FROM " . $cfg["tab"]["system_prop"] . " WHERE type='" . Contenido_Security::escapeDB($sType, $db_systemprop) . "' ORDER BY name"; + $db_systemprop->query($sSQL); + + while ($db_systemprop->next_record()) { + $aResult[$db_systemprop->f("name")] = urldecode($db_systemprop->f("value")); + } + + return $aResult; +} + +/** + * Returns the current effective setting for a property. + * + * The order is: + * System => Client => Group => User + * + * System properties can be overridden by the group, and group + * properties can be overridden by the user. + * + * @param string $type The type of the item + * @param string $name The name of the item + * @param string $default Optional default value + * @return mixed boolean false if nothing was found + */ +function getEffectiveSetting($type, $name, $default = "") { + global $auth, $client, $lang; + + if ($auth->auth["uid"] != "nobody") { + $user = new User; + $user->loadUserByUserID($auth->auth["uid"]); + $value = $user->getUserProperty($type, $name, true); + unset($user); + } else { + $value = false; + } + + if ($value == false) { + $oClient = new cApiClientLanguage(false, $client, $lang); + $value = $oClient->getProperty($type, $name); + unset($oClient); + } + + if ($value == false) { + $oClient = new cApiClient($client); + $value = $oClient->getProperty($type, $name); + unset($oClient); + } + + if ($value == false) { + $value = getSystemProperty($type, $name); + } + + if ($value === false) { + return $default; + } else { + return $value; + } +} + +/** + * Returns the current effective settings for a type of properties. + * + * The order is: + * System => Client => Group => User + * + * System properties can be overridden by the group, and group + * properties can be overridden by the user. + * + * You may use default array to preset settings, this will not override found settings + * + * @version $Rev: 378 $ + * @author Ortwin Pinke + * + * @global object $auth + * @global int $client + * @global array $cfg + * @global int $lang + * @param string $sType + * @param array $aDefault + * @return array + */ +function getEffectiveSettingsByType($sType, $aDefault = array()) { + global $auth, $client, $cfg, $lang; + + $aResult = getSystemPropertiesByType($sType); + + $oClient = new cApiClient($client); + $aResult = array_merge($aResult, $oClient->getPropertiesByType($sType)); + unset($oClient); + + $oClient = new cApiClientLanguage(false, $client, $lang); + $aResult = array_merge($aResult, $oClient->getPropertiesByType($sType)); + + unset($oClient); + + if ($auth->auth["uid"] != "nobody") { + $oUser = new User; + $oUser->loadUserByUserID($auth->auth["uid"]); + + $aResult = array_merge($aResult, $oUser->getUserPropertiesByType($sType, true)); + } + + if (is_array($aDefault) && count($aDefault) > 0) { + foreach ($aDefault as $sKey => $sValue) { + if (key_exists($sKey, $aResult)) + continue; + $aResult[$sKey] = $sValue; + } + } + + return $aResult; +} + +/** + * retrieve list of article specifications for current client and language + * + * @return array list of article specifications + */ +function getArtspec() { + global $db, $cfg, $lang, $client; + $sql = "SELECT artspec, idartspec, online, artspecdefault FROM " . $cfg['tab']['art_spec'] . " + WHERE client='" . Contenido_Security::toInteger($client) . "' AND lang='" . Contenido_Security::toInteger($lang) . "' ORDER BY artspec ASC"; + $db->query($sql); + + $artspec = array(); + + while ($db->next_record()) { + $artspec[$db->f("idartspec")]['artspec'] = $db->f("artspec"); + $artspec[$db->f("idartspec")]['online'] = $db->f("online"); + $artspec[$db->f("idartspec")]['default'] = $db->f("artspecdefault"); + } + return $artspec; +} + +/** + * add new article specification + * + * @param string article specification text + * + * @return void + */ +function addArtspec($artspectext, $online) { + global $db, $cfg, $lang, $client; + + if (isset($_POST['idartspec'])) { //update + $sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET + artspec='" . Contenido_Security::escapeDB(urldecode($artspectext), $db) . "', + online='" . Contenido_Security::toInteger($online) . "' + WHERE idartspec=" . Contenido_Security::toInteger($_POST['idartspec']) . ""; + $db->query($sql); + } else { + $sql = "INSERT INTO " . $cfg['tab']['art_spec'] . " + (idartspec, client, lang, artspec, online, artspecdefault) + VALUES + (" . Contenido_Security::toInteger($db->nextid($cfg['tab']['art_spec'])) . ", '" . Contenido_Security::toInteger($client) . "', '" . Contenido_Security::toInteger($lang) . "', + '" . Contenido_Security::escapeDB(urldecode($artspectext), $db) . "', 0, 0)"; + $db->query($sql); + } +} + +/** + * delete specified article specification + * + * @param integer article specification id + * + * @return void + */ +function deleteArtspec($idartspec) { + global $db, $cfg; + $sql = "DELETE FROM " . $cfg['tab']['art_spec'] . " WHERE idartspec = '" . Contenido_Security::toInteger($idartspec) . "'"; + $db->query($sql); + + $sql = "UPDATE " . $cfg["tab"]["art_lang"] . " set artspec = '0' WHERE artspec = '" . Contenido_Security::toInteger($idartspec) . "'"; + $db->query($sql); +} + +/** + * set article specifications online + * + * flag to switch if an article specification should be shown the frontend or not + * + * @param integer article specification id + * @param integer 0/1 switch the status between on an offline + * + * @return void + */ +function setArtspecOnline($idartspec, $online) { + global $db, $cfg; + $sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET online=" . Contenido_Security::toInteger($online) . " WHERE idartspec=" . Contenido_Security::toInteger($idartspec) . ""; + $db->query($sql); +} + +/** + * set a default article specification + * + * while creating a new article this defined article specification will be default setting + * + * @param integer article specification id + * + * @return void + */ +function setArtspecDefault($idartspec) { + global $db, $cfg, $lang, $client; + $sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET artspecdefault=0 WHERE client='" . Contenido_Security::toInteger($client) . "' AND lang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + $sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET artspecdefault=1 WHERE idartspec='" . Contenido_Security::toInteger($idartspec) . "'"; + $db->query($sql); +} + +/** + * Build a Article select Box + * + * @param String Name of the SelectBox + * @param String Value of the SelectBox + * @return String HTML + */ +function buildArticleSelect($sName, $iIdCat, $sValue) { + global $cfg, $client, $lang, $idcat; + $db = new DB_ConLite; + + $html = ''; + $html .= ''; + + return $html; +} + +/** + * Build a Category / Article select Box + * + * @param String Name of the SelectBox + * @param String Value of the SelectBox + * @param Integer Value of highest level that should be shown + * @param String Optional style informations for select + * @return String HTML + */ +function buildCategorySelect($sName, $sValue, $sLevel = 0, $sStyle = "") { + global $cfg, $client, $lang, $idcat; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + $html = ''; + $html .= ''; + + return $html; +} + +/** + * getFileExtension + * Returns the file extension of a given file + * + * @param string $filename Name of the file + * @return extension on success, false if no extension could be extracted. + */ +function getFileExtension($filename) { + $dotposition = strrpos($filename, "."); + + if ($dotposition !== false) { + return (strtolower(substr($filename, $dotposition + 1))); + } else { + return false; + } +} + +function human_readable_size($number) { + $base = 1024; + $suffixes = array(" B", " KB", " MB", " GB", " TB", " PB", " EB"); + + $usesuf = 0; + $n = (float) $number; //Appears to be necessary to avoid rounding + while ($n >= $base) { + $n /= (float) $base; + $usesuf ++; + } + + $places = 2 - floor(log10($n)); + $places = max($places, 0); + $retval = number_format($n, $places, ".", "") . $suffixes[$usesuf]; + return $retval; +} + +/** + * Trims an array + * + * @param array Array to trim + * @return array Trimmed array + */ +function trim_array($array) { + if (!is_array($array)) { + return $array; + } + + foreach ($array as $key => $value) { + $array[$key] = trim($value); + } + + return $array; +} + +function array_csort() { //coded by Ichier2003 + $args = func_get_args(); + $marray = array_shift($args); + $msortline = "return(array_multisort("; + $i = 0; + foreach ($args as $arg) { + $i ++; + if (is_string($arg)) { + foreach ($marray as $row) { + $a = strtoupper($row[$arg]); + $sortarr[$i][] = $a; + } + } else { + $sortarr[$i] = $arg; + } + $msortline .= "\$sortarr[" . $i . "],"; + } + $msortline .= "\$marray));"; + @ eval($msortline); + return $marray; +} + +/** + * str_ireplace_once - Replaces a string only once + * + * Caution: This function only takes strings as parameters, + * not arrays! + * @param $find string String to find + * @param $replace string String to replace + * @param $subject string String to process + * + * @return string Processed string + */ +function str_ireplace_once($find, $replace, $subject) { + $start = strpos(strtolower($subject), strtolower($find)); + + if ($start === false) { + return $subject; + } + + $end = $start + strlen($find); + + $first = substr($subject, 0, $start); + $last = substr($subject, $end, strlen($subject) - $end); + + $result = $first . $replace . $last; + + return ($result); +} + +/** + * str_ireplace_once_reverse - Replaces a string only once, in reverse direction + * + * Caution: This function only takes strings as parameters, + * not arrays! + * @param $find string String to find + * @param $replace string String to replace + * @param $subject string String to process + * + * @return string Processed string + */ +function str_ireplace_once_reverse($find, $replace, $subject) { + $start = str_rpos(strtolower($subject), strtolower($find)); + + if ($start === false) { + return $subject; + } + + $end = $start + strlen($find); + + $first = substr($subject, 0, $start); + $last = substr($subject, $end, strlen($subject) - $end); + + $result = $first . $replace . $last; + + return ($result); +} + +/** + * str_rpos - Finds a string position in reverse direction + * + * NOTE: The original strrpos-Function of PHP4 only finds + * a single character as needle. + * + * @param $haystack string String to search in + * @param $needle string String to search for + * @param $start integer Offset + * + * @return string Processed string + */ +function str_rpos($haystack, $needle, $start = 0) { + $tempPos = strpos($haystack, $needle, $start); + + if ($tempPos === false) { + if ($start == 0) { + //Needle not in string at all + return false; + } else { + //No more occurances found + return $start - strlen($needle); + } + } else { + //Find the next occurance + return str_rpos($haystack, $needle, $tempPos + strlen($needle)); + } +} + +/** + * isImageMagickAvailable - checks if ImageMagick is available + * + * @return boolean true if ImageMagick is available + */ +function isImageMagickAvailable() { + global $_imagemagickAvailable; + + if (is_bool($_imagemagickAvailable)) { + if ($_imagemagickAvailable === true) { + return true; + } else { + return false; + } + } + + $output = array(); + $retval = 0; + + @exec("convert", $output, $retval); + + if (!is_array($output) || count($output) == 0) { + return false; + } + + if (strpos($output[0], "ImageMagick") !== false) { + $_imagemagickAvailable = true; + return true; + } else { + $_imagemagickAvailable = false; + return false; + } +} + +/** + * isRunningFromWeb - checks if the script is being runned from the web + * + * @return boolean true if the script is running from the web + */ +function isRunningFromWeb() { + if ($_SERVER["PHP_SELF"] == "" || php_sapi_name() == "cgi" || php_sapi_name() == "cli") { + return false; + } + + return true; +} + +/** + * getClientName: Returns the client name for a given ID + * + * @return string client name + */ +function getClientName($idclient) { + global $cfg; + + $db = new DB_ConLite; + + $sql = "SELECT name FROM " . $cfg["tab"]["clients"] . " WHERE idclient='" . Contenido_Security::toInteger($idclient) . "'"; + + $db->query($sql); + + if ($db->next_record()) { + return $db->f("name"); + } else { + return false; + } +} + +function scanDirectory($sDirectory, $bRecursive = false) { + if (substr($sDirectory, strlen($sDirectory) - 1, 1) == "/") { + $sDirectory = substr($sDirectory, 0, strlen($sDirectory) - 1); + } + + if (!is_dir($sDirectory)) { + return false; + } + + $aFiles = array(); + + $hDirHandle = opendir($sDirectory); + + while ($sFile = readdir($hDirHandle)) { + $sFullpathFile = $sDirectory . "/" . $sFile; + + if (is_file($sFullpathFile) && is_readable($sFullpathFile)) { + $aFiles[] = $sFullpathFile; + } + + if (is_dir($sFullpathFile) && $sFile != "." && $sFile != ".." && $bRecursive == true) { + $aSubFiles = scanDirectory($sFullpathFile, $bRecursive); + + if (is_array($aSubFiles)) { + $aFiles = array_merge($aFiles, $aSubFiles); + } + } + } + + return $aFiles; +} + +/** + * scanPlugins: Scans a given plugin directory and places the + * found plugins into the array $cfg['plugins'] + * + * + * Example: + * scanPlugins("frontendusers"); + * + * Result: + * $cfg['plugins']['frontendusers'] => array with all found plugins + * + * Note: Plugins are only "found" if the following directory structure + * if found: + * + * entity/ + * plugin1/plugin1.php + * plugin2/plugin2.php + * + * The plugin's directory and file name have to be the + * same, otherwise the function won't find them! + * + * @param $entity Name of the directory to scan + * @return string client name + */ +function scanPlugins($entity) { + global $cfg; + + $pluginorder = getSystemProperty("plugin", $entity . "-pluginorder"); + $lastscantime = getSystemProperty("plugin", $entity . "-lastscantime"); + + $plugins = array(); + + /* Fetch and trim the plugin order */ + if ($pluginorder != "") { + $plugins = explode(",", $pluginorder); + + foreach ($plugins as $key => $plugin) { + $plugins[$key] = trim($plugin); + } + } + + $basedir = $cfg["path"]["contenido"] . $cfg["path"]["plugins"] . "$entity/"; + + /* Don't scan all the time, but each 60 seconds */ + if ($lastscantime + 60 < time()) { + setSystemProperty("plugin", $entity . "-lastscantime", time()); + + $dh = opendir($basedir); + + while (($file = readdir($dh)) !== false) { + + if (is_dir($basedir . $file) && $file != "includes" && $file != "." && $file != "..") { + if (!in_array($file, $plugins)) { + if (file_exists($basedir . $file . "/" . $file . ".php")) { + $plugins[] = $file; + } + } + } + } + + foreach ($plugins as $key => $value) { + if (!is_dir($basedir . $value) || !file_exists($basedir . $value . "/" . $value . ".php")) { + unset($plugins[$key]); + } + } + + $pluginorder = implode(",", $plugins); + setSystemProperty("plugin", $entity . "-pluginorder", $pluginorder); + } + + foreach ($plugins as $key => $value) { + if (!is_dir($basedir . $value) || !file_exists($basedir . $value . "/" . $value . ".php")) { + unset($plugins[$key]); + } else { + i18nRegisterDomain($entity . "_" . $value, $basedir . $value . "/locale/"); + } + } + + $cfg['plugins'][$entity] = $plugins; +} + +/** + * includePlugins: Includes plugins for a given entity + * + * Example: + * includePlugins("frontendusers"); + * + * @param $entity Name of the directory to scan + */ +function includePlugins($entity) { + global $cfg; + + if (is_array($cfg['plugins'][$entity])) { + foreach ($cfg['plugins'][$entity] as $plugin) { + plugin_include($entity, $plugin . "/" . $plugin . ".php"); + } + } +} + +/** + * callPluginStore: Calls the plugin's store methods + * + * Example: + * callPluginStore("frontendusers"); + * + * @param $entity Name of the directory to scan + */ +function callPluginStore($entity) { + global $cfg; + + /* Check out if there are any plugins */ + if (is_array($cfg['plugins'][$entity])) { + foreach ($cfg['plugins'][$entity] as $plugin) { + if (function_exists($entity . "_" . $plugin . "_wantedVariables") && function_exists($entity . "_" . $plugin . "_store")) { + $wantVariables = call_user_func($entity . "_" . $plugin . "_wantedVariables"); + + if (is_array($wantVariables)) { + $varArray = array(); + + foreach ($wantVariables as $value) { + $varArray[$value] = stripslashes($GLOBALS[$value]); + } + } + $store = call_user_func($entity . "_" . $plugin . "_store", $varArray); + } + } + } +} + +function displayPlugin($entity, & $form) { + /* TODO: Function can't work, as $feuser is not defined (see $display = + * call_user_func($entity."_".$plugin."_display", $feuser);) and plugins need + * - if data has to be shown - global objects ... + */ + $pluginOrder = trim_array(explode(",", getSystemProperty("plugin", $entity . "-pluginorder"))); + + /* Check out if there are any plugins */ + if (is_array($pluginOrder)) { + foreach ($pluginOrder as $plugin) { + if (function_exists($entity . "_" . $plugin . "_getTitle") && function_exists($entity . "_" . $plugin . "_display")) { + $plugTitle = call_user_func($entity . "_" . $plugin . "_getTitle"); + $display = call_user_func($entity . "_" . $plugin . "_display", $feuser); + + if (is_array($plugTitle) && is_array($display)) { + foreach ($plugTitle as $key => $value) { + $form->add($value, $display[$key]); + } + } else { + if (is_array($plugTitle) || is_array($display)) { + $form->add("WARNING", "The plugin $plugin delivered an array for the displayed titles, but did not return an array for the contents."); + } else { + $form->add($plugTitle, $display); + } + } + } + } + } +} + +/** + * createRandomName: Creates a random name (example: Passwords) + * + * Example: + * echo createRandomName(8); + * + * @param $nameLength Length of the generated string + * @return string random name + */ +function createRandomName($nameLength) { + $NameChars = 'abcdefghijklmnopqrstuvwxyz'; + $Vouel = 'aeiou'; + $Name = ""; + + for ($index = 1; $index <= $nameLength; $index ++) { + if ($index % 3 == 0) { + $randomNumber = rand(1, strlen($Vouel)); + $Name .= substr($Vouel, $randomNumber - 1, 1); + } else { + $randomNumber = rand(1, strlen($NameChars)); + $Name .= substr($NameChars, $randomNumber - 1, 1); + } + } + + return $Name; +} + +/** + * sendPostRequest: Sents a HTTP POST request + * + * Example: + * sendPostRequest("hostname", "serverpath/test.php", $data); + * + * @param $host Hostname or domain + * @param $pathhost Path on the host or domain + * @param $data Data to send + * @param $referer Referer (optional) + * @param $port Port (default: 80) + */ +function sendPostRequest($host, $path, $data, $referer = "", $port = 80) { + $fp = fsockopen($host, $port); + + fputs($fp, "POST $path HTTP/1.1\n"); + fputs($fp, "Host: $host\n"); + fputs($fp, "Referer: $referer\n"); + fputs($fp, "Content-type: application/x-www-form-urlencoded\n"); + fputs($fp, "Content-length: " . strlen($data) . "\n"); + fputs($fp, "Connection: close\n\n"); + fputs($fp, "$data\n"); + + while (!feof($fp)) { + $res .= fgets($fp, 128); + } + + fclose($fp); + + return $res; +} + +function is_dbfs($file) { + if (substr($file, 0, 5) == "dbfs:") { + return true; + } +} + +function setHelpContext($area) { + global $cfg; + + if ($cfg['help'] == true) { + $hc = "parent.parent.parent.frames[0].document.getElementById('help').setAttribute('data', '$area');"; + } else { + $hc = ""; + } + + return $hc; +} + +function define_if($constant, $value) { + if (!defined($constant)) { + define($constant, $value); + } +} + +/** + * Specify platform specific newline character; PHP_EOL has been introduced in PHP 5.0.2 + * Note, that Mac seems to use \r, sorry guys + */ +if (!defined('PHP_EOL')) { + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + define('PHP_EOL', "\r\n"); // Windows + } else { + define('PHP_EOL', "\n"); // *nix + } +} + +function locale_arsort($locale, $array) { + $oldlocale = setlocale(LC_COLLATE, 0); + setlocale(LC_COLLATE, $locale); + + uasort($array, "strcoll"); + + setlocale(LC_COLLATE, $oldlocale); + + return ($array); +} + +/* TODO: Ask timo to document this. */ +/* Note: If subarrays exists, this function currently returns the key of the array + given by $array, and not from the subarrays (todo: add flag to allow this) */ + +function array_search_recursive($search, $array, $partial = false, $strict = false) { + foreach ($array as $key => $value) { + if (is_array($value)) { + $val = array_search_recursive($search, $value, $partial, $strict); + if ($val !== false) { + return ($key); + } + } else { + if ($partial == false) { + if ($strict == true) { + if ($value === $search) { + return $key; + } + } else { + if ($value == $search) { + return $key; + } + } + } else { + if (strpos($value, $search) !== FALSE) { + return $key; + } + } + } + } + + return false; +} + +/** + * cDie: Contenido die-alternative + * + * @author unknown + * + * @param string $file File name (use __FILE__) + * @param string $line Line number (use __LINE__) + * @param string $message Message to display + * @return void + */ +function cDie($file, $line, $message) { + cError($file, $line, $message); + die("$file $line: $message"); +} + +/** + * cWarning: Contenido warning + * + * @param $file File name (use __FILE__) + * @param $line Line number (use __LINE__) + * @param $message Message to display + */ +function cWarning($file, $line, $message) { + trigger_error("$file $line: $message", E_USER_WARNING); +} + +/** + * cError: Contenido error + * + * @param $file File name (use __FILE__) + * @param $line Line number (use __LINE__) + * @param $message Message to display + */ +function cError($file, $line, $message) { + trigger_error("$file $line: $message", E_USER_ERROR); +} + +/** + * cDeprecated: Trigger deprecated stuff + * + * @author Ortwin Pinke + * @param string $file File name (use __FILE__) + * @param string $line Line number (use __LINE__) + * @param string $message Message to display + */ +function cDeprecated($file, $line, $message) { + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + trigger_error($file . " " . $line . ": " . $message, E_USER_DEPRECATED); + } else { + trigger_error("$file $line: $message", E_USER_WARNING); + } +} + +/** + * getNamedFrame: Returns the name of the numeric frame given + * + * @param $frame Frame number + * @return string Canonical name of the frame + */ +function getNamedFrame($frame) { + switch ($frame) { + case 1 : + return ("left_top"); + break; + case 2 : + return ("left_bottom"); + break; + case 3 : + return ("right_top"); + break; + case 4 : + return ("right_bottom"); + break; + default : + return (""); + break; + } +} + +/** + * startTiming: Starts the timing for a specific function + * + * @param function string Name of the function + * @param parameters array All parameters for the function to measure + * + * @return int uuid for this measure process + */ +function startTiming($function, $parameters = array()) { + global $_timings, $cfg; + + if ($cfg["debug"]["functiontiming"] == false) { + return; + } + + /* Create (almost) unique ID */ + $uuid = md5(uniqid(rand(), true)); + + if (!is_array($parameters)) { + cWarning(__FILE__, __LINE__, "Warning: startTiming's parameters parameter expects an array"); + $parameters = array(); + } + + $_timings[$uuid]["parameters"] = $parameters; + $_timings[$uuid]["function"] = $function; + + $_timings[$uuid]["start"] = getmicrotime(); + + return $uuid; +} + +/** + * endAndLogTiming: Ends the timing process and logs it to the timings file + * + * @param uuid int UUID which has been used for timing + */ +function endAndLogTiming($uuid) { + global $_timings, $cfg; + + if ($cfg["debug"]["functiontiming"] == false) { + return; + } + + $_timings[$uuid]["end"] = getmicrotime(); + + $timeSpent = $_timings[$uuid]["end"] - $_timings[$uuid]["start"]; + + $myparams = array(); + + /* Build nice representation of the function */ + foreach ($_timings[$uuid]["parameters"] as $parameter) { + + switch (gettype($parameter)) { + case "string" : + $myparams[] = '"' . $parameter . '"'; + break; + + case "boolean" : + if ($parameter == true) { + $myparams[] = "true"; + } else { + $myparams[] = "false"; + } + break; + + default : + if ($parameter == "") { + $myparams[] = '"' . $parameter . '"'; + } else { + $myparams[] = $parameter; + } + } + } + + $parameterString = implode(", ", $myparams); + + trigger_error("calling function " . $_timings[$uuid]["function"] . "(" . $parameterString . ") took " . $timeSpent . " seconds", E_USER_NOTICE); +} + +// @TODO: it's better to create a instance of DB_ConLite class, the class constructor connects also to the database. +function checkMySQLConnectivity() { + global $contenido_host, $contenido_database, $contenido_user, $contenido_password, $cfg; + + if ($cfg["database_extension"] == "mysqli") { + if (($iPos = strpos($contenido_host, ":")) !== false) { + list($sHost, $sPort) = explode(":", $contenido_host); + + $res = @mysqli_connect($sHost, $contenido_user, $contenido_password, "", $sPort); + } else { + $res = @mysqli_connect($contenido_host, $contenido_user, $contenido_password); + } + } else { + $res = @mysql_connect($contenido_host, $contenido_user, $contenido_password); + } + + $selectDb = false; + if ($res) { + if ($cfg["database_extension"] == "mysqli") { + $selectDb = @mysqli_select_db($res, $contenido_database); + } else { + $selectDb = @mysql_select_db($contenido_database, $res); + } + } + + if (!$res || !$selectDb) { + $errortitle = i18n("MySQL Database not reachable for installation %s"); + $errortitle = sprintf($errortitle, $cfg["path"]["contenido_fullhtml"]); + + $errormessage = i18n("The MySQL Database for the installation %s is not reachable. Please check if this is a temporary problem or if it is a real fault."); + $errormessage = sprintf($errormessage, $cfg["path"]["contenido_fullhtml"]); + + notifyOnError($errortitle, $errormessage); + + if ($cfg["contenido"]["errorpage"] != "") { + header("Location: " . $cfg["contenido"]["errorpage"]); + } else { + die("Could not connect to the database server with this configuration!"); + } + + exit; + } else { + if ($cfg["database_extension"] == "mysqli") { + mysqli_close($res); + } else { + mysql_close($res); + } + } +} + +function notifyOnError($errortitle, $errormessage) { + global $cfg; + $sFileNotify = $cfg['path']['conlite_logs'] . "notify.txt"; + + if (file_exists($sFileNotify)) { + $notifytimestamp = file_get_contents($sFileNotify); + } else { + $notifytimestamp = 0; + } + + if ((time() - $notifytimestamp) > $cfg["contenido"]["notifyinterval"] * 60) { + if ($cfg['contenido']['notifyonerror'] != "") { + $sMailhost = getSystemProperty('system', 'mail_host'); + if ($sMailhost == '') { + $sMailhost = 'localhost'; + } + + $oMail = new PHPMailer(); + $oMail->Host = $sMailhost; + $oMail->IsHTML(0); + $oMail->WordWrap = 1000; + $oMail->IsMail(); + + $oMail->AddAddress($cfg["contenido"]["notifyonerror"], ""); + $oMail->Subject = $errortitle; + $oMail->Body = $errormessage; + + /* Notify configured email */ + $oMail->Send(); + } + /* Write last notify log file */ + file_put_contents($sFileNotify, time()); + } +} + +function cIDNAEncode($sourceEncoding, $string) { + if (extension_loaded("iconv")) { + cInclude('pear', 'Net/IDNA.php'); + + $idn = Net_IDNA :: getInstance(); + + $string = iconv("UTF-8", $sourceEncoding, $string); + $string = $idn->encode($string); + + return ($string); + } + + if (extension_loaded("recode")) { + cInclude('pear', 'Net/IDNA.php'); + + $idn = Net_IDNA :: getInstance(); + + $string = $idn->decode($string); + $string = recode_string("UTF-8.." . $sourceEncoding, $string); + return $string; + } + + return $string; +} + +function cIDNADecode($targetEncoding, $string) { + if (extension_loaded("iconv")) { + cInclude('pear', 'Net/IDNA.php'); + + $idn = Net_IDNA :: getInstance(); + + $string = $idn->decode($string); + $string = iconv($targetEncoding, "UTF-8", $string); + + return ($string); + } + + if (extension_loaded("recode")) { + cInclude('pear', 'Net/IDNA.php'); + + $idn = Net_IDNA :: getInstance(); + + $string = recode_string($targetEncoding . "..UTF-8", $string); + $string = $idn->decode($string); + + return $string; + } + + return $string; +} + +/** + * Checks for a named key of an array, pushes it if not set with a default value + * + * @param array $aArray reference of array + * @param string $sKey key to check for and to set + * @param multi $mDefault default value + * @return boolean false if no array is given, void otherwise + */ +function cInitializeArrayKey(&$aArray, $sKey, $mDefault = "") { + if (!is_array($aArray)) { + if (isset($aArray)) { + return false; + } + $aArray = array(); + } + + if (!array_key_exists($sKey, $aArray)) { + $aArray[$sKey] = $mDefault; + } +} + +/** + * Function checks current language + * and client settings by HTTP-Params + * and DB settings. Based on this + * informations it will send an HTTP + * header for right encoding. + * + * @param DB_ConLite $db + * @param array $cfg global cfg-array + * @param int $lang global language id + * + * @since 4.6.18 + * + * @version 1.0.0 + * @author Holger Librenz + */ +function sendEncodingHeader($db, $cfg, $lang) { + if (array_key_exists("use_encoding", $_GET)) { + $use_encoding = trim(strip_tags($_GET["use_encoding"])); + } + + if (array_key_exists("use_encoding", $_POST)) { + $use_encoding = trim(strip_tags($_POST["use_encoding"])); + } + + if (!isset($use_encoding)) { + $use_encoding = true; + } + + if (is_string($use_encoding)) { + if ($use_encoding == "false") { + $use_encoding = false; + } else { + $use_encoding = true; + } + } + + if ($use_encoding != false) { + $sql = "SELECT idlang, encoding FROM " . $cfg["tab"]["lang"]; + $db->query($sql); + + $aLanguageEncodings = array(); + + while ($db->next_record()) { + $aLanguageEncodings[$db->f("idlang")] = $db->f("encoding"); + } + + if (array_key_exists($lang, $aLanguageEncodings)) { + if (!in_array($aLanguageEncodings[$lang], $cfg['AvailableCharsets'])) { + header("Content-Type: text/html; charset=ISO-8859-1"); + } else { + header("Content-Type: text/html; charset={$aLanguageEncodings[$lang]}"); + } + } else { + header("Content-Type: text/html; charset=ISO-8859-1"); + } + } +} + +/** + * IP_match + * + * @param string $network + * @param string $mask + * @param string $ip + * @return boolean + */ +function IP_match($network, $mask, $ip) { + bcscale(3); + $ip_long = ip2long($ip); + $mask_long = ip2long($network); + + # + # Convert mask to divider + # + if (preg_match('/^[0-9]+$/', $mask)) { + /// 212.50.13.0/27 style mask (Cisco style) + $divider = bcpow(2, (32 - $mask)); + } else { + /// 212.50.13.0/255.255.255.0 style mask + $xmask = ip2long($mask); + if ($xmask < 0) + $xmask = bcadd(bcpow(2, 32), $xmask); + $divider = bcsub(bcpow(2, 32), $xmask); + } + # + # Test is IP within specified mask + # + if (floor(bcdiv($ip_long, $divider)) == floor(bcdiv($mask_long, $divider))) { + # match - this IP is within specified mask + return true; + } else { + # fail - this IP is NOT within specified mask + return false; + } +} + +?> \ No newline at end of file diff --git a/conlite/includes/functions.i18n.php b/conlite/includes/functions.i18n.php new file mode 100644 index 0000000..5a11b52 --- /dev/null +++ b/conlite/includes/functions.i18n.php @@ -0,0 +1,376 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: functions.i18n.php 340 2015-08-20 13:31:29Z oldperl $ + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * trans($string) + * + * gettext wrapper (for future extensions). Usage: + * trans("Your text which has to be translated"); + * + * @param $string string The string to translate + * @return string Returns the translation + * + * @deprecated since 4.8.16 CL, use i18n instead, function will be deleted in one of next versions + */ +function trans($string) { + return i18n($string); +} +/** + * i18n($string) + * + * gettext wrapper (for future extensions). Usage: + * i18n("Your text which has to be translated"); + * + * @param $string string The string to translate + * @param $domain string The domain to look up + * @return string Returns the translation + */ +function i18n($string, $domain = "conlite") { + global $cfg, $i18nLanguage, $I18N_EMULATE_GETTEXT; + + // Auto initialization + if (!isset($i18nLanguage)) { + if (!isset($GLOBALS['belang'])) { + if(isset($contenido) && $contenido) { + // This is backend, we should trigger an error message here + $stack = @debug_backtrace(); + $file = $stack[0]['file']; + $line = $stack[0]['line']; + cWarning ($file, $line, "i18nInit \$belang is not set"); + } // only send warning in backend + $GLOBALS['belang'] = false; // Needed - otherwise this won't work + } + i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $GLOBALS['belang']); + } + + cInitializeArrayKey($cfg, "native_i18n", false); + + if($I18N_EMULATE_GETTEXT || $cfg["native_i18n"]) { + return i18nEmulateGettext($string, $domain); + } + + if(extension_loaded("gettext")) { + if(function_exists("dgettext")) { + // use utf-8 as default + bind_textdomain_codeset($domain, 'UTF-8'); + if($domain != "conlite") { + $translation = dgettext($domain, $string); + } else { + $translation = gettext($string); + } + if(!empty($translation)) { + return $translation; + } + return $string; + } + } + return i18nEmulateGettext($string, $domain); +} + +/** + * i18nEmulateGettext() + * + * Emulates GNU gettext + * + * @param $string string The string to translate + * @param $domain string The domain to look up + * @return string Returns the translation + */ +function i18nEmulateGettext($string, $domain = "conlite") { + global $cfg, $i18nLanguage, $transFile, $i18nDomains, $_i18nTranslationCache; + if(!is_array($_i18nTranslationCache)) { + $_i18nTranslationCache = array(); + } + if(array_key_exists($string, $_i18nTranslationCache)) { + return $_i18nTranslationCache[$string]; + } + + // Bad thing, gettext is not available. Let's emulate it + if(!isset($i18nDomains[$domain]) || !file_exists($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po")) { + return $string; + } + + if (!isset($transFile[$domain])) { + $transFile[$domain] = implode('',file($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po")); + + // Remove comments from file + $transFile[$domain] = preg_replace('/^#.+/m', '', $transFile[$domain]); + + // Prepare for special po edit format + /* Something like: + #, php-format + msgid "" + "Hello %s,\n" + "\n" + "you've got a new reminder for the client '%s' at\n" + "%s:\n" + "\n" + "%s" + msgstr "" + "Hallo %s,\n" + "\n" + "du hast eine Wiedervorlage erhalten für den Mandanten '%s' at\n" + "%s:\n" + "\n" + "%s" + has to be converted to: + msgid "Hello %s,\n\nyou've got a new reminder for the client '%s' at\n%s:\n\n%s" + msgstr "Hallo %s,\n\ndu hast eine Wiedervorlage erhalten f�r den Mandanten '%s' at\n%s:\n\n%s" + */ + $transFile[$domain] = preg_replace('/\\\n"\\s+"/m', '\\\\n', $transFile[$domain]); + $transFile[$domain] = preg_replace('/(""\\s+")/m', '"', $transFile[$domain]); + } + + $stringStart = strpos($transFile[$domain], '"'.str_replace(Array("\n", "\r", "\t"), Array('\n', '\r', '\t'), $string).'"'); + if($stringStart === false) { + return $string; + } + + $results = array(); + preg_match("/msgid.*\"(".preg_quote(str_replace(Array("\n", "\r", "\t"), Array('\n', '\r', '\t'), $string),"/").")\"(?:\s*)?\nmsgstr(?:\s*)\"(.*)\"/", $transFile[$domain], $results); + # Old: preg_match("/msgid.*\"".preg_quote($string,"/")."\".*\nmsgstr(\s*)\"(.*)\"/", $transFile[$domain], $results); + //print_r($results); + if(array_key_exists(1, $results) && !empty($results[2])) { + $_i18nTranslationCache[$string] = stripslashes(str_replace(Array('\n', '\r', '\t'), Array("\n", "\r", "\t"), $results[2])); + return $_i18nTranslationCache[$string]; + } else { + return $string; + } +} + +/** + * i18nInit() + * + * Initializes the i18n stuff. + * + * @global string $i18nLanguage + * @global array $i18nDomains + * @param string $localePath + * @param string $langCode + */ +function i18nInit ($localePath, $langCode) { + global $i18nLanguage, $i18nDomains, $I18N_EMULATE_GETTEXT; + + if(!is_array($i18nDomains)) { + $i18nDomains = array(); + } + /* + echo setlocale(LC_ALL, 0); // read the current locale + setlocale(LC_ALL, "de"); // try to write your locale + echo setlocale(LC_ALL, 0); + * + */ + + $mTestLocale = setlocale(LC_ALL, 0); + if($mTestLocale === FALSE) { + $I18N_EMULATE_GETTEXT = true; + } else if($mTestLocale != $langCode) { + $tmpLocale = setlocale(LC_ALL, $langCode); + if($tmpLocale != $langCode) { + $I18N_EMULATE_GETTEXT = true; + } + } + if(!array_key_exists("conlite", $i18nDomains)) { + if(function_exists("bindtextdomain")) { + if(defined("LC_MESSAGES")) { + setlocale(LC_MESSAGES, $langCode); + } + setlocale(LC_CTYPE, $langCode); + /* Half brute-force to set the locale. */ + if(!ini_get("safe_mode")) { + putenv("LANG=$langCode"); + } + /* Bind the domain "conlite" to our locale path */ + bindtextdomain("conlite", $localePath); + + /* Set the default text domain to "conlite" */ + textdomain("conlite"); + } + + $i18nDomains["conlite"] = $localePath; + $i18nLanguage = $langCode; + } +} + +/** + * Registers a new i18n domain. + * + * @global array $i18nDomains + * @param string $domain + * @param string $localePath + */ +function i18nRegisterDomain($domain, $localePath) { + global $i18nDomains; + + if(!is_array($i18nDomains)) { + $i18nDomains = array(); + } + + if(!array_key_exists($domain, $i18nDomains)) { + if(function_exists("bindtextdomain")) { + /* Bind the domain "conlite" to our locale path */ + bindtextdomain($domain, ""); // clear cache of gettext + bindtextdomain($domain, $localePath); + } + $i18nDomains[$domain] = $localePath; + } +} + +/** + * i18nStripAcceptLanguages($accept) + * + * Strips all unnecessary information from the $accept string. + * Example: de,nl;q=0.7,en-us;q=0.3 would become an array with de,nl,en-us + * + * @return array Array with the short form of the accept languages + */ +function i18nStripAcceptLanguages($accept) { + $languages = explode(',', $accept); + foreach($languages as $value) { + $components = explode(';', $value); + $shortLanguages[] = $components[0]; + } + return ($shortLanguages); +} + +/** + * i18nMatchBrowserAccept($accept) + * + * Tries to match the language given by $accept to + * one of the languages in the system. + * + * @return string The locale key for the given accept string + */ +function i18nMatchBrowserAccept ($accept) +{ + $available_languages = i18nGetAvailableLanguages(); + + /* Try to match the whole accept string */ + foreach ($available_languages as $key => $value) + { + list($country, $lang, $encoding, $shortaccept) = $value; + + if ($accept == $shortaccept) + { + return $key; + } + } + + /* Whoops, we are still here. Let's match the stripped-down string. + Example: de-ch isn't in the list. Cut it down after the "-" to "de" + which should be in the list. */ + + $accept = substr($accept,0,2); + foreach ($available_languages as $key => $value) + { + list($country, $lang, $encoding, $shortaccept) = $value; + + if ($accept == $shortaccept) + { + return $key; + } + } + + /* Whoops, still here? Seems that we didn't find any language. Return + the default (german, yikes) */ + return (false); +} + +/** + * i18nGetAvailableLanguages() + * + * Returns the available_languages array to prevent globals. + * + * @return array All available languages + */ +function i18nGetAvailableLanguages () +{ + /* Array notes: + First field: Language + Second field: Country + Third field: ISO-Encoding + Fourth field: Browser accept mapping + Fifth field: SPAW language + */ + $aLanguages = array( + 'ar_AA' => array('Arabic','Arabic Countries', 'ISO8859-6', 'ar','en'), + 'be_BY' => array('Byelorussian', 'Belarus', 'ISO8859-5', 'be', 'en'), + 'bg_BG' => array('Bulgarian','Bulgaria', 'ISO8859-5', 'bg', 'en'), + 'cs_CZ' => array('Czech', 'Czech Republic', 'ISO8859-2', 'cs', 'cz'), + 'da_DK' => array('Danish', 'Denmark', 'ISO8859-1', 'da', 'dk'), + 'de_CH' => array('German', 'Switzerland', 'ISO8859-1', 'de-ch', 'de'), + 'de_DE' => array('German', 'Germany', 'ISO8859-1', 'de', 'de'), + 'el_GR' => array('Greek', 'Greece', 'ISO8859-7', 'el', 'en'), + 'en_GB' => array('English', 'Great Britain', 'ISO8859-1', 'en-gb', 'en'), + 'en_US' => array('English', 'United States', 'ISO8859-1', 'en', 'en'), + 'es_ES' => array('Spanish', 'Spain', 'ISO8859-1', 'es', 'es'), + 'fi_FI' => array('Finnish', 'Finland', 'ISO8859-1', 'fi', 'en'), + 'fr_BE' => array('French', 'Belgium', 'ISO8859-1', 'fr-be', 'fr'), + 'fr_CA' => array('French', 'Canada', 'ISO8859-1', 'fr-ca', 'fr'), + 'fr_FR' => array('French', 'France', 'ISO8859-1', 'fr', 'fr'), + 'fr_CH' => array('French', 'Switzerland', 'ISO8859-1', 'fr-ch', 'fr'), + 'hr_HR' => array('Croatian', 'Croatia', 'ISO8859-2', 'hr', 'en'), + 'hu_HU' => array('Hungarian', 'Hungary', 'ISO8859-2', 'hu', 'hu'), + 'is_IS' => array('Icelandic', 'Iceland', 'ISO8859-1', 'is', 'en'), + 'it_IT' => array('Italian', 'Italy', 'ISO8859-1', 'it', 'it'), + 'iw_IL' => array('Hebrew', 'Israel', 'ISO8859-8', 'he', 'he'), + 'nl_BE' => array('Dutch', 'Belgium', 'ISO8859-1', 'nl-be', 'nl'), + 'nl_NL' => array('Dutch', 'Netherlands', 'ISO8859-1', 'nl', 'nl'), + 'no_NO' => array('Norwegian', 'Norway', 'ISO8859-1', 'no', 'en'), + 'pl_PL' => array('Polish', 'Poland', 'ISO8859-2', 'pl', 'en'), + 'pt_BR' => array('Brazillian', 'Brazil', 'ISO8859-1', 'pt-br', 'br'), + 'pt_PT' => array('Portuguese', 'Portugal', 'ISO8859-1', 'pt', 'en'), + 'ro_RO' => array('Romanian', 'Romania', 'ISO8859-2', 'ro', 'en'), + 'ru_RU' => array('Russian', 'Russia', 'ISO8859-5', 'ru', 'ru'), + 'sh_SP' => array('Serbian Latin', 'Yugoslavia', 'ISO8859-2', 'sr', 'en'), + 'sl_SI' => array('Slovene', 'Slovenia', 'ISO8859-2', 'sl', 'en'), + 'sk_SK' => array('Slovak', 'Slovakia', 'ISO8859-2', 'sk', 'en'), + 'sq_AL' => array('Albanian', 'Albania', 'ISO8859-1', 'sq', 'en'), + 'sr_SP' => array('Serbian Cyrillic', 'Yugoslavia', 'ISO8859-5', 'sr-cy', 'en'), + 'sv_SE' => array('Swedish', 'Sweden', 'ISO8859-1', 'sv', 'se'), + 'tr_TR' => array('Turkisch', 'Turkey', 'ISO8859-9', 'tr', 'tr') + ); + + return ($aLanguages); +} + +/** + * translate strings in modules + * + * @global int $cCurrentModule + * @global string $lang + * @global cApiModuleTranslationCollection $mi18nTranslator + * @param string $string string to translate + * @return string translated string + */ +function mi18n($string) { + global $cCurrentModule, $lang, $mi18nTranslator; + + if(!is_object($mi18nTranslator)) { + $mi18nTranslator = new cApiModuleTranslationCollection; + } + return $mi18nTranslator->fetchTranslation($cCurrentModule, $lang, $string); +} +?> diff --git a/conlite/includes/functions.includePluginConf.php b/conlite/includes/functions.includePluginConf.php new file mode 100644 index 0000000..93106ff --- /dev/null +++ b/conlite/includes/functions.includePluginConf.php @@ -0,0 +1,172 @@ + + * @copyright (c) 2015, conlite.org + * @license http://www.gnu.de/documents/gpl.en.html GPL v3 (english version) + * @license http://www.gnu.de/documents/gpl.de.html GPL v3 (deutsche Version) + * @link http://www.conlite.org ConLite.org + * + * $Id: functions.includePluginConf.php 345 2015-09-14 11:16:10Z oldperl $: + */ +defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.'); + +$bDebug = FALSE; + +// first check all plugins managed by pim and init them if active +$aPlugins = array(); +$sPluginsPath = cRegistry::getPluginsPath(); + +if (file_exists($sPluginsPath."pluginmanager") && cRegistry::getConfigValue('debug', 'disable_plugins') === FALSE) { + i18nRegisterDomain('pluginmanager', $sPluginsPath . 'pluginmanager/locale/'); + cAutoload::addClassmapConfigFile($sPluginsPath . 'pluginmanager/includes/config.autoloader.php'); + include_once($sPluginsPath . 'pluginmanager/includes/config.plugin.php'); + $oPluginColl = new pimPluginCollection(); + $oPluginColl->setWhere('active', 1); + $oPluginColl->setOrder('executionorder ASC'); + $oPluginColl->query(); + + while (($oPlugin = $oPluginColl->next()) !== false) { + $sPluginName = $oPlugin->get('folder'); + $sPluginFolder = $sPluginsPath . $sPluginName . DIRECTORY_SEPARATOR; + if (is_dir($sPluginFolder) && file_exists($sPluginFolder . "plugin.xml")) { + $aPlugins[] = $sPluginName; + } + } +} + +if ($bDebug && $frame == 4) { + echo $sPluginName . "\n"; + print_r($aPlugins); +} + +// Include all active plugins +foreach ($aPlugins as $sPluginName) { + $sPluginLocaleDir = $sPluginsPath . $sPluginName . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR; + $sPluginConfigFile = $sPluginsPath . $sPluginName . DIRECTORY_SEPARATOR . 'includes/config.plugin.php'; + $sPluginAutoloaderFile = $sPluginsPath . $sPluginName . DIRECTORY_SEPARATOR . 'includes/config.autoloader.php'; + // language support + if (file_exists($sPluginLocaleDir)) { + i18nRegisterDomain($sPluginName, $sPluginLocaleDir); + } + // config file + if (file_exists($sPluginConfigFile)) { + include_once($sPluginConfigFile); + } + // autoloader config + if (file_exists($sPluginAutoloaderFile)) { + cAutoload::addClassmapConfigFile($sPluginAutoloaderFile); + } +} + +$pluginorder = getSystemProperty("system", "plugin-order"); + +$plugins = explode(",", $pluginorder); + +$ipc_conpluginpath = cRegistry::getPluginsPath(); + +/** + * Scan and save only by the BE + * will be removed if all core plugins using pluginmanager + * + * @deprecated since version 2.0 + */ +if ($contenido) { + $lastscantime = getSystemProperty("system", "plugin-lastscantime"); + + /* Clean up: Fetch and trim the plugin order */ + $plugins = array(); + + if ($pluginorder != "") { + $plugins = explode(",", $pluginorder); + + foreach ($plugins as $key => $plugin) { + $plugins[$key] = trim($plugin); + } + } + + /* Don't scan all the time, but each 60 seconds */ + if ($lastscantime + 60 < time()) { + + // Directories which are to exclude from scanning process + $dirsToExclude = trim(getSystemProperty('system', 'plugin-dirstoexclude')); + if ($dirsToExclude === '') { + $dirsToExclude = '.,..,.svn,.cvs,includes'; + setSystemProperty('system', 'plugin-dirstoexclude', $dirsToExclude); + } + $dirsToExclude = explode(',', $dirsToExclude); + foreach ($dirsToExclude as $pos => $item) { + $dirsToExclude[$pos] = trim($item); + } + + /* scan for new Plugins */ + $dh = opendir($ipc_conpluginpath); + while (($file = readdir($dh)) !== false) { + if (is_dir($ipc_conpluginpath . $file) && + !in_array(strtolower($file), $dirsToExclude) && + !in_array($file, $plugins)) { + $plugins[] = $file; + } + } + closedir($dh); + setSystemProperty("system", "plugin-lastscantime", time()); + + + /* Remove plugins do not exist */ + foreach ($plugins as $key => $ipc_plugin) { + if (!is_dir($ipc_conpluginpath . $ipc_plugin . "/") + || in_array($ipc_plugin, $dirsToExclude) + || file_exists($ipc_conpluginpath . $ipc_plugin . "/plugin.xml")) { + unset($plugins[$key]); + } + } + + /* Save Scanresult */ + $pluginorder = implode(",", $plugins); + setSystemProperty("system", "plugin-order", $pluginorder); + } +} + + + +/** + * load plugin configuration and localization + * add classes to contenido autoloader + * + * @deprecated since version 2.0 will be removed if all core plugins use pluginmanager + */ +foreach ($plugins as $key => $ipc_plugin) { + if (!is_dir($ipc_conpluginpath . $ipc_plugin . "/") + || file_exists($ipc_conpluginpath . $ipc_plugin . "/plugin.xml")) { + unset($plugins[$key]); + } else { + $ipc_localedir = $ipc_conpluginpath . $ipc_plugin . "/locale/"; + $ipc_langfile = $ipc_conpluginpath . $ipc_plugin . "/includes/language.plugin.php"; + $ipc_configfile = $ipc_conpluginpath . $ipc_plugin . "/includes/config.plugin.php"; + $ipc_autoloaderfile = $ipc_conpluginpath . $ipc_plugin . "/includes/config.autoloader.php"; + + if (file_exists($ipc_localedir)) { + i18nRegisterDomain($ipc_plugin, $ipc_localedir); + } + + if (file_exists($ipc_langfile)) { + include_once($ipc_langfile); + } + + if (file_exists($ipc_configfile)) { + include_once($ipc_configfile); + } + + if (file_exists($ipc_autoloaderfile)) { + cAutoload::addClassmapConfigFile($ipc_autoloaderfile); + } + } +} +unset($plugins); +unset($bDebug); +?> \ No newline at end of file diff --git a/conlite/includes/functions.lang.php b/conlite/includes/functions.lang.php new file mode 100644 index 0000000..2e34854 --- /dev/null +++ b/conlite/includes/functions.lang.php @@ -0,0 +1,637 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-07-23, Timo Trautmann optional db param added for langGetTextDirection (performance tuning) + * modified 2009-10-23, Murat Purc, removed deprecated function (PHP 5.3 ready) and some formatting + * + * $Id: functions.lang.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.con.php"); +cInclude("includes", "functions.str.php"); + +/** + * Edit a language + * + * @param string $name Name of the language + * + * @author Jan Lengowski + * @author Olaf Niemann + * @copyright four for business AG + */ +function langEditLanguage($idlang, $langname, $encoding, $active, $direction = "ltr") { + global $db, $sess, $client, $cfg; + + $modified = date("Y-m-d H:i:s"); + + $sql = "UPDATE + ".$cfg["tab"]["lang"]." + SET + name = '".Contenido_Security::escapeDB($langname, $db)."', + encoding = '".Contenido_Security::escapeDB($encoding, $db)."', + active = '".Contenido_Security::toInteger($active)."', + lastmodified = '".Contenido_Security::escapeDB($modified, $db)."', + direction = '".Contenido_Security::escapeDB($direction, $db)."' + WHERE + idlang = '".Contenido_Security::toInteger($idlang)."'"; + + $db->query($sql); + + return true; +} + + +/** + * Create a new language + * + * @param string $name Name of the language + * + * @author Jan Lengowski + * @author Olaf Niemann + * @copyright four for business AG + */ +function langNewLanguage($name, $client) { + global $db, $sess, $cfg, $cfgClient, $notification, $auth; + $new_idlang = $db->nextid($cfg["tab"]["lang"]); + $author = $auth->auth["uid"]; + $created = date("Y-m-d H:i:s"); + $modified = $created; + + // Add new language to database + $sql = "INSERT INTO ".$cfg["tab"]["lang"]." (idlang, name, active, encoding, author, created, lastmodified) VALUES ('".Contenido_Security::toInteger($new_idlang)."', '".Contenido_Security::escapeDB($name, $db)."', '0', + 'iso-8859-1', '".Contenido_Security::escapeDB($author, $db)."', '".Contenido_Security::escapeDB($created, $db)."', '".Contenido_Security::escapeDB($modified, $db)."')"; + $db->query($sql); + $sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." (idclientslang, idclient, idlang) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["clients_lang"]))."', '".Contenido_Security::toInteger($client)."', + '".Contenido_Security::toInteger($new_idlang)."')"; + $db->query($sql); + + // Ab hyr seynd Drachen + $destPath = $cfgClient[$client]["path"]["frontend"]; + + if (file_exists($destPath) && file_exists($destPath."config.php")) { + $res = fopen($destPath."config.php","rb+"); + $res2 = fopen($destPath."config.php.new", "ab+"); + + if ($res && $res2) { + while (!feof($res)) { + $buffer = fgets($res, 4096); + $outbuf = str_replace("!LANG!", $new_idlang, $buffer); + fwrite($res2, $outbuf); + } + + fclose($res); + fclose($res2); + + if (file_exists($destPath."config.php")) { + unlink($destPath."config.php"); + } + + rename($destPath."config.php.new", $destPath."config.php"); + } + } else { + $notification->displayNotification("error", i18n("Could not set the language-ID in the file 'config.php'. Please set the language manually.")); + } +} + + +/** + * Rename a language + * + * @author Jan Lengowski + * @author Olaf Niemann + * @copyright four for business AG + */ +function langRenameLanguage($idlang, $name) { + global $db; + global $cfg; + + $sql = "UPDATE ".$cfg["tab"]["lang"]." SET name='".Contenido_Security::escapeDB($name, $db)."' WHERE idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); +} + + +/** + * Duplicate a language + * + * @param string $name Name of the language + * + * @author Jan Lengowski + * @author Olaf Niemann + * @copyright four for business AG + */ +function langDuplicateFromFirstLanguage($client, $idlang) { + + global $db, $sess, $cfg; + + $db2 = new DB_ConLite(); + + $sql = "SELECT * FROM ".$cfg["tab"]["clients_lang"]." WHERE idclient='".Contenido_Security::toInteger($client)."' ORDER BY idlang ASC"; + + $db->query($sql); + if ($db->next_record()) { //***********if there is already a language copy from it + $firstlang = $db->f("idlang"); + + //***********duplicate entries in 'art_lang'-table************* + $sql = "SELECT * FROM ".$cfg["tab"]["art_lang"]." AS A, ".$cfg["tab"]["art"]." AS B WHERE A.idart=B.idart AND B.idclient='".Contenido_Security::toInteger($client)."' AND idlang!='0' + AND idlang='".Contenido_Security::toInteger($firstlang)."'"; + $db->query($sql); + + /* Array storing the article->templatecfg allocations for later reallocation */ + $cfg_art = array(); + + while ($db->next_record()) { + /* Store the idartlang->idplcfg allocation for later reallocation */ + $cfg_art[] = array('idartlang' => $db->f('idartlang'), + 'idtplcfg' => $db->f('idtplcfg')); + + $keystring = ""; + $valuestring = ""; + + while (list($key, $value) = each($db->Record)) { + if (is_string($key) && (strpos($key, 'idartlang') === false) && (strpos($key, 'idlang') !== 0) && (strpos($key, 'idclient') !== 0)) { + $keystring = $keystring.",".$key; + $valuestring = $valuestring.",'".addslashes($value)."'"; + } elseif (is_string($key) && (strpos($key, 'idartlang') !== false)) { + $tmp_idartlang_alt = $value; + } + } + + $tmp_idartlang_neu = $db2->nextid($cfg["tab"]["art_lang"]); + + $keystring = $keystring.",idartlang"; + $keystring = preg_replace('/,$/', '', $keystring); + $keystring = preg_replace('/^,/', '', $keystring); + $keystring = $keystring.",idlang"; + + $valuestring = $valuestring.",$tmp_idartlang_neu"; + $valuestring = preg_replace('/,$/', '', $valuestring); + $valuestring = preg_replace('/^,/', '', $valuestring); + $valuestring = $valuestring.",$idlang"; + + //********* duplicates entry in DB **************** + $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." (".Contenido_Security::escapeDB($keystring, $db2).") VALUES (".Contenido_Security::escapeDB($valuestring, $db2).")"; + $db2->query($sql); + + //***********duplicate entries in 'cat_lang'-table************* + $sql = "SELECT * FROM ".$cfg["tab"]["content"]." WHERE idartlang='".Contenido_Security::toInteger($tmp_idartlang_alt)."'"; + $db2->query($sql); + + while ($db2->next_record()) { + $keystring = ""; + $valuestring = ""; + while (list($key, $value) = each($db2->Record)) { + if (is_string($key) && (strpos($key, 'idcontent') === false) && (strpos($key, 'idartlang') !== 0)) { + $keystring = $keystring.",".$key; + $valuestring = $valuestring.",'".addslashes($value)."'"; + } + } + $keystring = preg_replace('/,$/', '', $keystring); + $keystring = preg_replace('/^,/', '', $keystring); + $keystring = $keystring.",idartlang"; + + $valuestring = preg_replace('/,$/', '', $valuestring); + $valuestring = preg_replace('/^,/', '', $valuestring); + $valuestring = $valuestring.",$tmp_idartlang_neu"; + + $db3 = new DB_ConLite(); + //********* duplicates entry in DB **************** + $sql = "INSERT INTO ".$cfg["tab"]["content"]." (idcontent, ".Contenido_Security::escapeDB($keystring, $db3).") VALUES ('".Contenido_Security::toInteger($db3->nextid($cfg["tab"]["content"]))."', + ".Contenido_Security::escapeDB($valuestring, $db3).")"; + $db3->query($sql); + } + + //********* make changes to new entry************* + $date = date("Y-m-d H:i:s"); + $sql = "SELECT * FROM ".$cfg["tab"]["art_lang"]." AS A, ".$cfg["tab"]["art"]." AS B WHERE A.idart=B.idart AND B.idclient='".Contenido_Security::toInteger($client)."' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + $db2->query($sql); + while ($db2->next_record()) { + $a_artlang[] = $db2->f("idartlang"); + } + foreach ($a_artlang as $val_artlang) { + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET created='".Contenido_Security::escapeDB($date, $db2)."', lastmodified='0', online='0', author='' WHERE idartlang='".Contenido_Security::toInteger($val_artlang)."'"; + $db2->query($sql); + } + } + + fakeheader(time()); + + /* Duplicate all entries in the 'cat_lang' table */ + $sql = "SELECT + * + FROM + ".$cfg["tab"]["cat_lang"]." AS A, + ".$cfg["tab"]["cat"]." AS B + WHERE + A.idcat=B.idcat AND + B.idclient='".Contenido_Security::toInteger($client)."' AND + idlang='".Contenido_Security::toInteger($firstlang)."'"; + + $db->query($sql); + + /* Array storing the category->template allocations fot later reallocation */ + $cfg_cat = array(); + + while ($db->next_record()) { + + $nextid = $db2->nextid($cfg["tab"]["cat_lang"]); + + $keystring = ""; + $valuestring = ""; + + /* Store the idartlang->idplcfg allocation for later reallocation */ + $cfg_cat[] = array('idcatlang' => $nextid, + 'idtplcfg' => $db->f('idtplcfg')); + + while (list($key, $value) = each($db->Record)) { + if (is_string($key) && (strpos($key, 'idcatlang') === false) && (strpos($key, 'idlang') !== 0) && + (strpos($key, 'idclient') !== 0) && (strpos($key, 'parentid') !== 0) && (strpos($key, 'preid') !== 0) && + (strpos($key, 'postid') !== 0)) { + $keystring = $keystring.",".$key; + $valuestring = $valuestring.",'".addslashes($value)."'"; + } + } + + $keystring = preg_replace('/,$/', '', $keystring); + $keystring = preg_replace('/^,/', '', $keystring); + $keystring = $keystring.",idlang"; + + $valuestring = preg_replace('/,$/', '', $valuestring); + $valuestring = preg_replace('/^,/', '', $valuestring); + $valuestring = $valuestring.",$idlang"; + + //********* duplicates entry in DB **************** + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, ".Contenido_Security::escapeDB($keystring, $db2).") VALUES ('".Contenido_Security::toInteger($nextid)."', ".Contenido_Security::escapeDB($valuestring, $db2).")"; + $db2->query($sql); + + //********* make changes to new entry************* + $sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." AS A, ".$cfg["tab"]["cat"]." AS B WHERE A.idcat=B.idcat AND B.idclient='".Contenido_Security::toInteger($client)."' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + $db2->query($sql); + + while ($db2->next_record()) { + $a_catlang[] = $db2->f("idcatlang"); + } + foreach ($a_catlang as $val_catlang) { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET visible='0' WHERE idcatlang='".Contenido_Security::toInteger($val_catlang)."'"; + $db2->query($sql); + } + + } + + //***********duplicate entries in 'stat'-table************* + $sql = "SELECT * FROM ".$cfg["tab"]["stat"]." WHERE idclient='".Contenido_Security::toInteger($client)."' AND idlang='".Contenido_Security::toInteger($firstlang)."'"; + $db->query($sql); + while ($db->next_record()) { + $keystring = ""; + $valuestring = ""; + while (list($key, $value) = each($db->Record)) { + if (is_string($key) && (strpos($key, 'idstat') === false) && (strpos($key, 'idlang') !== 0)) { + $keystring = $keystring.",".$key; + $valuestring = $valuestring.",'".addslashes($value)."'"; + } + } + $keystring = preg_replace('/,$/', '', $keystring); + $keystring = preg_replace('/^,/', '', $keystring); + $keystring = $keystring.",idlang"; + + $valuestring = preg_replace('/,$/', '', $valuestring); + $valuestring = preg_replace('/^,/', '', $valuestring); + $valuestring = $valuestring.",$idlang"; + + $db2 = new DB_ConLite(); + //********* duplicates entry in DB **************** + $sql = "INSERT INTO ".$cfg["tab"]["stat"]." (idstat, ".Contenido_Security::escapeDB($keystring, $db2).") VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["stat"]))."', ".Contenido_Security::escapeDB($valuestring, $db2).")"; + $db2->query($sql); + + //********* make changes to new entry************* + $sql = "UPDATE ".$cfg["tab"]["stat"]." SET visited='0' WHERE idclient='".Contenido_Security::toInteger($client)."' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + $db2->query($sql); + } + + fakeheader(time()); + + //***********duplicate entries in 'tpl_conf'-table************* + $sql = "SELECT * FROM ".$cfg["tab"]["tpl_conf"]; + $db->query($sql); + + /* Array storing the category->template allocations fot later reallocation */ + $cfg_old_new = array(); + + while ($db->next_record()) { + $nextid = $db2->nextid($cfg["tab"]["tpl_conf"]); + + /* Array storing the category->template allocations fot later reallocation */ + $cfg_old_new[] = array('oldidtplcfg' => $db->f('idtplcfg'), + 'newidtplcfg' => $nextid); + + $keystring = ""; + $valuestring = ""; + + while (list($key, $value) = each($db->Record)) { + if (is_string($key) && (strpos($key, 'idtplcfg') === false) && (strpos($key, 'idlang') !== 0)) { + $keystring = $keystring.",".$key; + $valuestring = $valuestring.",'".addslashes($value)."'"; + } + } + + $keystring = preg_replace('/,$/', '', $keystring); + $keystring = preg_replace('/^,/', '', $keystring); + + $valuestring = preg_replace('/,$/', '', $valuestring); + $valuestring = preg_replace('/^,/', '', $valuestring); + + //********* duplicates entry in DB **************** + $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, ".Contenido_Security::escapeDB($keystring, $db2).") VALUES ('".Contenido_Security::toInteger($nextid)."', ".Contenido_Security::escapeDB($valuestring, $db2).")"; + $db2->query($sql); + + } + + /* + - REMARK - JL - 15.07.03 + + Available tpl-cfg allocation arrays are: + + $cfg_cat = array('idcatlang' => n, + 'idtplcfg' => n); + + $cfg_art = array('idartlang' => n, + 'idtplcfg' => n); + + $cfg_old_new = array('oldidtplcfg' => n, + 'newidtplcfg' => n); + */ + + /* Copy the template configuration data */ + if (is_array($cfg_old_new)) { + foreach ($cfg_old_new as $data) { + $oldidtplcfg = $data['oldidtplcfg']; + $newidtplcfg = $data['newidtplcfg']; + + $sql = "SELECT number, container FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($oldidtplcfg)."' ORDER BY number ASC"; + $db->query($sql); + + $container_data = array(); + + while ($db->next_record()) { + $container_data[$db->f('number')] = $db->f('container'); + } + + if (is_array($container_data)) { + foreach ($container_data as $number => $data) { + $nextid = $db->nextid($cfg["tab"]["container_conf"]); + $sql = "INSERT INTO ".$cfg["tab"]["container_conf"]. " + (idcontainerc, idtplcfg, number, container) VALUES ('".Contenido_Security::toInteger($nextid)."', '".Contenido_Security::toInteger($newidtplcfg)."', + '".Contenido_Security::toInteger($number)."', '".Contenido_Security::escapeDB($data, $db)."')"; + $db->query($sql); + } + } + } + } + + /* Reallocate the category -> templatecfg allocations */ + if (is_array($cfg_cat)) { + foreach($cfg_cat as $data) { + if ($data['idtplcfg'] != 0) { + // Category has a configuration + foreach ($cfg_old_new as $arr) { + if ($data['idtplcfg'] == $arr['oldidtplcfg']) { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET idtplcfg = '".Contenido_Security::toInteger($arr['newidtplcfg'])."' WHERE idcatlang = '".Contenido_Security::toInteger($data['idcatlang'])."'"; + $db->query($sql); + } + } + } + } + } + + /* Reallocate the article -> templatecfg allocations */ + if (is_array($cfg_art)) { + foreach($cfg_art as $data) { + if ($data['idtplcfg'] != 0) { + // Category has a configuration + foreach ($cfg_old_new as $arr) { + if ($data['idtplcfg'] == $arr['oldidtplcfg']) { + // We have a match :) + $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET idtplcfg = '".Contenido_Security::toInteger($arr['newidtplcfg'])."' WHERE idartlang = '".Contenido_Security::toInteger($data['idartlang'])."'"; + $db->query($sql); + } + } + } + } + } + } + + /* Update code */ + conGenerateCodeForAllarts(); +} + + +/** + * Delete a language + * + * @author Jan Lengowski + * @author Olaf Niemann + * @copyright four for business AG + */ +function langDeleteLanguage($idlang, $idclient = "") { + global $db, $sess, $client, $cfg, $notification; + + $deleteok = 1; + + // Bugfix: New idclient parameter introduced, as Administration -> Languages + // is used for different clients to delete the language + + // Use global client id, if idclient not specified (former behaviour) + // Note, that this check also have been added for the action in the database + // - just to be equal to langNewLanguage + if (!is_numeric($idclient)) { + $idclient = $client; + } + + //************ check if there are still arts online + $sql = "SELECT * FROM ".$cfg["tab"]["art_lang"]." AS A, ".$cfg["tab"]["art"]." AS B WHERE A.idart=B.idart AND B.idclient='".Contenido_Security::toInteger($idclient)."' + AND A.idlang='".Contenido_Security::toInteger($idlang)."' AND A.online='1'"; + $db->query($sql); + if ($db->next_record()) { + conDeleteArt($db->f("idart")); + } + + //************ check if there are visible categories + $sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." AS A, ".$cfg["tab"]["cat"]." AS B WHERE A.idcat=B.idcat AND B.idclient='".Contenido_Security::toInteger($idclient)."' + AND A.idlang='".Contenido_Security::toInteger($idlang)."' AND A.visible='1'"; + $db->query($sql); + if ($db->next_record()) { + strDeleteCategory($db->f("idcat")); + } + + if ($deleteok == 1) { + //********* check if this is the clients last language to be deleted, if yes delete from art, cat, and cat_art as well ******* + $lastlanguage = 0; + $sql = "SELECT COUNT(*) FROM ".$cfg["tab"]["clients_lang"]." WHERE idclient='".Contenido_Security::toInteger($idclient)."'"; + $db->query($sql); + $db->next_record(); + if ($db->f(0) == 1) { + $lastlanguage = 1; + } + + //********** delete from 'art_lang'-table ************* + $sql = "SELECT A.idtplcfg AS idtplcfg, idartlang, A.idart FROM ".$cfg["tab"]["art_lang"]." AS A, ".$cfg["tab"]["art"]." AS B WHERE A.idart=B.idart AND B.idclient='".Contenido_Security::toInteger($idclient)."' + AND idlang!='0' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); + while ($db->next_record()) { + $a_idartlang[] = $db->f("idartlang"); + $a_idart[] = $db->f("idart"); + $a_idtplcfg[] = $db->f("idtplcfg"); + } + if (is_array($a_idartlang)) { + foreach ($a_idartlang as $value) { + $sql = "DELETE FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["content"]." WHERE idartlang='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["link"]." WHERE idartlang='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + } + } + + if ($lastlanguage == 1) { + if (is_array($a_idart)) { + foreach ($a_idart as $value) { + $sql = "DELETE FROM ".$cfg["tab"]["art"]." WHERE idart='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + $sql = "DELETE FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + } + } + } + + //********** delete from 'cat_lang'-table ************* + $sql = "SELECT A.idtplcfg AS idtplcfg, idcatlang, A.idcat FROM ".$cfg["tab"]["cat_lang"]." AS A, ".$cfg["tab"]["cat"]." AS B WHERE A.idcat=B.idcat AND B.idclient='".Contenido_Security::toInteger($idclient)."' + AND idlang!='0' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); + while ($db->next_record()) { + $a_idcatlang[] = $db->f("idcatlang"); + $a_idcat[] = $db->f("idcat"); + $a_idtplcfg[] = $db->f("idtplcfg"); // added + } + if (is_array($a_idcatlang)) { + foreach ($a_idcatlang as $value) { + $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcatlang='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + } + } + if ($lastlanguage == 1) { + if (is_array($a_idcat)) { + foreach ($a_idcat as $value) { + $sql = "DELETE FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + $sql = "DELETE FROM ".$cfg["tab"]["cat_tree"]." WHERE idcat='".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + } + } + } + + //********** delete from 'stat'-table ************* + $sql = "DELETE FROM ".$cfg["tab"]["stat"]." WHERE idlang='".Contenido_Security::toInteger($idlang)."' AND idclient='".Contenido_Security::toInteger($idclient)."'"; + $db->query($sql); + + //********** delete from 'code'-table ************* + $sql = "DELETE FROM ".$cfg["tab"]["code"]." WHERE idlang='".Contenido_Security::toInteger($idlang)."' AND idclient='".Contenido_Security::toInteger($idclient)."'"; + $db->query($sql); + + if (is_array($a_idtplcfg)) { + foreach ($a_idtplcfg as $tplcfg) { + if ($tplcfg != 0) { + //********** delete from 'tpl_conf'-table ************* + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($tplcfg)."'"; + $db->query($sql); + + //********** delete from 'container_conf'-table ************* + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($tplcfg)."'"; + $db->query($sql); + } + } + } + + //*********** delete from 'clients_lang'-table************* + $sql = "DELETE FROM ".$cfg["tab"]["clients_lang"]." WHERE idclient='".Contenido_Security::toInteger($idclient)."' AND idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); + + //*********** delete from 'lang'-table************* + $sql = "DELETE FROM ".$cfg["tab"]["lang"]." WHERE idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); + } else { + return $notification->messageBox("error", i18n("Could not delete language"),0); + } +} + + +/** + * Deactivate a language + * + * @author Jan Lengowski + * @author Olaf Niemann + * @copyright four for business AG + */ +function langActivateDeactivateLanguage($idlang, $active) { + global $db; + global $sess; + global $client; + global $cfg; + + $sql = "UPDATE ".$cfg["tab"]["lang"]." SET active='".Contenido_Security::toInteger($active)."' WHERE idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); +} + + +function langGetTextDirection ($idlang, $db = null) { + global $cfg; + + if ($db == null || !is_object($db)) { + $db = new DB_ConLite; + } + + $sql = "SELECT direction FROM ".$cfg["tab"]["lang"] ." WHERE idlang='".Contenido_Security::toInteger($idlang)."'"; + $db->query($sql); + + if ($db->next_record()) { + $direction = $db->f("direction"); + + if ($direction != "ltr" && $direction != "rtl") { + return "ltr"; + } else { + return $direction; + } + } else { + return "ltr"; + } +} + +?> \ No newline at end of file diff --git a/conlite/includes/functions.lay.php b/conlite/includes/functions.lay.php new file mode 100644 index 0000000..2ea265d --- /dev/null +++ b/conlite/includes/functions.lay.php @@ -0,0 +1,133 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003 + * modified 2008-06-26, Frederic Schneider, add security fix + * + * $Id: functions.lay.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude ("includes", "functions.tpl.php"); +cInclude ("includes", "functions.con.php"); + +/** + * Edit or Create a new layout + * + * @param int $idlay Id of the Layout + * @param string $name Name of the Layout + * @param string $description Description of the Layout + * @param string $code Layout HTML Code + * @return int $idlay Id of the new or edited Layout + * + * @author Olaf Niemann + * @copryright four for business AG + */ +function layEditLayout($idlay, $name, $description, $code) { + + global $client, $auth, $cfg, $sess, $area_tree, $perm, $cfgClient; + + $db2= new DB_ConLite; + $db = new DB_ConLite; + + $date = date("Y-m-d H:i:s"); + $author = "".$auth->auth["uname"].""; + $description = (string) stripslashes($description); + + set_magic_quotes_gpc($name); + set_magic_quotes_gpc($description); + set_magic_quotes_gpc($code); + + if (strlen(trim($name)) == 0) { + $name = i18n('-- Unnamed Layout --'); + } + + /** + * START TRACK VERSION + **/ + $oVersion = new VersionLayout($idlay, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Create new Layout Version in cms/version/layout/ + $oVersion->createNewVersion(); + + /** + * END TRACK VERSION + **/ + + + if (!$idlay) { + + $tmp_newid = $db->nextid($cfg["tab"]["lay"]); + $idlay = $tmp_newid; + + $sql = "INSERT INTO ".$cfg["tab"]["lay"]." (idlay,name, description, deletable, code, idclient, author, created, lastmodified) VALUES ('".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::escapeDB($name, $db)."', + '".Contenido_Security::escapeDB($description, $db)."', '1', '".$code."', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($author, $db)."', + '".Contenido_Security::escapeDB($date, $db)."', '".Contenido_Security::escapeDB($date, $db)."')"; + $db->query($sql); + + // set correct rights for element + cInclude ("includes", "functions.rights.php"); + createRightsForElement("lay", $idlay); + + return $idlay; + + } else { + + $sql = "UPDATE ".$cfg["tab"]["lay"]." SET name='".Contenido_Security::escapeDB($name, $db)."', description='".Contenido_Security::escapeDB($description, $db)."', code='".$code."', + author='".Contenido_Security::escapeDB($author, $db)."', lastmodified='".Contenido_Security::escapeDB($date, $db)."' WHERE idlay='".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + + /* Update CODE table*/ + conGenerateCodeForAllartsUsingLayout($idlay); + + return $idlay; + } + +} + +function layDeleteLayout($idlay) { + global $db; + global $client; + global $cfg; + global $area_tree; + global $perm; + + $sql = "SELECT * FROM ".$cfg["tab"]["tpl"]." WHERE idlay='".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + if ($db->next_record()) { + return "0301"; // layout is still in use, you cannot delete it + } else { + $sql = "DELETE FROM ".$cfg["tab"]["lay"]." WHERE idlay='".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + } + + // delete rights for element + cInclude ("includes", "functions.rights.php"); + deleteRightsForElement("lay", $idlay); + +} +?> \ No newline at end of file diff --git a/conlite/includes/functions.mod.php b/conlite/includes/functions.mod.php new file mode 100644 index 0000000..febd09f --- /dev/null +++ b/conlite/includes/functions.mod.php @@ -0,0 +1,214 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003 + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2010-08-13, Dominik Ziegler, fixed CON-337 - added update of lastmodified + * + * $Id: functions.mod.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude ("includes", "functions.tpl.php"); +cInclude ("includes", "functions.con.php"); + +function modEditModule($idmod, $name, $description, $input, $output, $template, $type = "") { + global $db, $client, $cfgClient, $auth, $cfg, $sess, $area_tree, $perm, $frame; + + $date = date("Y-m-d H:i:s"); + $author = $auth->auth["uname"]; + + /** + * START TRACK VERSION + **/ + $oVersion = new VersionModule($idmod, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Create new Module Version in cms/version/module/ + $oVersion->createNewVersion(); + + /** + * END TRACK VERSION + **/ + + if (!$idmod) { + $cApiModuleCollection = new cApiModuleCollection; + $cApiModule = $cApiModuleCollection->create($name); + + $idmod = $cApiModule->get("idmod"); + + cInclude ("includes", "functions.rights.php"); + createRightsForElement("mod", $idmod); + } else { + $cApiModule = new cApiModule; + $cApiModule->loadByPrimaryKey($idmod); + } + + /* dceModFileEdit (c)2009-2011 www.dceonline.de */ + if ($cfg['dceModEdit']['use'] + || $cApiModule->get("name") != stripslashes($name) + || $cApiModule->get("output") != stripslashes($output) + || $cApiModule->get("template") != stripslashes($template) + || $cApiModule->get("description") != stripslashes($description) + || $cApiModule->get("input") != stripslashes($input) + || $cApiModule->get("type") != stripslashes($type)) { + + $cApiModule->set("name", $name); + $cApiModule->set("output", $output); + $cApiModule->set("template", $template); + $cApiModule->set("description", $description); + $cApiModule->set("input", $input); + $cApiModule->set("type", $type); + $cApiModule->set("lastmodified", $date); + + $cApiModule->store(); + } + return $idmod; +} + +function modDeleteModule($idmod) +{ + # Global vars + global $db, $sess, $client, $cfg, $area_tree, $perm; + + $sql = "DELETE FROM ".$cfg["tab"]["mod"]." WHERE idmod = '".Contenido_Security::toInteger($idmod)."' AND idclient = '".Contenido_Security::toInteger($client)."'"; + $db->query($sql); + + + // delete rights for element + cInclude ("includes", "functions.rights.php"); + deleteRightsForElement("mod", $idmod); +} + +// $code: Code to evaluate +// $id: Unique ID for the test function +// $mode: true if start in php mode, otherwise false +// Returns true or false + +function modTestModule ($code, $id, $output = false) +{ + global $cfg, $modErrorMessage; + + $magicvalue = 0; + + $db = new DB_ConLite; + + /* Put a $ in front of all CMS variables + to prevent PHP error messages */ + $sql = "SELECT type FROM ".$cfg["tab"]["type"]; + $db->query($sql); + + while ($db->next_record()) + { + $code = str_replace($db->f("type").'[','$'.$db->f("type").'[', $code); + } + + $code = preg_replace(',\[(\d+)?CMS_VALUE\[(\d+)\](\d+)?\],i', '[\1\2\3]', $code); + + $code = str_replace('CMS_VALUE','$CMS_VALUE', $code); + $code = str_replace('CMS_VAR','$CMS_VAR', $code); + + /* If the module is an output module, escape PHP since + all output modules enter php mode */ + if ($output == true) + { + $code = "?>\n" . $code . "\n"); + @ini_set("error_append_string",""); + + /* Turn off output buffering and error reporting, eval the code */ + ob_start(); + $display_errors = ini_get("display_errors"); + @ini_set("display_errors", true); + $output = eval($code); + @ini_set("display_errors", $display_errors); + + /* Get the buffer contents and turn it on again */ + $output = ob_get_contents(); + ob_end_clean(); + + /* Remove the prepend and append settings */ + /* 19.09.2006: Following lines have been disabled, as ini_restore has been disabled + by some hosters as there is a security leak in PHP (PHP <= 5.1.6 & <= 4.4.4) */ + //ini_restore("error_prepend_string"); + //ini_restore("error_append_string"); + @ini_set("error_prepend_string", $sErs); // Restoring settings (see above) + @ini_set("error_append_string", $sEas); // Restoring settings (see above) + + /* Strip out the error message */ + $start = strpos($output, ""); + $end = strpos($output, ""); + + /* More stripping: Users shouldnt see where the file + is located, but they should see the error line */ + if ($start !== false) + { + $start = strpos($output, "eval()"); + + $modErrorMessage = substr($output, $start, $end - $start); + + /* Kill that HTML formatting */ + $modErrorMessage = str_replace("","",$modErrorMessage); + $modErrorMessage = str_replace("","",$modErrorMessage); + $modErrorMessage = str_replace("
","",$modErrorMessage); + $modErrorMessage = str_replace("
","",$modErrorMessage); + } + + /* check if there are any php short tags in code, and display error*/ + $bHasShortTags = false; + if (preg_match('/<\?\s+/', $code) && $magicvalue == 941) { + $bHasShortTags = true; + $modErrorMessage = i18n('Please do not use short open Tags. (Use \ No newline at end of file diff --git a/conlite/includes/functions.pathresolver.php b/conlite/includes/functions.pathresolver.php new file mode 100644 index 0000000..7c44554 --- /dev/null +++ b/conlite/includes/functions.pathresolver.php @@ -0,0 +1,405 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2006-12-14, init array $results in fct prResolvePathViaURLNames, prResolvePathViaCategoryNames, return type is now integer + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-08-11, Bilal Arslan, Change prResolvePathViaCategoryNames function for take current path language id! + * modified 2008-11-11, Andreas Lindner, Change prResolvePathViaCategoryNames, suppress change of current language if an url path + * is found in current and at least one more language + * modified 2009-10-23, Murat Purc, removed deprecated function (PHP 5.3 ready) and formatting + * + * $Id: functions.pathresolver.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * prResolvePathViaURLNames: Resolves a path using some fuzzy logic. + * + * Warning: If you use this function, try to pass a "good" path. This + * function doesn't guarantee that the matches are logically + * best-matches. + * + * This function operates on the category aliases. It compares the given path with the urlpaths generated by function + * prCreateURLNameLocationString() based on category aliases. + * + * @param $path string Path to resolve + * @return integer Closest matching category ID (idcat) + */ +function prResolvePathViaURLNames($path) { + $handle = startTiming("prResolvePathViaURLNames", array ($path)); + + global $cfg, $lang, $client; + + /* Initialize variables */ + $db = new DB_ConLite; + $categories = array(); + $results = array(); + + /* Pre-process path */ + $path = strtolower(str_replace(" ", "", $path)); + + if ($cfg["pathresolve_heapcache"] == true) { + $pathresolve_tablename = $cfg["sql"]["sqlprefix"]."_pathresolve_cache"; + + $sql = "SHOW TABLES LIKE '".Contenido_Security::escapeDB($pathresolve_tablename, $db)."'"; + $db->query($sql); + + if (!$db->next_record()) { + /** + * @TODO: Externalize table creation + * + * Important: This is really a hack! Don't use pathresolve_heapcache if you are + * not sure what it does. + */ + $sql = 'CREATE TABLE `'.Contenido_Security::escapeDB($pathresolve_tablename, $db).'` ( + `idpathresolvecache` INT( 10 ) NOT NULL PRIMARY KEY , + `path` VARCHAR( 255 ) NOT NULL , + `idcat` INT( 10 ) NOT NULL , + `idlang` INT( 10 ) NOT NULL , + `lastcached` INT(10) NOT NULL + ) TYPE = HEAP;'; + + $db->query($sql); + } + + $sql = "SELECT idpathresolvecache, idcat, lastcached FROM %s WHERE path LIKE '%s' AND idlang='%s' ORDER BY lastcached DESC LIMIT 1"; + $db->query(sprintf($sql, Contenido_Security::escapeDB($pathresolve_tablename, $db), Contenido_Security::escapeDB($path, $db), Contenido_Security::toInteger($lang))); + + if ($db->next_record()) { + if (isset ($cfg["pathresolve_heapcache_time"])) { + $iCacheTime = $cfg["pathresolve_heapcache_time"]; + } else { + $iCacheTime = 60 * 60 * 24; + } + + $tmp_idcat = $db->f("idcat"); + + if ($db->f("lastcached") + $iCacheTime < time()) { + $sql = "DELETE FROM %s WHERE idpathresolvecache = '%s'"; + $db->query(sprintf($sql, Contenido_Security::escapeDB($pathresolve_tablename, $db), Contenido_Security::toInteger($db->f("idpathresolvecache")))); + } else { + return $db->f("idcat"); + } + } + } + + /* Fetch all category names, build path strings */ +// change the where statement for get all languages + $sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND C.idlang='".Contenido_Security::toInteger($lang)."' + AND C.visible = 1 AND B.idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idtree"; + $db->query($sql); + + $catpath = array (); + while ($db->next_record()) { + $cat_str = ""; + prCreateURLNameLocationString($db->f("idcat"), "/", $cat_str, false, "", 0, 0, true, true); + + /* Store path */ + $catpath[$db->f("idcat")] = $cat_str; + $catnames[$db->f("idcat")] = $db->f("name"); + $catlevels[$db->f("idcat")] = $db->f("level"); + } + + /* Compare strings using the similar_text algorythm */ + $percent = 0; + foreach ($catpath as $key => $value) { + $value = strtolower(str_replace(" ", "", $value)); + + similar_text($value, $path, $percent); + + $firstpath = strpos($value, "/"); + + if ($firstpath !== 0) { + $xpath = substr($value, $firstpath); + $ypath = substr($path, 0, strlen($path) - 1); + if ($xpath == $ypath) { + $results[$key] = 100; + } else { + $results[$key] = $percent; + } + } else { + $results[$key] = $percent; + } + + } + + arsort($results, SORT_NUMERIC); + reset($results); + + endAndLogTiming($handle); + + if ($cfg["pathresolve_heapcache"] == true) { + $nid = $db->nextid($pathresolve_tablename); + + $sql = "INSERT INTO %s SET idpathresolvecache='%s', path='%s', idcat='%s', idlang='%s', lastcached=%s"; + $db->query(sprintf($sql, Contenido_Security::toInteger($pathresolve_tablename), Contenido_Security::toInteger($nid), Contenido_Security::escapeDB($path, $db), Contenido_Security::toInteger(key($results)), Contenido_Security::toInteger($lang), time())); + } + + return (int) key($results); +} + +/** + * prResolvePathViaCategoryNames: Resolves a path using some fuzzy logic. + * + * Warning: If you use this function, try to pass a "good" path. This + * function doesn't guarantee that the matches are logically + * best-matches. + * + * This function operates on the actual category names. + * + * @param $path string Path to resolve + * @return integer Closest matching category ID (idcat) + */ +function prResolvePathViaCategoryNames($path, &$iLangCheck) { + $handle = startTiming("prResolvePathViaCategoryNames", array ($path)); + + global $cfg, $lang, $client; + + /* Initialize variables */ + $db = new DB_ConLite; + $categories = array (); + $results = array(); + $iLangCheckOrg = $iLangCheck; + + /* Added since 2008-08 from Bilal Arslan */ +// To take only path body + if (preg_match('/^\/(.*)\/$/', $path, $aResults)) { + $aResult = explode("/", $aResults[1]); + } elseif (preg_match('/^\/(.*)$/', $path, $aResults)) { + $aResult = explode("/", $aResults[1]); + } else { + $aResults[1] = $path; + } + + $aResults[1] = strtolower(preg_replace('/-/', ' ', $aResults[1])); + +// Init to Compare, save path in array + $aPathsToCompare = explode("/", $aResults[1]); + $iCountPath = count($aPathsToCompare); + +// init lang id + $iLangCheck=0; + + /* Pre-process path */ + $path = strtolower(str_replace(" ", "", $path)); + + /* Fetch all category names, build path strings */ +// change the where statement for get all languages + $sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat + AND C.visible = 1 AND B.idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idtree"; + $db->query($sql); + + $catpath = array (); + $arrLangMatches = array(); + + while ($db->next_record()) { + $cat_str = ""; + $aTemp = ""; + $iFor = 0; + $bLang = false; + +// $level is changeless 0!!! + conCreateLocationString($db->f("idcat"), "/", $cat_str, false, '', 0, $db->f("idlang")); + /* Store path */ + $catpath[$db->f("idcat")] = $cat_str; + $catnames[$db->f("idcat")] = $db->f("name"); + $catlevels[$db->f("idcat")] = $db->f("level"); + +// Init variables for take a language id + $aTemp = strtolower($cat_str); + $aDBToCompare = explode("/", $aTemp); + $iCountDB = count($aDBToCompare); + $iCountDBFor = $iCountDB - 1; +// take min. count of two arrays + ($iCountDB > $iCountPath) ? $iFor = $iCountPath : $iFor = $iCountDB; + $iCountM = $iFor-1; + + for ($i=0; $i<$iFor; $i++) { + if ($aPathsToCompare[$iCountM] == $aDBToCompare[$iCountDBFor]) { + $bLang = true; + } else { + $bLang = false; + } + $iCountM--; + $iCountDBFor--; +// compare, only if current element is lastone and we are in true path + if($i == $iFor-1 && $bLang) { + $iLangCheck = $db->f("idlang"); + $arrLangMatches[] = $iLangCheck; + } + } + + } + + #Suppress wrongly language change if url name can be found in current language + if ($iLangCheckOrg == 0) { + if (in_array($lang, $arrLangMatches)) { + $iLangCheck = $lang; + } + } + + /* Compare strings using the similar_text algorythm */ + $percent = 0; + foreach ($catpath as $key => $value) { + $value = strtolower(str_replace(" ", "", $value)); + + similar_text($value, $path, $percent); + + $results[$key] = $percent; + } + + foreach ($catnames as $key => $value) { + $value = strtolower(str_replace(" ", "", $value)); + similar_text($value, $path, $percent); + + /* Apply weight */ + $percent = $percent * $catlevels[$key]; + + if ($results[$key] > $percent) { + $results[$key] = $percent; + } + } + + arsort($results, SORT_NUMERIC); + reset($results); + + endAndLogTiming($handle); + return (int) key($results); +} + +/** + * Recursive function to create an URL name location string + * + * @param int $idcat ID of the starting category + * @param string $seperator Seperation string + * @param string $cat_str Category location string (by reference) + * @param boolean $makeLink create location string with links + * @param string $linkClass stylesheet class for the links + * @param integer first navigation level location string should be printed out (first level = 0!!) + * + * @return string location string + * + * @author Jan Lengowski + * @author Marco Jahn + * + * @copyright four for business AG + */ +function prCreateURLNameLocationString($idcat, $seperator, & $cat_str, $makeLink = false, $linkClass = "", + $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false) { + global $cfg, $client, $cfgClient, $lang, $sess, $_URLlocationStringCache; + + if ($final == true) { + $cat_str = ""; + } + + if ($idcat == 0) { + $cat_str = "Lost and Found"; + return; + } + + if ($uselang == 0) { + $uselang = $lang; + } + + if ($final == true && $usecache == true) { + if (!is_array($_URLlocationStringCache)) { + if (file_exists($cfgClient[$client]["path"]["frontend"]."cache/locationstring-url-cache-$uselang.txt")) { + $_URLlocationStringCache = unserialize(file_get_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-url-cache-$uselang.txt")); + } else { + $_URLlocationStringCache = array (); + } + } + + if (array_key_exists($idcat, $_URLlocationStringCache)) { + if ($_URLlocationStringCache[$idcat]["expires"] > time()) { + $cat_str = $_URLlocationStringCache[$idcat]["name"]; + return; + } + } + } + + $db = new DB_ConLite; + + $sql = "SELECT + a.urlname AS urlname, + a.name AS name, + a.idcat AS idcat, + b.parentid AS parentid, + c.level as level + FROM + ".$cfg["tab"]["cat_lang"]." AS a, + ".$cfg["tab"]["cat"]." AS b, + ".$cfg["tab"]["cat_tree"]." AS c + WHERE + a.idlang = '".Contenido_Security::toInteger($uselang)."' AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idcat = '".Contenido_Security::toInteger($idcat)."' AND + a.idcat = b.idcat AND + c.idcat = b.idcat"; + + $db->query($sql); + $db->next_record(); + + if ($db->f("level") >= $firstTreeElementToUse) { + $name = $db->f("urlname"); + + if (trim($name) == "") { + $name = $db->f("name"); + } + + $parentid = $db->f("parentid"); + + //create link + if ($makeLink == true) { + $linkUrl = $sess->url("front_content.php?idcat=$idcat"); + $name = ''.$name.''; + } + + $tmp_cat_str = $name.$seperator.$cat_str; + $cat_str = $tmp_cat_str; + } + + if ($parentid != 0) { + prCreateURLNameLocationString($parentid, $seperator, $cat_str, $makeLink, $linkClass, $firstTreeElementToUse, $uselang, false, $usecache); + } else { + $sep_length = strlen($seperator); + $str_length = strlen($cat_str); + $tmp_length = $str_length - $sep_length; + $cat_str = substr($cat_str, 0, $tmp_length); + } + + if ($final == true && $usecache == true) { + $_URLlocationStringCache[$idcat]["name"] = $cat_str; + $_URLlocationStringCache[$idcat]["expires"] = time() + 3600; + + if (is_writable($cfgClient[$client]["path"]["frontend"]."cache/") || (strtolower(substr(PHP_OS, 0, 3)) == "win")) { + file_put_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-url-cache-$uselang.txt", serialize($_URLlocationStringCache)); + } + } +} +?> diff --git a/conlite/includes/functions.php54.php b/conlite/includes/functions.php54.php new file mode 100644 index 0000000..a39a4d6 --- /dev/null +++ b/conlite/includes/functions.php54.php @@ -0,0 +1,149 @@ + + * @copyright (c) 2014, www.conlite.org + * @version $Rev: 362 $ + * + * $Id: functions.php54.php 362 2015-10-05 16:31:26Z oldperl $ + */ + +// security +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * + * @return string + */ +function clCheckForPhp54() { + if(!defined("CL_PHP54")) { + /** + * PHP-version equal or greater PHP 5.4 + * @constant CL_PHP54 phpversion >= 5.4 + */ + define('CL_PHP54', version_compare(PHP_VERSION, '5.4.0', '>=') ? 1:0); + } + return CL_PHP54; +} + +function clPhp54FixedFunc($funcname, $value, $flags = '', $encoding = '') { + if(clCheckForPhp54()) { + if($funcname == "get_html_translation_table") { + $value = ($value == '') ? HTML_SPECIALCHARS : $value; + } + $flags = (empty($flags))?ENT_COMPAT|ENT_HTML401:$flags; + $encoding = (empty($encoding))?'ISO-8859-1':$encoding; + } else { + $flags = (empty($flags))?ENT_COMPAT:$flags; + } + + if($funcname == "get_html_translation_table") { + return $funcname($value, $flags); + } else { + return $funcname($value, $flags, $encoding); + } +} + +/** + * + * @uses clPhp54FixedFunc multi fix func for PHP5.4 + * @author Ortwin Pinke + * + * @param string $value + * @param mixed $flags + * @param string $encoding + * @return string + */ +function clHtmlSpecialChars($value, $flags = '', $encoding = '') { + return clPhp54FixedFunc("htmlspecialchars", $value, $flags, $encoding); +} + +/** + * + * @uses clPhp54FixedFunc multi fix func for PHP5.4 + * @author Ortwin Pinke + * + * @param string $value + * @param mixed $flags + * @param string $encoding + * @return string + */ +function clHtmlEntityDecode($value, $flags = '', $encoding = '') { + return clPhp54FixedFunc("html_entity_decode", $value, $flags, $encoding); +} + +/** + * + * @uses clPhp54FixedFunc multi fix func for PHP5.4 + * @author Ortwin Pinke + * + * @param string $value + * @param mixed $flags + * @param string $encoding + * @return string + */ +function clHtmlEntities($value, $flags = '', $encoding = '') { + return clPhp54FixedFunc("htmlentities", $value, $flags, $encoding); +} + +/** + * + * @uses clPhp54FixedFunc multi fix func for PHP5.4 + * @author Ortwin Pinke + * + * @param string $table + * @param mixed $flags + * @return string + */ +function clGetHtmlTranslationTable($table = '', $flags = '') { + return clPhp54FixedFunc("get_html_translation_table", $table, $flags); +} + + +// hold old functions from con 4.8 but use new ConLite functions, mark them as deprecated + +/** + * Use compatible clHtmlSpecialChars instead + * @deprecated since version 2.0 + */ +if (function_exists('conHtmlSpecialChars') == false) { + function conHtmlSpecialChars($value, $flags = '', $encoding = '') { + return clHtmlSpecialChars($value, $flags, $encoding); + } +} + +/** + * Use compatible clHtmlEntityDecode instead + * @deprecated since version 2.0 + */ +if (function_exists('conHtmlEntityDecode') == false) { + function conHtmlEntityDecode($value, $flags = '', $encoding = '') { + return clHtmlEntityDecode($value, $flags, $encoding); + } +} + +/** + * Use compatible clHtmlEntities instead + * @deprecated since version 2.0 + */ +if (function_exists('conHtmlentities') == false) { + function conHtmlentities($value, $flags = '', $encoding = '') { + return clHtmlEntities($value, $flags, $encoding); + } +} + +/** + * Use compatible clGetHtmlTranslationTable instead + * @deprecated since version 2.0 + */ +if (function_exists('conGetHtmlTranslationTable') == false) { + function conGetHtmlTranslationTable($table = '', $flags = '') { + return clGetHtmlTranslationTable($table, $flags); + } +} \ No newline at end of file diff --git a/conlite/includes/functions.rights.php b/conlite/includes/functions.rights.php new file mode 100644 index 0000000..a78510e --- /dev/null +++ b/conlite/includes/functions.rights.php @@ -0,0 +1,339 @@ + $iValue) { + $aClients[$iKey] = Contenido_Security::toInteger($aClients[$iKey]); + } + + //Query to check, if langid is in list of clients associated + $sSql = "SELECT * FROM ".$aCfg['tab']['clients_lang']. " WHERE idlang=".$iLang." AND idclient IN ('".implode("','",$aClients)."');"; + + $oDb->query($sSql); + if ($oDb->next_record()) { + return true; + } else { + return false; + } +} + +/** + * Duplicate rights for any element + * + * @param string $area main area name + * @param int $iditem ID of element to copy + * @param int $newiditem ID of the new element + * @param int $idlang ID of lang parameter + * + * @author Martin Horwath + * @copyright dayside.net + */ +function copyRightsForElement($area, $iditem, $newiditem, $idlang = false) +{ + global $cfg, $perm, $auth, $area_tree; + + $db = new DB_ConLite(); + $db2 = new DB_ConLite(); + + // get all user_id values for con_rights + + $userIDContainer = $perm->getGroupsForUser($auth->auth['uid']); // add groups if available + $userIDContainer[] = $auth->auth['uid']; // add user_id of current user + + foreach ($userIDContainer as $key) { + $statement_where2[] = "user_id = '".Contenido_Security::escapeDB($key, $db)."' "; + } + + $where_users = '('.implode(' OR ', $statement_where2 ) .')'; // only duplicate on user and where user is member of + + // get all idarea values for $area + // short way + $AreaContainer = $area_tree[$perm->showareas($area)]; + + // long version start + // get all actions for corresponding area + $AreaActionContainer = array(); + $sql = "SELECT idarea, idaction FROM ".$cfg["tab"]["actions"]." WHERE idarea IN (".implode (',', $AreaContainer).")"; + $db->query($sql); + + while ($db->next_record()) { + $AreaActionContainer[] = array('idarea'=>$db->f('idarea'), 'idaction'=>$db->f('idaction')); + } + + // build sql statement for con_rights + foreach ($AreaActionContainer as $key) { + $statement_where[] = "( idarea = ".Contenido_Security::toInteger($key["idarea"])." AND idaction = ".Contenido_Security::toInteger($key["idaction"])." )"; + } + + $where_area_actions = '('.implode(' OR ', $statement_where ) .')'; // only correct area action pairs possible + + // final sql statement to get all effected elements in con_right + $sql = "SELECT + * + FROM + ".$cfg["tab"]["rights"]." + WHERE + {$where_area_actions} AND + {$where_users} AND + idcat = {$iditem}"; + + // long version end + if ($idlang) { + $sql.= " AND idlang='$idlang'"; + } + + $db->query($sql); + + while ($db->next_record()) { + $sql = "INSERT INTO ".$cfg["tab"]["rights"]." (idright,user_id,idarea,idaction,idcat,idclient,idlang,`type`) VALUES ('".Contenido_Security::toInteger($db2->nextid($cfg["tab"]["rights"]))."', + '".Contenido_Security::escapeDB($db->f("user_id"), $db)."', '".Contenido_Security::toInteger($db->f("idarea"))."', '".Contenido_Security::toInteger($db->f("idaction"))."', + '".Contenido_Security::toInteger($newiditem)."','".Contenido_Security::toInteger($db->f("idclient"))."', '".Contenido_Security::toInteger($db->f("idlang"))."', + '".Contenido_Security::toInteger($db->f("type"))."');"; + $db2->query($sql); + } + + // permissions reloaded... + $perm->load_permissions(true); +} + + +/** + * Create rights for any element + * + * @param string $area main area name + * @param int $iditem ID of new element + * @param int $idlang ID of lang parameter + * + * @author Martin Horwath + * @copyright dayside.net + */ +function createRightsForElement($area, $iditem, $idlang = false) +{ + global $cfg, $perm, $auth, $area_tree, $client; + + if (!is_object($perm)) { + return false; + } + + if (!is_object($auth)) { + return false; + } + + $db = new DB_ConLite(); + $db2 = new DB_ConLite(); + + // get all user_id values for con_rights + + $userIDContainer = $perm->getGroupsForUser($auth->auth['uid']); // add groups if available + $userIDContainer[] = $auth->auth['uid']; // add user_id of current user + + foreach ($userIDContainer as $key) { + $statement_where2[] = "user_id = '".Contenido_Security::toInteger($key)."' "; + } + + $where_users = '('.implode(' OR ', $statement_where2 ) .')'; // only duplicate on user and where user is member of + + // get all idarea values for $area + // short way + $AreaContainer = $area_tree[$perm->showareas($area)]; + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["rights"]." + WHERE + idclient='".Contenido_Security::toInteger($client)."' AND + idarea IN (".implode (',', $AreaContainer).") AND + idcat != 0 AND + idaction!='0' AND + {$where_users}"; + + if ($idlang) { + $sql.= " AND idlang='".Contenido_Security::toInteger($idlang)."'"; + } + + $db->query($sql); + + $RightsContainer = array(); + + while($db->next_record()){ + $RightsContainer[$db->f('user_id')][$db->f('idlang')][$db->f('type')][$db->f('idaction')] = $db->f('idarea'); + } + + // i found no better way to set the rights + // double entries should not be possible anymore... + + foreach ($RightsContainer as $userid=>$LangContainer) { + foreach ($LangContainer as $idlang=>$TypeContainer) { + foreach ($TypeContainer as $type=>$ActionContainer) { + foreach ($ActionContainer as $idaction=>$idarea) { + $sql = "INSERT INTO ".$cfg["tab"]["rights"]." + (idright, user_id,idarea,idaction,idcat,idclient,idlang,`type`) + VALUES ('".Contenido_Security::toInteger($db2->nextid($cfg["tab"]["rights"]))."', '".Contenido_Security::toInteger($userid)."', '".Contenido_Security::toInteger($idarea)."', + '".Contenido_Security::toInteger($idaction)."', '".Contenido_Security::toInteger($iditem)."', '".Contenido_Security::toInteger($client)."', + '".Contenido_Security::toInteger($idlang)."', '".Contenido_Security::toInteger($type)."')"; + $db2->query($sql); + } + } + } + } + + // permissions reloaded... + $perm->load_permissions(true); +} + + +/** + * Delete rights for any element + * + * @param string $area main area name + * @param int $iditem ID of new element + * @param int $idlang ID of lang parameter + * + * @author Martin Horwath + * @copyright dayside.net + */ +function deleteRightsForElement($area, $iditem, $idlang = false) +{ + global $cfg, $perm, $area_tree, $client; + + $db = new DB_ConLite(); + + // get all idarea values for $area + $AreaContainer = $area_tree[$perm->showareas(Contenido_Security::escapeDB($area, $db))]; + + $sql = "DELETE FROM ".$cfg["tab"]["rights"]." WHERE idcat='".Contenido_Security::toInteger($iditem)."' AND idclient='".Contenido_Security::toInteger($client)."' AND idarea IN (".implode (',', $AreaContainer).")"; + if ($idlang) { + $sql.= " AND idlang='".Contenido_Security::toInteger($idlang)."'"; + } + $db->query($sql); + + // permissions reloaded... + $perm->load_permissions(true); +} + + +/** + * Builds user/group permissions (sysadmin, admin, client and language) by + * processing request variables ($msysadmin, $madmin, $mclient, $mlang) and + * returns the build permissions array. + * + * @todo Do we really need to add other perms, if the user/group gets the + * 'sysadmin' permission? + * @param bool $bAddUserToClient Flag to add current user to current client, + * if no client is specified. + * @return array + */ +function buildUserOrGroupPermsFromRequest($bAddUserToClient = false) +{ + global $cfg, $msysadmin, $madmin, $mclient, $mlang, $auth, $client; + + $aPerms = array(); + + // check and prevalidation + + $bSysadmin = (isset($msysadmin) && $msysadmin); + + $aAdmin = (isset($madmin) && is_array($madmin)) ? $madmin : array(); + foreach ($aAdmin as $p => $value) { + if (!is_numeric($value)) { + unset($aAdmin[$p]); + } + } + + $aClient = (isset($mclient) && is_array($mclient)) ? $mclient : array(); + foreach ($aClient as $p => $value) { + if (!is_numeric($value)) { + unset($aClient[$p]); + } + } + + $aLang = (isset($mlang) && is_array($mlang)) ? $mlang : array(); + foreach ($aLang as $p => $value) { + if (!is_numeric($value)) { + unset($aLang[$p]); + } + } + + // build permissions array + + if ($bSysadmin) { + $aPerms[] = 'sysadmin'; + } + + foreach ($aAdmin as $value) { + $aPerms[] = sprintf('admin[%s]', $value); + } + + foreach ($aClient as $value) { + $aPerms[] = sprintf('client[%s]', $value); + } + + if (count($aClient) == 0 && $bAddUserToClient) { + // Add user to the current client, if the current user isn't sysadmin and + // no client has been specified. This avoids new accounts which are not + // accessible by the current user (client admin) anymore. + $aUserPerm = explode(',', $auth->auth['perm']); + if (!in_array('sysadmin', $aUserPerm)) { + $aPerms[] = sprintf('client[%s]', $client); + } + } + + if (count($aLang) > 0 && count($aClient) > 0) { + // adding language perms makes sense if we have also at least one selected client + $db = new DB_ConLite(); + foreach ($aLang as $value) { + if (checkLangInClients($aClient, $value, $cfg, $db)) { + $aPerms[] = sprintf('lang[%s]', $value); + } + } + } + + return $aPerms; +} + + +?> \ No newline at end of file diff --git a/conlite/includes/functions.stat.php b/conlite/includes/functions.stat.php new file mode 100644 index 0000000..8134ad7 --- /dev/null +++ b/conlite/includes/functions.stat.php @@ -0,0 +1,1137 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: functions.stat.php 306 2014-03-13 23:03:26Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.database.php"); + +/** + * Displays statistic information layer (a div Tag) + * + * @param int $id Either article or directory id + * @param string $type The type + * @param int $x Style top position + * @param int $y Style left position + * @param int $w Style width + * @param int $h Style height + * @return string Composed info layer + */ +function statsDisplayInfo($id, $type, $x, $y, $w, $h) { + if (strcmp($type,"article" == 0)) { + $text = i18n("Info about article")." ". $id; + } else { + $text = i18n("Info about directory") ." ". $id; + } + + $div = '
'.$text.'
'; + + return $div; +} + +/** + * Archives the current statistics + * + * @param $yearmonth String with the desired archive date (YYYYMM) + * + * @return none + * + */ +function statsArchive($yearmonth) { + global $cfg; + + $yearmonth = preg_replace('/\s/', '0', $yearmonth); + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + $sql = "SELECT + idcatart, idlang, idclient, visited, visitdate + FROM + ".$cfg["tab"]["stat"]; + + $db->query($sql); + + while ($db->next_record()) { + $insertSQL = "INSERT INTO + ".$cfg["tab"]["stat_archive"]." + ( idstatarch, archived, idcatart, idlang, idclient, visited, visitdate) + VALUES + (".Contenido_Security::toInteger($db2->nextid($cfg["tab"]["stat_archive"])).", + ".$yearmonth.", + ".Contenido_Security::toInteger($db->f(0)).", + ".Contenido_Security::toInteger($db->f(1)).", + ".Contenido_Security::toInteger($db->f(2)).", + ".Contenido_Security::toInteger($db->f(3)).", + '".Contenido_Security::escapeDB($db->f(4), $db2)."')"; + + $db2->query($insertSQL); + } + + $sql = "DELETE FROM ".$cfg["tab"]["stat"]; + $db->query($sql); + + // Recreate empty stats + $sql = "SELECT + A.idcatart, + B.idclient, + C.idlang + FROM + ".$cfg["tab"]["cat_art"]." AS A INNER JOIN + ".$cfg["tab"]["cat"]." AS B ON A.idcat = B.idcat INNER JOIN + ".$cfg["tab"]["cat_lang"]." AS C ON A.idcat = C.idcat "; + + $db->query($sql); + + while ($db->next_record()) { + $insertSQL = "INSERT INTO + ".$cfg["tab"]["stat"]." + ( idstat, idcatart, idlang, idclient, visited ) + VALUES ( + ".Contenido_Security::toInteger($db2->nextid($cfg["tab"]["stat"])).", + ".Contenido_Security::toInteger($db->f(0)).", + ".Contenido_Security::toInteger($db->f(2)).", + ".Contenido_Security::toInteger($db->f(1)).", + '0000-00-00 00:00:00')"; + + $db2->query($insertSQL); + } +} + + +/** + * Generates a statistics page + * + * @param $yearmonth Specifies the year and month from which to retrieve the + * statistics, specify "current" to retrieve the current + * entries + * @author Jan Lengowski + * @modified Timo A. Hummel + * @copyright four for business AG + * + * @return none + * + */ +function statsOverviewAll($yearmonth) { + global $cfg, $db, $tpl, $client, $lang; + + $sDisplay = 'table-row'; + + $bUseHeapTable = $cfg["statistics_heap_table"]; + + $sHeapTable = $cfg['tab']['stat_heap_table']; + + if ($bUseHeapTable) { + if (!dbTableExists ($db, $sHeapTable)) { + buildHeapTable ($sHeapTable, $db); + } + } + + if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { + $sDisplay = 'block'; + } + + $sql = "SELECT + idtree, A.idcat, level, preid, C.name, visible + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B, + ".$cfg["tab"]["cat_lang"]." AS C + WHERE + A.idcat=B.idcat + AND + B.idcat=C.idcat + AND + C.idlang='".Contenido_Security::toInteger($lang)."' + AND + B.idclient='".Contenido_Security::toInteger($client)."' + ORDER BY + idtree"; + + $db->query($sql); + + $currentRow = 2; + + $aRowname = array(); + $iLevel = 0; + + $tpl->set('s', 'IMG_EXPAND', $cfg["path"]["contenido_fullhtml"].$cfg['path']['images'].'open_all.gif'); + $tpl->set('s', 'IMG_COLLAPSE', $cfg["path"]["contenido_fullhtml"].$cfg['path']['images'].'close_all.gif'); + + while ($db->next_record()) { + if ($db->f("level") == 0 && $db->f("preid") != 0) { + $bgcolor = '#FFFFFF'; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', '10'); + $tpl->set('d', 'TEXT', ' '); + $tpl->set('d', 'NUMBEROFARTICLES', ''); + $tpl->set('d', 'TOTAL', ''); + $tpl->set('d', 'ICON',''); + $tpl->set('d', 'STATUS', ''); + $tpl->set('d', 'ONCLICK', ''); + $tpl->set('d', 'ROWNAME', ''); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'INTHISLANGUAGE', ''); + $tpl->set('d', 'EXPAND', ''); + $tpl->set('d', 'DISPLAY_ROW', $sDisplay); + + $tpl->next(); + $currentRow++; + } + + $padding_left = 10 + ( 15 * $db->f("level") ); + $text = $db->f(4); + $idcat = $db->f("idcat"); + $bCatVisible = $db->f("visible"); + + if ($db->f("level") < $iLevel) { + $iDistance = $iLevel-$db->f("level"); + + for ($i = 0; $i < $iDistance; $i++) { + array_pop($aRowname); + } + $iLevel = $db->f("level"); + } + + if ($db->f("level") >= $iLevel) { + if ($db->f("level") == $iLevel) { + array_pop($aRowname); + } else { + $iLevel = $db->f("level"); + } + array_push($aRowname, $idcat); + } + + $db2 = new DB_ConLite; + //************** number of arts ************** + $sql = "SELECT COUNT(*) FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db2->query($sql); + $db2->next_record(); + + $numberOfArticles = $db2->f(0); + $sumNumberOfArticles += $numberOfArticles; + //************** hits of category total************** + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' AND B.idclient='".Contenido_Security::toInteger($client)."'"; + } else { + if(!$bUseHeapTable) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND B.idclient='".Contenido_Security::toInteger($client)."' AND B.archived = '".Contenido_Security::escapeDB($yearmonth, $db2)."'"; + } else { + $sql = "SELECT SUM(visited) FROM ".Contenido_Security::escapeDB($sHeapTable, $db2)." WHERE idcat='".Contenido_Security::toInteger($idcat)."' + AND idclient='".Contenido_Security::toInteger($client)."' AND archived = '".Contenido_Security::escapeDB($yearmonth, $db2)."'"; + } + } + $db2->query($sql); + $db2->next_record(); + + $total = $db2->f(0); + + //************** hits of category in this language *************** + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND B.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."'"; + } else { + if(!$bUseHeapTable) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND B.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."' AND B.archived = '".Contenido_Security::escapeDB($yearmonth, $db2)."'"; + } else { + $sql = "SELECT SUM(visited) FROM ".Contenido_Security::escapeDB($sHeapTable, $db2)." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."' + AND idclient='".Contenido_Security::toInteger($client)."' AND archived = '".Contenido_Security::escapeDB($yearmonth, $db2)."'"; + } + } + + $db2->query($sql); + $db2->next_record(); + + $inThisLanguage = $db2->f(0); + + $icon = ''; + + //************ art ******************************** + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["art"]." AS B, ".$cfg["tab"]["art_lang"]." AS C WHERE A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart=B.idart AND B.idart=C.idart AND C.idlang='".Contenido_Security::toInteger($lang)."' ORDER BY B.idart"; + $db2->query($sql); + + $numrows = $db2->num_rows(); + $onclick = ""; + + $online = $db->f("visible"); + if ($bCatVisible == 1) { + $offonline = ''.i18n('; + } else { + $offonline = ''.i18n('; + } + + //************check if there are subcategories ****************** + $iSumSubCategories = 0; + $sSql = "SELECT count(*) as cat_count from ".$cfg["tab"]["cat"]." WHERE parentid = '".Contenido_Security::toInteger($idcat)."';"; + $db3 = new DB_ConLite(); + $db3->query($sSql); + if ($db3->next_record()) { + $iSumSubCategories = $db3->f('cat_count'); + } + $db3->free(); + + $bgcolor = $cfg["color"]["table_dark"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', $padding_left); + $tpl->set('d', 'TEXT', $text); + $tpl->set('d', 'ONCLICK', $onclick); + $tpl->set('d', 'ICON', $icon); + $tpl->set('d', 'STATUS', $offonline); + $tpl->set('d', 'NUMBEROFARTICLES', $numberOfArticles); + $tpl->set('d', 'TOTAL', $total); + $tpl->set('d', 'ROWNAME', implode('_', $aRowname)); + if ($numrows > 0 || $iSumSubCategories > 0) { + $tpl->set('d', 'EXPAND', ' + '.i18n( + '); + } else { + $tpl->set('d', 'EXPAND', ''); + } + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'INTHISLANGUAGE', $inThisLanguage); + if ($db->f("level") != 0) { + $tpl->set('d', 'DISPLAY_ROW', 'none'); + } else { + $tpl->set('d', 'DISPLAY_ROW', $sDisplay); + } + + $tpl->next(); + $currentRow++; + + $onclick = ""; + + $text = ""; + $numberOfArticles = ""; + $total = ""; + $inThisLanguage = ""; + + while ($db2->next_record()) { + $idart = $db2->f("idart"); + + array_push($aRowname, $idart); + + $text = ""; + $numberOfArticles = ""; + $total = ""; + $inThisLanguage = ""; + + $padding_left = 10 + ( 15 * ($db->f("level")+1) ); + + $text = $db2->f("title"); + $online = $db2->f("online"); + + //************** number of arts ************** + $db3 = new DB_ConLite(); + + //************** hits of art total ************** + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart='".Contenido_Security::toInteger($idart)."' AND B.idclient='".Contenido_Security::toInteger($client)."'"; + } else { + if(!$bUseHeapTable) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart='".Contenido_Security::toInteger($idart)."' AND B.idclient='".Contenido_Security::toInteger($client)."' and B.archived = '".Contenido_Security::escapeDB($yearmonth, $db3)."'"; + } else { + $sql = "SELECT SUM(visited) FROM ".Contenido_Security::escapeDB($sHeapTable, $db3)." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idart='".Contenido_Security::toInteger($idart)."' + AND idclient='".Contenido_Security::toInteger($client)."' AND archived = '".Contenido_Security::escapeDB($yearmonth, $db3)."'"; + } + } + + $db3->query($sql); + $db3->next_record(); + + $total = $db3->f(0); + + //************** hits of art in this language *************** + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT visited FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart='".Contenido_Security::toInteger($idart)."' AND B.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."'"; + } else { + if (!$bUseHeapTable) { + $sql = "SELECT visited FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart='".Contenido_Security::toInteger($idart)."' AND B.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."' + AND B.archived = '".Contenido_Security::escapeDB($yearmonth, $db3)."'"; + } else { + $sql = "SELECT visited FROM ".Contenido_Security::escapeDB($sHeapTable, $db3)." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idart='".Contenido_Security::toInteger($idart)."' + AND idlang='".Contenido_Security::toInteger($lang)."' AND idclient='".Contenido_Security::toInteger($client)."' AND archived = '".Contenido_Security::escapeDB($yearmonth, $db3)."'"; + } + } + + $db3->query($sql); + $db3->next_record(); + + $inThisLanguage = $db3->f(0); + + if ($online == 0) { + $offonline = 'Artikel ist offline'; + } else { + $offonline = 'Artikel ist online'; + } + + $icon = ''; + $bgcolor = $cfg["color"]["table_light"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', $padding_left); + $tpl->set('d', 'TEXT', $text); + $tpl->set('d', 'ONCLICK', ""); + $tpl->set('d', 'ICON', $icon); + $tpl->set('d', 'STATUS', $offonline); + $tpl->set('d', 'ROWNAME', implode('_', $aRowname)); + //$tpl->set('d', 'ROWNAME', "HIDE".($db->f("level")+1)); + $tpl->set('d', 'NUMBEROFARTICLES', $numberOfArticles); + $tpl->set('d', 'TOTAL', $total); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'INTHISLANGUAGE', $inThisLanguage); + $tpl->set('d', 'EXPAND', ''); + $tpl->set('d', 'DISPLAY_ROW', 'none'); + $tpl->next(); + $currentRow++; + + array_pop($aRowname); + } + } + + //************** hits total************** + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat"]." AS B WHERE A.idcatart=B.idcatart AND B.idclient='".Contenido_Security::toInteger($client)."'"; + } else { + if (!$bUseHeapTable) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND B.idclient='".Contenido_Security::toInteger($client)."' + AND B.archived = '".Contenido_Security::escapeDB($yearmonth, $db)."'"; + } else { + $sql = "SELECT SUM(visited) FROM ".Contenido_Security::escapeDB($sHeapTable, $db)." WHERE idclient='".Contenido_Security::toInteger($client)."' AND archived = '".Contenido_Security::escapeDB($yearmonth, $db)."'"; + } + } + + $db->query($sql); + $db->next_record(); + + $total = $db->f(0); + + //************** hits total on this language *************** + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat"]." AS B WHERE A.idcatart=B.idcatart AND B.idlang='".Contenido_Security::toInteger($lang)."' + AND B.idclient='".Contenido_Security::toInteger($client)."'"; + } else { + if(!$bUseHeapTable) { + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND B.idlang='".Contenido_Security::toInteger($lang)."' + AND B.idclient='".Contenido_Security::toInteger($client)."' AND B.archived = '".Contenido_Security::escapeDB($yearmonth, $db)."'"; + } else { + $sql = "SELECT SUM(visited) FROM ".Contenido_Security::escapeDB($sHeapTable, $db)." WHERE idlang='".Contenido_Security::toInteger($lang)."' AND idclient='".Contenido_Security::toInteger($client)."' + AND archived = '".Contenido_Security::escapeDB($yearmonth, $db)."'"; + } + } + + $db->query($sql); + $db->next_record(); + + $inThisLanguage = $db->f(0); + + $bgcolor = '#FFFFFF'; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'TEXT', ' '); + $tpl->set('d', 'ICON', ''); + $tpl->set('d', 'STATUS', ''); + $tpl->set('d', 'PADDING_LEFT', '10'); + $tpl->set('d', 'NUMBEROFARTICLES', ''); + $tpl->set('d', 'TOTAL', ''); + $tpl->set('d', 'INTHISLANGUAGE', ''); + $tpl->set('d', 'EXPAND', ''); + $tpl->set('d', 'ROWNAME', ''); + $tpl->set('d', 'ONCLICK', ''); + $tpl->set('d', 'DISPLAY_ROW', $sDisplay); + + $bgcolor = $cfg["color"]["table_dark"]; + $tpl->set('s', 'SUMBGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('s', 'SUMTEXT', i18n("Sum")); + $tpl->set('s', 'SUMNUMBEROFARTICLES', $sumNumberOfArticles); + $tpl->set('s', 'SUMTOTAL', $total); + $tpl->set('s', 'SUMINTHISLANGUAGE', $inThisLanguage); + $tpl->next(); +} + +/** + * Generates a statistics page for a given year + * + * @param $year Specifies the year to retrieve the + * statistics for + * @author Jan Lengowski + * @modified Timo A. Hummel + * @copyright four for business AG + * + * @return none + * + */ +function statsOverviewYear($year) { + global $cfg, $db, $tpl, $client, $lang; + + $sDisplay = 'table-row'; + + if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { + $sDisplay = 'block'; + } + + $sql = "SELECT + idtree, A.idcat, level, preid, C.name, visible + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B, + ".$cfg["tab"]["cat_lang"]." AS C + WHERE + A.idcat=B.idcat + AND + B.idcat=C.idcat + AND + C.idlang='".Contenido_Security::toInteger($lang)."' + AND + B.idclient='".Contenido_Security::toInteger($client)."' + ORDER BY + idtree"; + + $db->query($sql); + + $currentRow = 2; + + $aRowname = array(); + $iLevel = 0; + + $tpl->set('s', 'IMG_EXPAND', $cfg["path"]["contenido_fullhtml"].$cfg['path']['images'].'open_all.gif'); + $tpl->set('s', 'IMG_COLLAPSE', $cfg["path"]["contenido_fullhtml"].$cfg['path']['images'].'close_all.gif'); + + while ($db->next_record()) { + if ($db->f("level") == 0 && $db->f("preid") != 0) { + $bgcolor = '#FFFFFF'; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', '10'); + $tpl->set('d', 'TEXT', ' '); + $tpl->set('d', 'NUMBEROFARTICLES', ''); + $tpl->set('d', 'TOTAL', ''); + $tpl->set('d', 'STATUS', ''); + $tpl->set('d', 'ONCLICK', ''); + $tpl->set('d', 'ICON',''); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'INTHISLANGUAGE', ''); + $tpl->set('d', 'EXPAND', ''); + $tpl->set('d', 'DISPLAY_ROW', $sDisplay); + $tpl->set('d', 'ROWNAME', ''); + $tpl->next(); + $currentRow++; + } + + $padding_left = 10 + ( 15 * $db->f("level") ); + $text = $db->f(4); + $idcat = $db->f("idcat"); + $bCatVisible = $db->f("visible"); + + if ($db->f("level") < $iLevel) { + $iDistance = $iLevel-$db->f("level"); + + for ($i = 0; $i < $iDistance; $i++) { + array_pop($aRowname); + } + $iLevel = $db->f("level"); + } + + if ($db->f("level") >= $iLevel) { + if ($db->f("level") == $iLevel) { + array_pop($aRowname); + } else { + $iLevel = $db->f("level"); + } + array_push($aRowname, $idcat); + } + + $db2 = new DB_ConLite; + //************** number of arts ************** + $sql = "SELECT COUNT(*) FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db2->query($sql); + $db2->next_record(); + + $numberOfArticles = $db2->f(0); + $sumNumberOfArticles += $numberOfArticles; + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND B.idclient='".Contenido_Security::toInteger($client)."' AND SUBSTRING(B.archived,1,4) = ".Contenido_Security::toInteger($year, $db2)." GROUP BY SUBSTRING(B.archived,1,4)"; + + $db2->query($sql); + $db2->next_record(); + + $total = $db2->f(0); + + //************** hits of category in this language *************** + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND B.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."' AND SUBSTRING(B.archived,1,4) = ".Contenido_Security::escapeDB($year, $db2)." + GROUP BY SUBSTRING(B.archived,1,4)"; + + $db2->query($sql); + $db2->next_record(); + + $inThisLanguage = $db2->f(0); + + $icon = ''; + + //************ art ******************************** + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["art"]." AS B, ".$cfg["tab"]["art_lang"]." AS C WHERE A.idcat='".Contenido_Security::toInteger($idcat)."' AND A.idart=B.idart AND B.idart=C.idart + AND C.idlang='".Contenido_Security::toInteger($lang)."' ORDER BY B.idart"; + $db2->query($sql); + + $numrows = $db2->num_rows(); + $onclick = ""; + + if ($bCatVisible == 0) { + $offonline = 'Kategorie ist offline'; + } else { + $offonline = 'Kategorie ist online'; + } + + //************check if there are subcategories ****************** + $iSumSubCategories = 0; + $sSql = "SELECT count(*) as cat_count from ".$cfg["tab"]["cat"]." WHERE parentid = '".Contenido_Security::toInteger($idcat)."';"; + $db3 = new DB_ConLite(); + $db3->query($sSql); + if ($db3->next_record()) { + $iSumSubCategories = $db3->f('cat_count'); + } + $db3->free(); + + $bgcolor = $cfg["color"]["table_dark"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', $padding_left); + $tpl->set('d', 'TEXT', $text); + $tpl->set('d', 'ONCLICK', $onclick); + $tpl->set('d', 'ICON', $icon); + $tpl->set('d', 'STATUS', $offonline); + $tpl->set('d', 'NUMBEROFARTICLES', $numberOfArticles); + $tpl->set('d', 'TOTAL', $total); + $tpl->set('d', 'ROWNAME', implode('_', $aRowname)); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'INTHISLANGUAGE', $inThisLanguage); + + if ($numrows > 0 || $iSumSubCategories > 0) { + $tpl->set('d', 'EXPAND', ' + '.i18n( + '); + } else { + $tpl->set('d', 'EXPAND', ''); + } + + if ($db->f("level") != 0) { + $tpl->set('d', 'DISPLAY_ROW', 'none'); + } else { + $tpl->set('d', 'DISPLAY_ROW', $sDisplay); + } + + $tpl->next(); + $currentRow++; + + $onclick = ""; + + $text = ""; + $numberOfArticles = ""; + $total = ""; + $inThisLanguage = ""; + + while ($db2->next_record()) { + $idart = $db2->f("idart"); + + array_push($aRowname, $idart); + + $text = ""; + $numberOfArticles = ""; + $total = ""; + $inThisLanguage = ""; + + $padding_left = 10 + ( 15 * ($db->f("level")+1) ); + + $text = $db2->f("title"); + $online = $db2->f("online"); + + //************** number of arts ************** + $db3 = new DB_ConLite(); + + //************** hits of art total ************** + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart='".Contenido_Security::toInteger($idart)."' AND B.idclient='".Contenido_Security::toInteger($client)."' AND SUBSTRING(B.archived,1,4) = ".Contenido_Security::escapeDB($year, $db3)." + GROUP BY SUBSTRING(B.archived,1,4)"; + + $db3->query($sql); + $db3->next_record(); + + $total = $db3->f(0); + + //************** hits of art in this language *************** + $sql = "SELECT visited FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND A.idcat='".Contenido_Security::toInteger($idcat)."' + AND A.idart='".Contenido_Security::toInteger($idart)."' AND B.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."' + AND SUBSTRING(B.archived,1,4) = ".Contenido_Security::escapeDB($year, $db3)." GROUP BY SUBSTRING(B.archived,1,4)"; + + $db3->query($sql); + $db3->next_record(); + + $inThisLanguage = $db3->f(0); + + if ($online == 0) { + $offonline = 'Artikel ist offline'; + } else { + $offonline = 'Artikel ist online'; + } + + $icon = ''; + $bgcolor = $cfg["color"]["table_light"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', $padding_left); + $tpl->set('d', 'TEXT', $text); + $tpl->set('d', 'ONCLICK', ""); + $tpl->set('d', 'ICON', $icon); + $tpl->set('d', 'STATUS', $offonline); + $tpl->set('d', 'ROWNAME', implode('_', $aRowname)); + $tpl->set('d', 'NUMBEROFARTICLES', $numberOfArticles); + $tpl->set('d', 'TOTAL', $total); + $tpl->set('d', 'ROWNAME', implode('_', $aRowname)); + $tpl->set('d', 'EXPAND', ''); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'INTHISLANGUAGE', $inThisLanguage); + $tpl->set('d', 'DISPLAY_ROW', 'none'); + $tpl->next(); + $currentRow++; + + array_pop($aRowname); + } + } + + //************** hits total************** + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND B.idclient='".Contenido_Security::toInteger($client)."' + AND SUBSTRING(B.archived,1,4) = '".Contenido_Security::escapeDB($year, $db)."' GROUP BY SUBSTRING(B.archived,1,4)"; + + $db->query($sql); + $db->next_record(); + + $total = $db->f(0); + + //************** hits total on this language *************** + $sql = "SELECT SUM(visited) FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["stat_archive"]." AS B WHERE A.idcatart=B.idcatart AND B.idlang='".Contenido_Security::toInteger($lang)."' + AND B.idclient='".Contenido_Security::toInteger($client)."' AND SUBSTRING(B.archived,1,4) = '".Contenido_Security::escapeDB($year, $db)."' GROUP BY SUBSTRING(B.archived,1,4)"; + + $db->query($sql); + $db->next_record(); + + $inThisLanguage = $db->f(0); + + $bgcolor = '#FFFFFF'; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'TEXT', ' '); + $tpl->set('d', 'ICON', ''); + $tpl->set('d', 'STATUS', ''); + $tpl->set('d', 'PADDING_LEFT', '10'); + $tpl->set('d', 'NUMBEROFARTICLES', ''); + $tpl->set('d', 'TOTAL', ''); + $tpl->set('d', 'ONCLICK', ''); + $tpl->set('d', 'EXPAND', ''); + $tpl->set('d', 'ROWNAME', ''); + $tpl->set('d', 'INTHISLANGUAGE', ''); + $tpl->set('d', 'DISPLAY_ROW', $sDisplay); + $bgcolor = $cfg["color"]["table_dark"]; + $tpl->set('s', 'SUMBGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('s', 'SUMTEXT', "Summe"); + $tpl->set('s', 'SUMNUMBEROFARTICLES', $sumNumberOfArticles); + $tpl->set('s', 'SUMTOTAL', $total); + $tpl->set('s', 'SUMINTHISLANGUAGE', $inThisLanguage); + $tpl->next(); +} + +/** + * Generates a top statistics page + * + * @param $yearmonth Specifies the year and month from which to retrieve the + * statistics, specify "current" to retrieve the current + * entries + * @param $top Specifies the amount of pages to display + * + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return none + * + */ +function statsOverviewTop($yearmonth, $top) { + global $cfg, $db, $tpl, $client, $lang; + + if (strcmp($yearmonth,"current") == 0) { + $sql = "SELECT + C.title, A.visited, B.idcat as idcat + FROM ".$cfg["tab"]["stat"]." AS A, + ".$cfg["tab"]["cat_art"]." AS B, + ".$cfg["tab"]["art_lang"]." AS C + WHERE + C.idart = B.idart + AND + C.idlang = A.idlang + AND + B.idcatart = A.idcatart + AND + A.idclient = '".Contenido_Security::toInteger($client)."' + AND + A.idlang = '".Contenido_Security::toInteger($lang)."' + ORDER BY + A.visited DESC + + LIMIT + ".Contenido_Security::escapeDB($top, $db); + } else { + $sql = "SELECT + C.title, A.visited, B.idcat as idcat + FROM ".$cfg["tab"]["stat_archive"]." AS A, + ".$cfg["tab"]["cat_art"]." AS B, + ".$cfg["tab"]["art_lang"]." AS C + WHERE + C.idart = B.idart + AND + C.idlang = A.idlang + AND + B.idcatart = A.idcatart + AND + A.idclient = '".Contenido_Security::toInteger($client)."' + AND + A.archived = '".Contenido_Security::escapeDB($yearmonth, $db)."' + AND + A.idlang = '".Contenido_Security::toInteger($lang)."' + ORDER BY + A.visited DESC + LIMIT + ".Contenido_Security::escapeDB($top, $db); + } + + $db->query($sql); + + while ($db->next_record()) { + $cat_name = ""; + statCreateLocationString($db->f('idcat')," / ", $cat_name); + $bgcolor = $cfg["color"]["table_light"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', '5'); + $tpl->set('d', 'PATH', "Pfad: / ".$cat_name); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'TEXT', $db->f(0)); + $tpl->set('d', 'TOTAL', $db->f(1)); + $tpl->next(); + } +} + +/** + * Returns the canonical month. + * + * Wrapper for function getCanonicalMonth() + * + * @param int $month The digit representation of a month + * @return string Textual representation of a month + */ +function statReturnCanonicalMonth($month) { + return getCanonicalMonth($month); +} + + +/** + * Generates the location string for passed category id. + * + * Performs a recursive call, if parent category doesn't matches to 0 + * + * @param int $idcat The category id + * @param string $seperator Separator for location string + * @param string $cat_str The location string variable (reference) + * @return void + */ +function statCreateLocationString($idcat, $seperator, &$cat_str) { + + global $cfg, $db, $client, $lang; + + $sql = "SELECT + a.name AS name, + a.idcat AS idcat, + b.parentid AS parentid + FROM + ".$cfg["tab"]["cat_lang"]." AS a, + ".$cfg["tab"]["cat"]." AS b + WHERE + a.idlang = '".Contenido_Security::toInteger($lang)."' AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idcat = '".Contenido_Security::toInteger($idcat)."' AND + a.idcat = b.idcat"; + + $db4 = new DB_ConLite; + $db4->query($sql); + $db4->next_record(); + + $name = $db4->f("name"); + $parentid = $db4->f("parentid"); + + $tmp_cat_str = $name . $seperator . $cat_str; + $cat_str = $tmp_cat_str; + + if ($parentid != 0) { + statCreateLocationString($parentid, $seperator, $cat_str); + } else { + $sep_length = strlen($seperator); + $str_length = strlen($cat_str); + $tmp_length = $str_length - $sep_length; + $cat_str = substr($cat_str, 0, $tmp_length); + } +} + +/** + * Generates a top statistics page + * + * @param $year Specifies the year from which to retrieve the + * statistics + * @param $top Specifies the amount of pages to display + * + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return none + * + */ +function statsOverviewTopYear($year, $top) { + global $cfg, $db, $tpl, $client, $lang; + + $sql = "SELECT + C.title, SUM(A.visited) as visited, B.idcat as idcat + FROM ".$cfg["tab"]["stat_archive"]." AS A, + ".$cfg["tab"]["cat_art"]." AS B, + ".$cfg["tab"]["art_lang"]." AS C + WHERE + C.idart = B.idart + AND + C.idlang = A.idlang + AND + B.idcatart = A.idcatart + AND + A.idclient = '".Contenido_Security::toInteger($client)."' + AND + A.archived LIKE '".Contenido_Security::escapeDB($year, $db)."%' + AND + A.idlang = '".Contenido_Security::toInteger($lang)."' + GROUP BY A.idcatart + ORDER BY + visited DESC + + LIMIT + ".Contenido_Security::escapeDB($top, $db); + + $db->query($sql); + + while ($db->next_record()) { + $cat_name = ""; + statCreateLocationString($db->f('idcat')," / ", $cat_name); + $tpl->set('d', 'PATH', "Pfad: / ".$cat_name); + $bgcolor = $cfg["color"]["table_light"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'PADDING_LEFT', '0'); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'TEXT', $db->f(0)); + $tpl->set('d', 'TOTAL', $db->f(1)); + $tpl->next(); + } +} + +/** + * Returns a drop down to choose the stats to display + * + * @param none + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return string Returns a drop down string + * + */ +function statDisplayTopChooser($default) { + if ($default == "top10") { $defaultTop10 = "selected";} + if ($default == "top20") { $defaultTop20 = "selected";} + if ($default == "top30") { $defaultTop30 = "selected";} + if ($default == "all") { $defaultAll = "selected";} + + return ("
" . + " ". + "
"); +} + +/** + * Returns a drop down to choose the stats to display for yearly summary pages + * + * @param none + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return string Returns a drop down string + * + */ +function statDisplayYearlyTopChooser($default) { + if ($default == "top10") { $defaultTop10 = "selected";} + if ($default == "top20") { $defaultTop20 = "selected";} + if ($default == "top30") { $defaultTop30 = "selected";} + if ($default == "all") { $defaultAll = "selected";} + + return ("
" . + " ". + "
"); +} + +/** + * Return an array with all years which are available as stat files + * + * @param mixed many + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return array Array of strings with years. + */ +function statGetAvailableYears($client, $lang) { + global $cfg, $db; + + $availableYears = array(); + + $sql = "SELECT SUBSTRING(`archived`,1,4) + FROM + ".$cfg["tab"]["stat_archive"]." + WHERE + idlang = '".Contenido_Security::toInteger($lang)."' AND + idclient = '".Contenido_Security::toInteger($client)."' + GROUP BY + SUBSTRING(`archived`,1,4) + ORDER BY + SUBSTRING(`archived`,1,4) DESC"; + + $db->query($sql); + while ($db->next_record()) { + array_push($availableYears, $db->f(0)); + } + + return($availableYears); +} + +/** + * Return an array with all months for a specific year which are available + * as stat files + * + * @param mixed many + * @author Timo A. Hummel + * @copyright four for business AG + * + * @return array Array of strings with months. + */ +function statGetAvailableMonths($year, $client, $lang) { + global $cfg, $db; + + $availableYears = array(); + + $sql = "SELECT SUBSTRING(`archived`,5,2) + FROM + ".$cfg["tab"]["stat_archive"]." + WHERE + idlang = '".Contenido_Security::toInteger($lang)."' AND + idclient = '".Contenido_Security::toInteger($client)."' AND + SUBSTRING(`archived`,1,4) = '".Contenido_Security::escapeDB($year, $db)."' + GROUP BY + SUBSTRING(`archived`,5,2) + ORDER BY SUBSTRING(`archived`,5,2) DESC"; + + $db->query($sql); + while ($db->next_record()) { + array_push($availableYears, $db->f(0)); + } + + return($availableYears); +} + + +/** + * Resets the statistic for passed client + * + * @param int $client Id of client + * @return void + */ +function statResetStatistic($client) { + global $db; + global $cfg; + $sql = "UPDATE ".$cfg["tab"]["stat"]." SET visited=0 WHERE idclient='".Contenido_Security::toInteger($client)."'"; + $db->query($sql); +} + + +/** + * Deletes existing heap table (table in memory) and creates it. + * + * @param string $sHeapTable Table name + * @param DB_ConLite $db Database object + * @return void + */ +function buildHeapTable($sHeapTable, $db) { + global $cfg; + + $sql = "DROP TABLE IF EXISTS ".Contenido_Security::escapeDB($sHeapTable, $db).";"; + $db->query($sql); + + $sql = "CREATE TABLE ".Contenido_Security::escapeDB($sHeapTable, $db)." TYPE=HEAP + SELECT + A.idcatart, + A.idcat, + A.idart, + B.idstatarch, + B.archived, + B.idlang, + B.idclient, + B.visited + FROM + ".$cfg['tab']['cat_art']." AS A, ".$cfg['tab']['stat_archive']." AS B + WHERE + A.idcatart = B.idcatart;"; + $db->query($sql); + + $sql = "ALTER TABLE `".Contenido_Security::escapeDB($sHeapTable, $db)."` ADD PRIMARY KEY (`idcatart`,`idcat` ,`idart`,`idstatarch` ,`archived`,`idlang`,`idclient` ,`visited`);"; + $db->query($sql); +} +?> \ No newline at end of file diff --git a/conlite/includes/functions.str.php b/conlite/includes/functions.str.php new file mode 100644 index 0000000..b4cb1f7 --- /dev/null +++ b/conlite/includes/functions.str.php @@ -0,0 +1,1465 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-03-02 + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-08-29, Murat Purc, add new chain execution + * modified 2008-09-03, Hotfix recursive call more than 200 times exit script on hosteurope Timo.Trautmann (strRemakeTreeTableFindNext) + * modified 2008-10-29, delete from cat_tree only for one Cliente OliverL (strRemakeTreeTable) + * modified 2008-11-03, Add cat_tree only for one Cliente OliverL (strRemakeTreeTable) + * modified 2009-05-05, Timo Trautmann - optional use for copy label on copy proccess + * modified 2009-10-14, Dominik Ziegler - changed functionality of strMoveSubtree and strMoveCatTargetallowed to prevent crashing tree on moving + * modified 2009-10-23, Murat Purc, removed deprecated function (PHP 5.3 ready), commenting code and some formatting + * modified 2009-10-27, Murat Purc, fixed/modified CEC_Hook, see [#CON-256] + * modified 2010-01-30, Ingo van Peeren, modified strRemakeTreeTable() to pass only one INSERT statement to the database, see [#CON-299] + * modified 2010-03-12, Ingo van Peeren, fixed a bug with last change if more than one client exist [#CON-299] + * modified 2010-06-18, Ingo van Peeren, fixed some issues with next id and order of con_cat_tree entries + * modified 2010-09-17, Ingo van Peeren, fixed some issues wrong level information causing garbled tree [#CON-348] + * modified 2010-10-13, Dominik Ziegler, No copy label per default when copying articles or categories (CON-352) + * + * $Id: functions.str.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/********************************************************************************* +Functions +strNewTree($catname) +strNewCategory($tmp_parentid, $catname) +strOrderedPostTreeList ($idcat, $poststring) +strRemakeTreeTable() +strNextDeeper($tmp_idcat) +strNextPost($tmp_idcat) +strNextBackwards($tmp_idcat) +strRemakeTreeTableFindNext($tmp_idcat,$tmp_level) +strShowTreeTable() +strRenameCategory ($idcat, $lang, $newcategoryname) +strMakeVisible ($idcat, $lang, $visible) +strMakePublic ($idcat, $lang, $public) +strDeleteCategory ($idcat) +strMoveUpCategory ($idcat) +strMoveDownCategory ($idcat) +strMoveSubtree ($idcat, $parentid_new) +strMoveCatTargetallowed($idcat, $source) +********************************************************************************/ + +cInclude("includes", "functions.con.php"); +cInclude("includes", "functions.database.php"); + +global $db_str; +global $db_str2; + +if (class_exists("DB_ConLite")) { + $db_str = new DB_ConLite(); + $db_str2 = new DB_ConLite(); +} + + +/** + * Creates a new category tree (root category item). + * + * @param string $catname The category name + * @param string $catalias Alias of category + * @param bool $bVisible Flag about visible status + * @param bool $bPublic Flag about public status + * @param int $iIdtplcfg Id of template configuration + * @return (int|void) Id of new generated category or nothing on failure + */ +function strNewTree($catname, $catalias = '', $bVisible = 0, $bPublic = 1, $iIdtplcfg = 0) { + global $db; + global $client; + global $lang; + global $cfg; + global $area_tree; + global $sess; + global $perm; + global $area_rights; + global $item_rights; + global $_SESSION; + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + global $auth; + + $remakeCatTable = true; + $remakeStrTable = true; + + $db2= new DB_ConLite; + + if (trim($catname) == "") { + return; + } + + $catalias = trim($catalias); + if ($catalias == "") { + $catalias = trim($catname); + } + + $tmp_newid = $db->nextid($cfg["tab"]["cat"]); + if ($tmp_newid == 0) { + return; + } + + if ($perm->have_perm_area_action("str_tplcfg", "str_tplcfg")) { + $iIdtplcfg = (int) $iIdtplcfg; + } else { + $iIdtplcfg = 0; + } + + $bVisible = (int) $bVisible; + if (! (($bVisible == 0 || $bVisible == 1) && $perm->have_perm_area_action('str', "str_makevisible")) ) { + $bVisible = 0; + } + + $bPublic = (int) $bPublic; + if (! (($bPublic == 0 || $bPublic == 1) && $perm->have_perm_area_action('str', "str_makepublic")) ) { + $bPublic = 1; + } + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='0' AND postid='0' AND idclient='".Contenido_Security::toInteger($client)."'"; + $db->query($sql); + $db->next_record(); + $tmp_id = $db->f("idcat"); + + $a_languages[] = $lang; + + if (is_array($a_languages)) { + + if (!$tmp_id) { + //********** Entry in 'cat'-table ************ + $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', '0', '0', + '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + + //********* enter name of cat in 'cat_lang'-table ****** + foreach ($a_languages as $tmp_lang) { + if ($tmp_lang == $lang) { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } else { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } + } + } else { + //********** Entry in 'cat'-table ************ + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='$tmp_newid' WHERE idcat='".Contenido_Security::toInteger($tmp_id)."'"; + $db->query($sql); + + //********** Entry in 'cat'-table ************ + $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_id)."', + '0', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + + //********* enter name of cat in 'cat_lang'-table ****** + foreach ($a_languages as $tmp_lang) { + if ($tmp_lang == $lang) { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } else { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } + } + } + + // set correct rights for element + cInclude ("includes", "functions.rights.php"); + foreach ($a_languages as $tmp_lang) { + createRightsForElement("str", $tmp_newid, $tmp_lang); + createRightsForElement("con", $tmp_newid, $tmp_lang); + } + + } + + /* Search for default template */ + $templateCollection = new cApiTemplateCollection("defaulttemplate = '1' AND idclient = '".Contenido_Security::toInteger($client)."'"); + + if ($template = $templateCollection->next()) { + $idtpl = $template->get("idtpl"); + if ($iIdtplcfg > 0) { + $idtpl = $iIdtplcfg; + } + + /* Assign template, if default template exists */ + $catCollection = new cApiCategoryLanguageCollection("idcat = '".Contenido_Security::toInteger($tmp_newid)."'"); + + while ($cat = $catCollection->next()) { + $cat->assignTemplate($idtpl); + } + + } else { + //2008-06-25 timo.trautmann also set default template if it is selcted by user and there is no default template + if ($iIdtplcfg > 0) { + $idtpl = $iIdtplcfg; + + $catCollection = new cApiCategoryLanguageCollection("idcat = '$tmp_newid'"); + + while ($cat = $catCollection->next()) { + $cat->assignTemplate($idtpl); + } + } + } + + return ($tmp_newid); +} + + +/** + * Creates a new category. + * + * @param int $tmp_parentid Id of parent category + * @param string $catname The category name + * @param bool $remakeTree Flag to rebuild category tree structure + * @param string $catalias Alias of category + * @param bool $bVisible Flag about visible status + * @param bool $bPublic Flag about public status + * @param int $iIdtplcfg Id of template configuration + * @return (int|void) Id of new generated category or nothing on failure + */ +function strNewCategory($tmp_parentid, $catname, $remakeTree = true, $catalias = '', $bVisible = 0, $bPublic = 1, $iIdtplcfg = 0) { + global $db; + global $client; + global $lang; + global $cfg; + global $area_tree; + global $perm; + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + global $auth; + global $tmp_area; + + $db2= new DB_ConLite; + + if (trim($catname) == "") { + return; + } + + $catalias = trim($catalias); + if ($catalias == "") { + $catalias = trim($catname); + } + + if ($perm->have_perm_area_action("str_tplcfg", "str_tplcfg")) { + $iIdtplcfg = (int) $iIdtplcfg; + } else { + $iIdtplcfg = 0; + } + + $bVisible = (int) $bVisible; + if (! (($bVisible == 0 || $bVisible == 1) && $perm->have_perm_area_action('str', "str_makevisible")) ) { + $bVisible = 0; + } + + $bPublic = (int) $bPublic; + if (! (($bPublic == 0 || $bPublic == 1) && $perm->have_perm_area_action('str', "str_makepublic")) ) { + $bPublic = 1; + } + + $tmp_newid = $db->nextid($cfg["tab"]["cat"]); + if ($tmp_newid == 0) { + return; + } + + $remakeCatTable = true; + $remakeStrTable = true; + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_parentid)."' AND postid=0"; + $db->query($sql); + $db->next_record(); + $tmp_id = $db->f("idcat"); + + if (!$tmp_id) { + //********** Entry in 'cat'-table ************ + $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, parentid, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', + '".Contenido_Security::toInteger($tmp_parentid)."', '0', '0', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', + '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + + //********* enter name of cat in 'cat_lang'-table ****** + $a_languages[] = $lang; + + foreach ($a_languages as $tmp_lang) { + if ($tmp_lang == $lang) { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } else { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } + } + } else { + //********** Entry in 'cat'-table ************ + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='$tmp_newid', lastmodified = '".date("Y-m-d H:i:s")."' WHERE idcat='".Contenido_Security::toInteger($tmp_id)."'"; + $db->query($sql); + + //********** Entry in 'cat'-table ************ + $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, parentid, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', + '".Contenido_Security::toInteger($tmp_parentid)."', '".Contenido_Security::toInteger($tmp_id)."', '0', '".Contenido_Security::toInteger($client)."', + '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + + //********* enter name of cat in 'cat_lang'-table ****** + $a_languages[] = $lang; + foreach ($a_languages as $tmp_lang) { + if ($tmp_lang == $lang) { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } else { + $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) + VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', + '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', + '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; + $db->query($sql); + } + } + + } + + // set correct rights for element + cInclude ("includes", "functions.rights.php"); + foreach ($a_languages as $tmp_lang) { + copyRightsForElement("str", $tmp_parentid, $tmp_newid, $tmp_lang); + copyRightsForElement("con", $tmp_parentid, $tmp_newid, $tmp_lang); + } + + if ($remakeTree == true) { + strRemakeTreeTable(); + } + + /* Search for default template */ + $templateCollection = new cApiTemplateCollection("defaulttemplate = '1' AND idclient = '$client'"); + + if ($template = $templateCollection->next()) { + $idtpl = $template->get("idtpl"); + if ($iIdtplcfg > 0) { + $idtpl = $iIdtplcfg; + } + + /* Assign template, if default template exists */ + $catCollection = new cApiCategoryLanguageCollection("idcat = '".Contenido_Security::toInteger($tmp_newid)."'"); + + while ($cat = $catCollection->next()) { + $cat->assignTemplate($idtpl); + } + } else { + //2008-06-25 timo.trautmann also set default template if it is selcted by user and there is no default template + if ($iIdtplcfg > 0) { + $idtpl = $iIdtplcfg; + + $catCollection = new cApiCategoryLanguageCollection("idcat = '".Contenido_Security::toInteger($tmp_newid)."'"); + + while ($cat = $catCollection->next()) { + $cat->assignTemplate($idtpl); + } + } + } + + return($tmp_newid); +} + + +function strOrderedPostTreeList($idcat, $poststring) { + global $db; + global $client; + global $lang; + global $cfg; + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid=0 AND preid='".Contenido_Security::toInteger($idcat)."' AND idcat!=0"; + + $db->query($sql); + if ($db->next_record()) { + $tmp_idcat = $db->f("idcat"); + $poststring = $poststring.",".$tmp_idcat; + $poststring = strOrderedPostTreeList($tmp_idcat, $poststring); + } + + return $poststring; +} + + +/** + * Remakes the category tree structure in category tree table. + * + * @return void + */ +function strRemakeTreeTable() { + global $db; + global $client; + global $lang; + global $cfg; + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + $poststring = ""; + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE idclient = '".$client."'"; + $db->query($sql); + $idcats = array(); + while ($db->next_record()) { + $idcats[] = $db->f("idcat"); + } + + $sql = "DELETE FROM ".$cfg["tab"]["cat_tree"]." WHERE idcat IN ('".implode("', '",$idcats)."')"; // empty 'cat_tree'-table + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["cat"]." WHERE idcat='0'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='0'"; + $db->query($sql); + + $sql = "SELECT idcat, parentid, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idclient = '".$client."' ORDER BY parentid ASC, preid ASC, postid ASC"; + + $db->query($sql); + + // build cat_tree + $aCategories = array(); + while($db->next_record()) { + + if ($db->f('parentid') == 0) { + $aCategories[0][$db->f('idcat')] = array( + 'idcat' => $db->f('idcat'), + 'parentid' => $db->f('parentid'), + 'preid' => $db->f('preid'), + 'postid' => $db->f('postid') + ); + } else { + $aCategories[$db->f('parentid')][$db->f('idcat')] = array( + 'idcat' => $db->f('idcat'), + 'parentid' => $db->f('parentid'), + 'preid' => $db->f('preid'), + 'postid' => $db->f('postid') + ); + } + + } + + $iNextTreeId = $db->nextid($cfg["tab"]["cat_tree"]); + + // build INSERT statement + $sInsertQuery = "INSERT INTO ".$cfg["tab"]["cat_tree"]." (idtree, idcat, level) VALUES "; + $sInsertQuery = recCats($aCategories[0], $sInsertQuery, $iNextTreeId, $aCategories); + $sInsertQuery = rtrim($sInsertQuery, " ,"); + + // lock db table and execute INSERT query + $db->lock($cfg["tab"]["cat_tree"]); + $db->query($sInsertQuery); + $db->nextid('cat_tree'); + dbUpdateSequence($cfg["tab"]["sequence"], $cfg["tab"]["cat_tree"], $db); + $db->unlock($cfg["tab"]["cat_tree"]); + +} + +function sort_pre_post($arr) { + $firstElement = null; + foreach ($arr as $row) { + if ($row['preid'] == 0) $firstElement = $row['idcat']; + } + + $curId = $firstElement; + $array = array(); + while ($curId != 0) { + $array[] = $arr[$curId]; + $curId = $arr[$curId]['postid']; + } + + return $array; +} + + +function recCats ($aCats, $sInsertQuery, &$iNextTreeId, &$aAllCats, $iLevel = 0) { + if (is_array($aCats)) { + $aCats = sort_pre_post($aCats); + foreach ($aCats as $aCat) { + $sInsertQuery .= "(" . (int) $iNextTreeId . ", ".(int) $aCat['idcat'].", ". (int) $iLevel ."), "; + $iNextTreeId++; + if (is_array($aAllCats[$aCat['idcat']])) { + $iSubLevel = $iLevel + 1; + $sInsertQuery = recCats($aAllCats[$aCat['idcat']], $sInsertQuery, $iNextTreeId, $aAllCats, $iSubLevel); + } + } + } + return $sInsertQuery; +} + + +function strNextDeeper($tmp_idcat, $ignore_lang = false) { + global $cfg, $db_str, $lang; + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_idcat)."' AND preid='0'"; + $db_str->query($sql); + if ($db_str->next_record()) { + $midcat = $db_str->f("idcat"); + if ($ignore_lang == true) { + return $midcat; + } + + //******deeper element exists + /* Check for language dependent part */ + + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($midcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db_str->query($sql); + if ($db_str->next_record()) { + return $midcat; + } else { + return 0; + } + } else { + //******deeper element does not exist + return 0; + } +} + + +/** + * Checks, if passed category cotains any articles + * + * @param int $tmp_idcat ID of category + * @return bool + */ +function strHasArticles($tmp_idcat) { + global $cfg, $db_str; + global $lang; + + $sql = "SELECT b.idartlang AS idartlang FROM + ".$cfg["tab"]["cat_art"]." AS a, + ".$cfg["tab"]["art_lang"]." AS b + WHERE a.idcat='".Contenido_Security::toInteger($tmp_idcat)."' AND + a.idart = b.idart AND b.idlang = '".Contenido_Security::toInteger($lang)."'"; + + $db_str->query($sql); + + if ($db_str->next_record()) { //******post element exists + return true; + } else { //******post element does not exist + return false; + } +} + + +function strNextPost($tmp_idcat) { + global $db; + global $cfg; + + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE preid='".Contenido_Security::toInteger($tmp_idcat)."'"; + $db->query($sql); + if ($db->next_record()) { //******post element exists + $tmp_idcat = $db->f("idcat"); + $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_idcat)."'"; + $db->query($sql); + if ($db->next_record()) { //******parent from post must not be 0 + $tmp_parentid = $db->f("parentid"); + if ($tmp_parentid != 0) { + return $tmp_idcat; + } else { + return 0; + } + } else { + return 99; + } + } else { //******post element does not exist + return 0; + } +} + +function strNextBackwards($tmp_idcat) { + global $db; + global $cfg; + + $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_idcat)."'"; + $db->query($sql); + if ($db->next_record()) { //******parent exists + $tmp_idcat = $db->f("parentid"); + if ($tmp_idcat != 0) { + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE preid='".Contenido_Security::toInteger($tmp_idcat)."'"; + $db->query($sql); + if ($db->next_record()) { //******parent has post + $tmp_idcat = $db->f("idcat"); + $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_idcat)."'"; + $db->query($sql); + if ($db->next_record()) { //******parent from post must not be 0 + $tmp_parentid = $db->f("parentid"); + if ($tmp_parentid != 0) { + return $tmp_idcat; + } else { + return 0; + } + } else { + return 99; + } + } else { //******parent has no post + return strNextBackwards($tmp_idcat); + } + } else { + return 0; + } + } else { //******no parent + return 0; + } +} + +/** + * Hotfix recursive call more than 200 times exit script on hosteurope Timo.Trautmann (strRemakeTreeTableFindNext) + * @deprecated + **/ +function strRemakeTreeTableFindNext($tmp_idcat,$tmp_level) { + global $db; + global $cfg; + + //************* Insert Element in 'cat_tree'-table ************** + $sql = "INSERT INTO ".$cfg["tab"]["cat_tree"]." (idtree, idcat, level) VALUES ('".$db->nextid($cfg["tab"]["cat_tree"])."', '".Contenido_Security::toInteger($tmp_idcat)."', '".Contenido_Security::toInteger($tmp_level)."')"; + $db->query($sql); + + //************* dig deeper, if possible ****** + $tmp = strNextDeeperAll($tmp_idcat, true); + + foreach ($tmp as $iCurIdCat) { + if (count(strNextDeeperAll($iCurIdCat, true)) > 0 ) { + strRemakeTreeTableFindNext($iCurIdCat, ($tmp_level+1)); + } else { + $sql = "INSERT INTO ".$cfg["tab"]["cat_tree"]." (idtree, idcat, level) VALUES ('".$db->nextid($cfg["tab"]["cat_tree"])."', '".Contenido_Security::toInteger($iCurIdCat)."', '".Contenido_Security::toInteger($tmp_level+1)."')"; + $db->query($sql); + } + } +} + + + +/** + Hotfix recursive call more than 200 times exit script on hosteurope Timo.Trautmann +**/ +function strNextDeeperAll($tmp_idcat, $ignore_lang = false) { + global $cfg, $db_str, $db_str2, $lang; + $aCats = array(); + $bLoop = true; + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_idcat)."' and preid = 0"; + + #echo $sql.'
'; + $db_str->query($sql); + if ($db_str->next_record()) { + while ($bLoop) { + $midcat = $db_str->f("idcat"); + + if ($ignore_lang == true) { + array_push($aCats, $midcat); + } else { + //******deeper element exists + /* Check for language dependent part */ + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($midcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db_str2->query($sql); + + if ($db_str2->next_record()) { + array_push($aCats, $midcat); + } + } + + $sql = "SELECT preid, postid, idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_idcat)."' and preid = ".Contenido_Security::toInteger($midcat).""; + $db_str->query($sql); + if (!$db_str->next_record()) { + $bLoop = false; + } + } + } + return $aCats; +} + + +/** + * Renders the category tree a HTML table + * + * @return void + */ +function strShowTreeTable() { + global $db; + global $sess; + global $client; + global $lang; + global $idcat; + global $cfg; + global $lngStr; + + echo "
"; + $sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND C.idlang='".Contenido_Security::toInteger($lang)."' + AND B.idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idtree"; + $db->query($sql); + while ($db->next_record()) { + $tmp_id = $db->f("idcat"); + $tmp_name = $db->f("name"); + $tmp_level = $db->f("level"); + + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
".$tmp_id." | ".$tmp_name." | ".$tmp_level."url("main.php?action=20&idcat=$tmp_id")."\">".$lngStr["actions"]["20"]."url("main.php?action=30&idcat=$tmp_id")."\">".$lngStr["actions"]["30"]."
"; +} + + +/** + * Renames a category + * + * @param int $idcat Category id + * @param int $lang Language id + * @param string $newcategoryname New category name + * @param string $newcategoryalias New category alias + * @return void + */ +function strRenameCategory($idcat, $lang, $newcategoryname, $newcategoryalias) { + global $db; + global $cfg; + global $cfgClient; + global $client; + + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + if (trim($newcategoryname) != "") { + $sUrlname = clHtmlSpecialChars(capiStrCleanURLCharacters($newcategoryname), ENT_QUOTES); + $sName = clHtmlSpecialChars($newcategoryname, ENT_QUOTES); + + if (trim($newcategoryalias) != "") { + $sql = "SELECT urlname, name FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $sUrlnameNew = clHtmlSpecialChars(capiStrCleanURLCharacters($newcategoryalias), ENT_QUOTES); + if ($db->next_record()) { + $sOldAlias = $db->f('urlname'); + $sOldName = $db->f('name'); + } + if ($sOldAlias != $sUrlnameNew) { + $sUrlname = $sUrlnameNew; + } + + @unlink($cfgClient[$client]["path"]["frontend"]."cache/locationstring-url-cache-$lang.txt"); + } + + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET urlname='".Contenido_Security::escapeDB($sUrlname, $db)."', name='".Contenido_Security::escapeDB($sName, $db)."', lastmodified = '".date("Y-m-d H:i:s")."' + WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } +} + + +/** + * Sets the visible status of the category and its childs + * + * @param int $idcat Category id + * @param int $lang Language id + * @param int $visible Visible status + * @return void + */ +function strMakeVisible ($idcat, $lang, $visible) { + global $db; + global $cfg; + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + $a_catstring = strDeeperCategoriesArray($idcat); + foreach ($a_catstring as $value) { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET visible='".Contenido_Security::toInteger($visible)."', lastmodified ='".date("Y-m-d H:i:s")."' + WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."' "; + $db->query($sql); + } + + if ($cfg["pathresolve_heapcache"] == true && $visible = 0) { + $pathresolve_tablename = $cfg["sql"]["sqlprefix"]."_pathresolve_cache"; + $sql = "DELETE FROM %s WHERE idlang = '%s' AND idcat = '%s'"; + $db->query(sprintf($sql, Contenido_Security::escapeDB($pathresolve_tablename, $db), Contenido_Security::toInteger($lang), $idcat)); + } +} + + +/** + * Sets the public status of the category and its childs + * + * @param int $idcat Category id + * @param int $lang Language id + * @param int $public Public status + * @return void + */ +function strMakePublic($idcat, $lang, $public) { + global $db; + global $cfg; + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + $a_catstring = strDeeperCategoriesArray($idcat); + foreach ($a_catstring as $value) { + $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET public='$public', lastmodified = '".date("Y-m-d H:i:s")."' + WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."' "; + $db->query($sql); + } +} + + +function strDeeperCategoriesArray($idcat_start) { + global $db; + global $client; + global $cfg; + + $sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B WHERE A.idcat=B.idcat AND idclient='".Contenido_Security::toInteger($client)."' ORDER BY idtree"; + $db->query($sql); + $i = 0; + while ($db->next_record()) { + if ($db->f("parentid") < $idcat_start) { // ending part of tree + $i = 0; + } + if ($db->f("idcat") == $idcat_start) { // starting part of tree + $i = 1; + } + if ($i == 1) { + $catstring[] = $db->f("idcat"); + } + } + + return $catstring; +} + + +/** + * Deletes the category and its template configurations. + * + * Only categories having no child categories and having no articles will be deleted! + * + * @param int $idcat Id of category to delete + * @return void + */ +function strDeleteCategory($idcat) { + global $db; + global $lang; + global $client; + global $lang; + global $cfg; + + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + $db2 = new DB_ConLite; + + if (strNextDeeper($idcat)) { + return "0201"; // category has subcategories + } else { + + if (strHasArticles($idcat)) { + return "0202"; // category has arts + } else { + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + while ($db->next_record()) { + ////// delete entry in 'tpl_conf'-table + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; + $db2->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; + $db2->query($sql); + } + + /* Delete language dependend part */ + $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + /* Are there any additional languages? */ + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + + if ($db->num_rows() > 0) { + // more languages found... + // delete rights for element + cInclude ("includes", "functions.rights.php"); + deleteRightsForElement("str", $idcat, $lang); + deleteRightsForElement("con", $idcat, $lang); + + return; + } + + $sql = "SELECT * FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + $db->next_record(); + $tmp_preid = $db->f("preid"); + $tmp_postid = $db->f("postid"); + + ////// update pre cat set new postid + if ($tmp_preid != 0) { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='".Contenido_Security::toInteger($tmp_postid)."' WHERE idcat='".Contenido_Security::toInteger($tmp_preid)."'"; + $db->query($sql); + } + + ////// update post cat set new preid + if ($tmp_postid != 0) { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_preid)."' WHERE idcat='".Contenido_Security::toInteger($tmp_postid)."'"; + $db->query($sql); + } + + ////// delete entry in 'cat'-table + $sql = "DELETE FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + while ($db->next_record()) { + ////// delete entry in 'tpl_conf'-table + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; + $db2->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; + echo $sql; + $db2->query($sql); + } + + ////// delete entry in 'cat_lang'-table + $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + + ////// delete entry in 'cat_tree'-table + $sql = "DELETE FROM ".$cfg["tab"]["cat_tree"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + } + + // delete rights for element + cInclude ("includes", "functions.rights.php"); + deleteRightsForElement("str", $idcat); + deleteRightsForElement("con", $idcat); + } +} + + +/** + * Moves a category upwards. + * + * @param int $idcat Id of category to move upwards + * @return void + */ +function strMoveUpCategory($idcat) { + global $db; + global $sess; + global $cfg; + + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + $db->next_record(); + $tmp_idcat = $db->f("idcat"); + $tmp_preid = $db->f("preid"); + $tmp_postid = $db->f("postid"); + + if ($tmp_preid != 0) { + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_preid)."'"; + $db->query($sql); + $db->next_record(); + $tmp_idcat_pre = $db->f("idcat"); + $tmp_preid_pre = $db->f("preid"); + $tmp_postid_pre = $db->f("postid"); + + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_preid_pre)."'"; + $db->query($sql); + $db->next_record(); + $tmp_idcat_pre_pre = $db->f("idcat"); + $tmp_preid_pre_pre = $db->f("preid"); + $tmp_postid_pre_pre = $db->f("postid"); + + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_postid)."'"; + $db->query($sql); + $db->next_record(); + $tmp_idcat_post = $db->f("idcat"); + $tmp_preid_post = $db->f("preid"); + $tmp_postid_post = $db->f("postid"); + + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='".Contenido_Security::toInteger($tmp_idcat)."' WHERE idcat='".Contenido_Security::toInteger($tmp_preid_pre)."'"; + $db->query($sql); + + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_idcat)."', postid='".Contenido_Security::toInteger($tmp_postid)."' WHERE idcat='".Contenido_Security::toInteger($tmp_preid)."'"; + $db->query($sql); + + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_preid_pre)."', postid='".Contenido_Security::toInteger($tmp_preid)."' WHERE idcat='$tmp_idcat'"; + $db->query($sql); + + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_idcat_pre)."' WHERE idcat='$tmp_postid'"; + $db->query($sql); + } +} + + +/** + * Moves a category downwards. + * + * @param int $idcat Id of category to move downwards + * @return void + */ +function strMoveDownCategory($idcat) { + global $db; + global $sess; + global $cfg; + + // Flag to rebuild the category table + global $remakeCatTable; + global $remakeStrTable; + $remakeCatTable = true; + $remakeStrTable = true; + + $arrLinks = array(); + + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + $db->next_record(); + $arrLinks['cur']['idcat'] = $db->f("idcat"); + $arrLinks['cur']['pre'] = $db->f("preid"); + $arrLinks['cur']['post'] = $db->f("postid"); + + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($arrLinks['cur']['pre'])."'"; + $db->query($sql); + if ($db->next_record()) { + $arrLinks['pre']['idcat'] = $db->f("idcat"); + $arrLinks['pre']['pre'] = $db->f("preid"); + $arrLinks['pre']['post'] = $db->f("postid"); + } else { + $arrLinks['pre']['idcat'] = 0; + $arrLinks['pre']['pre'] = 0; + $arrLinks['pre']['post'] = 0; + } + + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($arrLinks['cur']['post'])."'"; + $db->query($sql); + if ($db->next_record()) { + $arrLinks['post']['idcat'] = $db->f("idcat"); + $arrLinks['post']['pre'] = $db->f("preid"); + $arrLinks['post']['post'] = $db->f("postid"); + } else { + $arrLinks['post']['idcat'] = 0; + $arrLinks['post']['pre'] = 0; + $arrLinks['post']['post'] = 0; + } + + if ($arrLinks['cur']['post'] != 0) { + if ($arrLinks['pre']['idcat'] != 0) { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='".Contenido_Security::toInteger($arrLinks['post']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['pre']['idcat'])."'"; + $db->query($sql); + } else { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['pre']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['post']['idcat'])."'"; + $db->query($sql); + } + + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['cur']['post'])."', postid='".Contenido_Security::toInteger($arrLinks['post']['post'])."' + WHERE idcat='".Contenido_Security::toInteger($arrLinks['cur']['idcat'])."'"; + $db->query($sql); + + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['pre']['idcat'])."', postid='".Contenido_Security::toInteger($arrLinks['cur']['idcat'])."' + WHERE idcat='".Contenido_Security::toInteger($arrLinks['post']['idcat'])."'"; + $db->query($sql); + } + + if ($arrLinks['post']['post'] != 0) { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['cur']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['post']['post'])."'"; + $db->query($sql); + } +} + + +/** + * Moves a subtree to another destination. + * + * @param int $idcat Id of category + * @param int $parentid_new Id of destination parent category + * @return void + */ +function strMoveSubtree($idcat, $parentid_new) { + global $db, $cfg, $remakeCatTable, $remakeStrTable, $movesubtreeidcat, $sess; + $remakeCatTable = true; + $remakeStrTable = true; + + $idcat = Contenido_Security::toInteger( $idcat ); + $iNewParentId = Contenido_Security::toInteger( $parentid_new ); + + // Check if iNewParentId is 0 and the unescaped value is not null + if ( $iNewParentId == 0 && !is_null( $parentid_new ) ) { + $movesubtreeidcat = 0; + } else if ( $iNewParentId != 0 ) { + $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='" . $idcat . "'"; + $db->query($sql); + $db->next_record(); + $tmp_idcat = $db->f("idcat"); + $tmp_preid = $db->f("preid"); + $tmp_postid = $db->f("postid"); + + //****************** update predecessor (pre)********************** + if ($tmp_preid != 0) { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='" . $tmp_postid . "' WHERE idcat='" . $tmp_preid . "'"; + $db->query($sql); + } + + //****************** update follower (post)********************** + if ($tmp_postid != 0) { + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='" . $tmp_preid . "' WHERE idcat='" . $tmp_postid . "'"; + $db->query($sql); + } + + //****************** find new pre ******************** + $sql = "SELECT idcat, preid FROM ".$cfg["tab"]["cat"]." WHERE parentid='" . $iNewParentId . "' AND postid='0'"; + $db->query($sql); + if ($db->next_record()) { + $tmp_new_preid = $db->f("idcat"); + $tmp_preid_2 = $db->f("preid"); + if ($tmp_new_preid != $idcat) { + //******************** update new pre: set post ********************** + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='" . $idcat . "' WHERE idcat='" . $tmp_new_preid . "'"; + $db->query($sql); + } else { + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE idcat='" . $tmp_preid_2 . "'"; + $db->query($sql); + if ($db->next_record()) { + $tmp_new_preid = $db->f("idcat"); + //******************** update new pre: set post ********************** + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='" . $idcat . "' WHERE idcat='" . $tmp_new_preid . "'"; + $db->query($sql); + } else { + $tmp_new_preid = 0; + } + } + } else { + $tmp_new_preid = 0; + } + + //*************** update idcat ******************** + $sql = "UPDATE ".$cfg["tab"]["cat"]." SET parentid='" . $iNewParentId . "', preid='" . $tmp_new_preid . "', postid='0' WHERE idcat='" . $idcat . "'"; + $db->query($sql); + + $movesubtreeidcat = 0; + } else { + // We recoded this function to prevent crashing the cat tree + // when a user copies a tree and forget to set the target category + + // Copy transaction now is only performed by setting the target + $movesubtreeidcat = $idcat; + } + + $sess->register('movesubtreeidcat'); + $sess->freeze(); +} + + +/** + * Checks if category is movable. + * + * @param int $idcat Id of category to move + * @param int $source Id of source category + * @return bool + */ +function strMoveCatTargetallowed($idcat, $source) { + if ($idcat == $source) { + return 0; + } else { + return 1; + } +} + + +/** + * Synchronizes a category from one language to another language. + * + * @param int $idcatParam Id of category to synchronize + * @param int $sourcelang Id of source language + * @param int $targetlang Id of target language + * @param bool $bMultiple Flag to synchronize child languages + * @return void + */ +function strSyncCategory($idcatParam, $sourcelang, $targetlang, $bMultiple = false) { + global $cfg; + + $tmpdb = new DB_ConLite; + $bMultiple = (bool) $bMultiple; + + $aCatArray = array(); + if ($bMultiple == true) { + $aCatArray = strDeeperCategoriesArray($idcatParam); + } else { + array_push($aCatArray, $idcatParam); + } + + foreach ($aCatArray as $idcat) { + /* Check if category already exists */ + $sql = "SELECT idcat, idlang, idtplcfg, name, + visible, public, status, author, + created, lastmodified + FROM + ".$cfg["tab"]["cat_lang"]." + WHERE + idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($targetlang)."'"; + + $tmpdb->query($sql); + + if ($tmpdb->next_record()) { + return false; + } + + $sql = "SELECT idcat, idlang, idtplcfg, name, + visible, public, status, author, + created, lastmodified, urlname + FROM + ".$cfg["tab"]["cat_lang"]." + WHERE + idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($sourcelang)."'"; + + $tmpdb->query($sql); + + if ($tmpdb->next_record()) { + if ($tmpdb->f("idtplcfg") != 0) { + /* Copy the template configuration */ + $newidtplcfg = tplcfgDuplicate($tmpdb->f("idtplcfg")); + } else { + $newidtplcfg = 0; + } + $newidcatlang = $tmpdb->nextid($cfg["tab"]["cat_lang"]); + + $idcat = $tmpdb->f("idcat"); + $idlang = $targetlang; + $idtplcfg = $newidtplcfg; + $name = $tmpdb->f("name"); + $visible = 0; + $public = $tmpdb->f("public"); + $urlname = $tmpdb->f("urlname"); + $status = $tmpdb->f("status"); + $author = $tmpdb->f("author"); + $created = $tmpdb->f("created"); + $lastmodified = $tmpdb->f("lastmodified"); + + $sql = "INSERT INTO + ".$cfg["tab"]["cat_lang"]." + (idcatlang, idcat, idlang, idtplcfg, name, + visible, public, status, author, created, + lastmodified, urlname) + VALUES + ('".Contenido_Security::toInteger($newidcatlang)."', + '".Contenido_Security::toInteger($idcat)."', + '".Contenido_Security::toInteger($idlang)."', + '".Contenido_Security::toInteger($idtplcfg)."', + '".Contenido_Security::escapeDB($name, $tmpdb)."', + '".Contenido_Security::toInteger($visible)."', + '".Contenido_Security::toInteger($public)."', + '".Contenido_Security::toInteger($status)."', + '".Contenido_Security::escapeDB($author, $tmpdb)."', + '".Contenido_Security::escapeDB($created, $tmpdb)."', + '".Contenido_Security::escapeDB($lastmodified, $tmpdb)."', + '".Contenido_Security::escapeDB($urlname, $tmpdb)."')"; + $tmpdb->query($sql); + + // execute CEC hook + $param = $tmpdb->Record; + $param['idlang'] = $idlang; + $param['idtplcfg'] = $idtplcfg; + $param['visible'] = $visible; + CEC_Hook::execute('Contenido.Category.strSyncCategory_Loop', $param); + + // set correct rights for element + cInclude ("includes", "functions.rights.php"); + createRightsForElement("str", $idcat, $targetlang); + createRightsForElement("con", $idcat, $targetlang); + } + } +} + + +/** + * Checks if category has a start article + * + * @param int $idcat Id of category + * @param int $idlang The language id + * @return bool + */ +function strHasStartArticle($idcat, $idlang) { + global $cfg, $db_str; + + if ($cfg["is_start_compatible"] == false) { + $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($idlang)."' AND startidartlang != 0"; + } else { + $sql = "SELECT is_start FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND is_start = 1"; + } + $db_str->query($sql); + if ($db_str->next_record()) { + return true; + } + return false; +} + + +/** + * Copies the category and it's existing articles into another category. + * + * @param int $idcat Id of category to copy + * @param int $destidcat Id of destination category + * @param bool $remakeTree Flag to rebuild category tree + * @param bool $bUseCopyLabel Flag to add copy label to the new categories + * @return void + */ +function strCopyCategory($idcat, $destidcat, $remakeTree = true, $bUseCopyLabel = true) { + global $cfg, $client, $lang; + + $newidcat = strNewCategory($destidcat, "a", $remakeTree); + + /* Selectors */ + $_oldcatlang = new cApiCategoryLanguageCollection; + $_newcatlang = new cApiCategoryLanguageCollection; + + $_oldcatlang->select("idcat = '$idcat' AND idlang = '$lang'"); + $oldcatlang = $_oldcatlang->next(); + + if (!is_object($oldcatlang)) { + return; + } + + $_newcatlang->select("idcat = '$newidcat' AND idlang = '$lang'"); + $newcatlang = $_newcatlang->next(); + + if (!is_object($newcatlang)) { + return; + } + + /* Worker objects */ + $newcat = new cApiCategory($newidcat); + $oldcat = new cApiCategory($idcat); + + /* Copy properties */ + if ($bUseCopyLabel == true) { + $newcatlang->set("name", sprintf(i18n("%s (Copy)"), $oldcatlang->get("name"))); + } else { + $newcatlang->set("name", $oldcatlang->get("name")); + } + + $newcatlang->set("public", $oldcatlang->get("public")); + $newcatlang->set("visible", 0); + $newcatlang->store(); + + // execute cec hook + CEC_Hook::execute('Contenido.Category.strCopyCategory', array( + 'oldcat' => $oldcat, + 'newcat' => $newcat, + 'newcatlang' => $newcatlang + )); + + /* Copy template configuration */ + if ($oldcatlang->get("idtplcfg") != 0) { + /* Create new template configuration */ + $newcatlang->assignTemplate($oldcatlang->getTemplate()); + + /* Copy the container configuration */ + $c_cconf = new cApiContainerConfigurationCollection; + $m_cconf = new cApiContainerConfigurationCollection; + $c_cconf->select("idtplcfg = '".$oldcatlang->get("idtplcfg")."'"); + + while ($i_cconf = $c_cconf->next()) { + $m_cconf->create($newcatlang->get("idtplcfg"), $i_cconf->get("number"), $i_cconf->get("container")); + } + } + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + /* Copy all articles */ + $sql = "SELECT A.idart, B.idartlang FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["art_lang"]." AS B WHERE A.idcat = '".Contenido_Security::toInteger($idcat)."' AND B.idart = A.idart AND B.idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + while ($db->next_record()) { + $newidart = conCopyArticle($db->f("idart"), $newidcat, "", $bUseCopyLabel); + if ($db->f("idartlang") == $oldcatlang->get("startidartlang")) { + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($newidcat)."' AND idart = '".Contenido_Security::toInteger($newidart)."'"; + $db2->query($sql); + if ($db2->next_record()) { + conMakeStart($db2->f("idcatart"), 1); + } + } + } + + return ($newidcat); +} + + +/** + * Copies the categorytree (category and its childs) to an another category. + * + * @param int $idcat Id of category to copy + * @param int $destcat Id of destination category + * @param bool $remakeTree Flag to rebuild category tree + * @param bool $bUseCopyLabel Flag to add copy label to the new categories + * @return void + */ +function strCopyTree($idcat, $destcat, $remakeTree = true, $bUseCopyLabel = true) { + global $cfg; + + $newidcat = strCopyCategory($idcat, $destcat, false, $bUseCopyLabel); + + $db = new DB_ConLite; + $db->query("SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid = '".Contenido_Security::toInteger($idcat)."'"); + while ($db->next_record()) { + strCopyTree($db->f("idcat"), $newidcat, false, $bUseCopyLabel); + } + + if ($remakeTree == true) { + strRemakeTreeTable(); + } +} + +?> diff --git a/conlite/includes/functions.system.php b/conlite/includes/functions.system.php new file mode 100644 index 0000000..b22d627 --- /dev/null +++ b/conlite/includes/functions.system.php @@ -0,0 +1,657 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * emptyLogFile - clears logfiles + * + * @author Ortwin Pinke + * @author Marco Jahn first version in Contenido + * + * @global array $cfg + * @global Contenido_Notification $notification + * @return string + */ +function emptyLogFile() { + global $cfg, $notification; + $tmp_notification = ''; + + if($_GET['log'] == 1) { + $sNewLogPath = $cfg['path']['conlite_logs']."errorlog.txt"; + $sOldLogPath = $cfg['path']['contenido']."logs/errorlog.txt"; + } else if($_GET['log'] == 2) { + $sNewLogPath = $cfg['path']['conlite_logs']."errorlog.txt"; + $sOldLogPath = $cfg['path']['contenido']."logs/errorlog.txt"; + } + + if(file_exists($sNewLogPath) && is_writable($sNewLogPath)) { + $sDelFile = $sNewLogPath; + } else if(file_exists($sOldLogPath) && is_writable($sOldLogPath)) { + $sDelFile = $sOldLogPath; + } else if(file_exists($sNewLogPath) || file_exists($sOldLogPath)) { + return $notification->returnNotification("error", i18n("Can't clear install error log : Access is denied!")); + } + + $errorLogHandle = fopen($sDelFile, "wb+"); + fclose($errorLogHandle); + return $notification->returnNotification("info", i18n("error log successfully cleared")); +} + +/** + * phpInfoToHtml - grabs phpinfo() output + * + * grabs phpinfo() HTML output + * + * @return string returns phpinfo() HTML output + * @author Marco Jahn + */ +function phpInfoToHtml() +{ + /* get output */ + ob_start(); + phpinfo(); + $phpInfoToHtml = ob_get_contents(); + ob_end_clean(); + + return $phpInfoToHtml; +} + +/** + * check users right for a client + * + * check if the user has a right for a defined client + * + * @param integer client id + * + * @return boolean wether user has access or not + * @author Marco Jahn + */ +function system_have_perm($client) +{ + global $auth; + + if (!isset ($auth->perm['perm'])) + { + $auth->perm['perm'] = ''; + } + + $userPerm = explode(',', $auth->auth['perm']); + + if (in_array('sysadmin', $userPerm)) + { // is user sysadmin ? + return true; + } + elseif (in_array('admin['.$client.']', $userPerm)) + { // is user admin for this client ? + return true; + } + elseif (in_array('client['.$client.']', $userPerm)) + { // has user access to this client ? + return true; + } + return false; +} + +/** +* check for valid ip adress +* +* @param string ip adress +* +* @return boolean if string is a valid ip or not +*/ +function isIPv4($strHostAdress) +{ + // ip pattern needed for validation + $ipPattern = "([0-9]|1?\d\d|2[0-4]\d|25[0-5])"; + if (preg_match("/^$ipPattern\.$ipPattern\.$ipPattern\.$ipPattern?$/", $strHostAdress)) + { // ip is valid + return true; + } + return false; +} + +/** +* must be done +* +* must be done +* +* @param string contenido fullhtmlPath +* @param string current browser string +* +* @return string status of path comparement +*/ +function checkPathInformation($strConUrl, $strBrowserUrl) +{ + // parse url + $arrConUrl = parse_url($strConUrl); + $arrBrowserUrl = parse_url($strBrowserUrl); + + if (isIPv4($arrConUrl['host'])) + { // is + if (isIPv4($arrBrowserUrl['host'])) + { // is + if (compareUrlStrings($arrConUrl, $arrBrowserUrl)) + { + return '1'; + } + + return '2'; + } else + { // isn't + $arrBrowserUrl['host'] = gethostbyname($arrBrowserUrl['host']); + if (!isIPv4($arrBrowserUrl['host'])) + { + return '3'; + } + + if (compareUrlStrings($arrConUrl, $arrBrowserUrl)) + { + return '1'; + } + + return '2'; + } + } else + { // isn't + if (isIPv4($arrBrowserUrl['host'])) + { //is + $tmpAddr = gethostbyaddr($arrBrowserUrl['host']); + $arrBrowserUrl['host'] = str_replace('-', '.', substr($tmpAddr, 0, strpos($tmpAddr, "."))); + + if (isIPv4($arrBrowserUrl['host'])) + { + return '3'; + } + + if (compareUrlStrings($arrConUrl, $arrBrowserUrl, true)) + { + return '1'; + } + + return '2'; + + } else + { // isn't + if (compareUrlStrings($arrConUrl, $arrBrowserUrl)) + { + return '1'; + } + + return '2'; + } + } +} + +/** +* check path informations +* +* checks two path informations against each other to get potential nonconformities +*/ +function compareUrlStrings($arrConUrl, $arrBrowserUrl, $isIP = false) +{ + // && $isIP == false + + // remove 'www.' if needed + if (strpos($arrConUrl['host'], 'www.') == 0 || strpos($arrBrowserUrl['host'], 'www.') == 0) + { + $arrConUrl['host'] = str_replace('www.', '', $arrConUrl); + $arrBrowserUrl['host'] = str_replace('www.', '', $arrBrowserUrl); + } + + $strConUrl = $arrConUrl['scheme'].'://'.$arrConUrl['host'].$arrConUrl['path']; + $strBrowserUrl = $arrBrowserUrl['scheme'].'://'.$arrBrowserUrl['host'].$arrBrowserUrl['path']; + + if (strcmp($strConUrl, $strBrowserUrl) != 0) + { + return false; + } + return true; +} + +/** + * writeSystemValuesOutput - get several server and Contenido settings + * + * parse system and Contenido output into a string + * + * @return string returns a string containing several server and Contenido settings + * @author Marco Jahn + */ +function writeSystemValuesOutput($usage) +{ + + global $db, $_SERVER, $cfg, $i18n, $tpl; + + /* variables to proof against each other*/ + + $contenidoFullHtml = $cfg['path']['contenido_fullhtml']; + $browserPath = $_SERVER['SERVER_PORT'] == '443' ? 'https' : 'http'; + $browserPath .= "://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; + $browserPath = substr($browserPath, 0, strrpos($browserPath, "/") + 1); + + $status = checkPathInformation($contenidoFullHtml, $browserPath); + + if ($status == 1) + { // green + $contenidoFullHtml = "".$contenidoFullHtml."
"; + $browserPath = "".$browserPath.""; + + } + elseif ($status == 2) + { // red + $contenidoFullHtml = "".$contenidoFullHtml."
"; + $browserPath = "".$browserPath.""; + + } + elseif ($status == 3) + { //orange + $contenidoFullHtml = "".$contenidoFullHtml."
"; + $browserPath = "".$browserPath.""; + + } + + /* generate sysvalue output */ + $i = 0; // array start value + // current Contenido version + $sysvalues[$i]['variable'] = i18n('Contenido version'); + $sysvalues[$i ++]['value'] = $cfg['version']; + // paths from config.php + $sysvalues[$i]['variable'] = i18n('Contenido path'); + $sysvalues[$i ++]['value'] = $cfg['path']['contenido']; + $sysvalues[$i]['variable'] = i18n('Contenido HTML path'); + $sysvalues[$i ++]['value'] = $cfg['path']['contenido_html']; + $sysvalues[$i]['variable'] = i18n('Contenido full HTML path'); + $sysvalues[$i ++]['value'] = $contenidoFullHtml; + $sysvalues[$i]['variable'] = i18n('Contenido frontend path'); + $sysvalues[$i ++]['value'] = $cfg['path']['frontend']; + $sysvalues[$i]['variable'] = i18n('Contenido PHPLIB path'); + $sysvalues[$i ++]['value'] = $cfg['path']['phplib']; + $sysvalues[$i]['variable'] = i18n('Contenido wysiwyg path'); + $sysvalues[$i ++]['value'] = $cfg['path']['wysiwyg']; + $sysvalues[$i]['variable'] = i18n('Contenido wysiwyg HTML path'); + $sysvalues[$i ++]['value'] = $cfg['path']['wysiwyg_html']; + // host name + $sysvalues[$i]['variable'] = i18n('Host name'); + $sysvalues[$i ++]['value'] = $_SERVER['HTTP_HOST']; + // Contenido browser path + $sysvalues[$i]['variable'] = i18n('Browser path'); + /* cut of file information */ + $sysvalues[$i ++]['value'] = $browserPath; + // get number of clients + $sql = "SELECT count(name) clientcount FROM ".$cfg["tab"]["clients"]; + $db->query($sql); + $db->next_record(); + $clientcount = $db->f("clientcount"); + + // get all clients and their language + $sql = "SELECT count(a.name) clientcount, + a.name clientname, + a.idclient + FROM + ".$cfg["tab"]["clients"]." a + GROUP BY a.name"; + $db->query($sql); + + // create 'value' output + $db2 = new DB_ConLite; + $clientInformation = " + + + + "; + + $clientPermCount = 0; + while ($db->next_record()) + { + if (system_have_perm($db->f("idclient"))) + { + $clientlang = ""; + + // get client name + $clientName = urldecode($db->f("clientname")); + $clientInformation .= " + + "; + $clientlang = ""; + // select languages belong to a client + $sql = "SELECT c.name clientlang + FROM ".$cfg["tab"]["clients"]." a + LEFT JOIN ".$cfg["tab"]["clients_lang"]." b ON a.idclient = b.idclient + LEFT JOIN ".$cfg["tab"]["lang"]." c ON b.idlang = c.idlang + WHERE a.idclient=".Contenido_Security::toInteger($db->f("idclient"))." AND c.name IS NOT NULL"; + $db2->query($sql); + while ($db2->next_record()) + { + $clientlang .= $db2->f("clientlang").", "; + } + // cut off last "," + $clientlang = substr($clientlang, 0, strlen($clientlang) - 2); + + $clientInformation .= " + + + "; + + $sql = "SELECT frontendpath, htmlpath FROM ".$cfg["tab"]["clients"]." WHERE idclient='".Contenido_Security::toInteger($db->f("idclient"))."'"; + $db2->query($sql); + while ($db2->next_record()) + { + $clientInformation .= " + + + "; + $clientInformation .= " + + + "; + } + $clientPermCount ++; + } + + } + + if ($clientPermCount == 0) + { + $clientInformation .= " + + "; + } + + $clientInformation .= '
".i18n("client settings")."".i18n("values")."
$clientName
".i18n("language(s)")."$clientlang 
".i18n("htmlpath")."".$db2->f("htmlpath")." 
".i18n("frontendpath")."".$db2->f("frontendpath")." 
".i18n("No permissions!")."
'; + + $clientdata = i18n('Number of installed clients: ').$clientcount."
".$clientInformation; + + // client quantity and their assigned language and are they online + $sysvalues[$i]['variable'] = i18n('Client informations'); + $sysvalues[$i ++]['value'] = "$clientdata"; + // get number of users installed + $sql = "SELECT count(user_id) usercount FROM ".$cfg["tab"]["phplib_auth_user_md5"]; + $db->query($sql); + $db->next_record(); + // number of users + $sysvalues[$i]['variable'] = i18n('Number of users'); + $sysvalues[$i ++]['value'] = $db->f("usercount"); + //get number of articles + $sql = "SELECT count(idart) articlecount FROM ".$cfg["tab"]["art"]; + $db->query($sql); + $db->next_record(); + // number of articles + $sysvalues[$i]['variable'] = i18n('Number of articles'); + $sysvalues[$i ++]['value'] = $db->f("articlecount"); + // server operating system + $sysvalues[$i]['variable'] = i18n('Server operating system'); + $sysvalues[$i ++]['value'] = $_SERVER['SERVER_SOFTWARE']; + // SQL version + $sql_server_info = $db->server_info(); + $sysvalues[$i]['variable'] = i18n('PHP database extension'); + $sysvalues[$i ++]['value'] = $cfg["database_extension"]; + $sysvalues[$i]['variable'] = i18n('Database server version'); + $sysvalues[$i ++]['value'] = $sql_server_info['description']; + // php version + $sysvalues[$i]['variable'] = i18n('Installed PHP version'); + $sysvalues[$i ++]['value'] = phpversion(); + // php config values + // config values + // php safe_mode + (ini_get('safe_mode') == 1) ? $safe_mode = "".i18n('activated')."" : $safe_mode = "".i18n('deactivated').""; + $sysvalues[$i]['variable'] = "safe_mode"; + $sysvalues[$i ++]['value'] = $safe_mode; + // magig quotes GPC + (ini_get('magic_quotes_gpc') == 1) ? $magic_quotes_gpc = i18n('activated') : $magic_quotes_gpc = i18n('deactivated'); + $sysvalues[$i]['variable'] = "magic_quotes_gpc"; + $sysvalues[$i ++]['value'] = $magic_quotes_gpc; + // magic quotes runtime + (ini_get('magic_quotes_runtime') == 1) ? $magic_quotes_runtime = i18n('activated') : $magic_quotes_runtime = i18n('deactivated'); + $sysvalues[$i]['variable'] = "magic_quotes_runtime"; + $sysvalues[$i ++]['value'] = $magic_quotes_runtime; + // GPC order + $sysvalues[$i]['variable'] = "gpc_order"; + $sysvalues[$i ++]['value'] = ini_get('gpc_order'); + // memory limit + $sysvalues[$i]['variable'] = "memory_limit"; + $sysvalues[$i ++]['value'] = ini_get('memory_limit'); + // max execution time + $sysvalues[$i]['variable'] = "max_execution_time"; + $sysvalues[$i ++]['value'] = ini_get('max_execution_time'); + // disabled functions + (strlen(ini_get('disable_functions')) > 0) ? $disable_functions = "". str_replace(",", ", ", ini_get('disable_functions'))."" : $disable_functions = "".i18n('nothing disabled').""; + $sysvalues[$i]['variable'] = i18n('Disabled functions'); + $sysvalues[$i ++]['value'] = $disable_functions; + // gettext loaded + (extension_loaded('gettext') == true) ? $gettext = "".i18n('loaded')."" : $gettext = "".i18n('not loaded').""; + $sysvalues[$i]['variable'] = i18n('Gettext extension'); + $sysvalues[$i ++]['value'] = $gettext; + // sql.safe_mode + (ini_get('sql.safe_mode') == 1) ? $sql_safe_mode = "".i18n('activated')."" : $sql_safe_mode = "".i18n('deactivated').""; + $sysvalues[$i]['variable'] = "sql.safe_mode"; + $sysvalues[$i ++]['value'] = $sql_safe_mode; + // gdlib with installed features + $gdLib = array(); + $gdLib = getPhpModuleInfo($moduleName = 'gd'); + $gdLibFeatures = " + + + + "; + + foreach ($sysvalues as $key => $value) { + if (trim ($value['value']) == '') { + $sysvalues[$key]['value'] = ' '; + } + } + + foreach ($gdLib as $setting => $value) + { + $gdLibFeatures .= " + + + "; + } + $gdLibFeatures .= '
".i18n("Settings")."".i18n("Values")."
".$setting."".$value[0]."
'; + $sysvalues[$i]['variable'] = i18n('GD library'); + $sysvalues[$i ++]['value'] = $gdLibFeatures; + + // include path settings + $sysvalues[$i]['variable'] = "include_path"; + $sysvalues[$i ++]['value'] = ini_get('include_path'); + +$iRowId = 1; +$sRowBgColor2 = $sRowBgColor1 = "#fff"; +//loop array for every parameter + foreach ($sysvalues AS $sysvalue) + { + $tpl->set('d', 'VARIABLE', $sysvalue['variable']); + $tpl->set('d', 'LOCALVALUE', $sysvalue['value']); + $tpl->set('d', 'ROWID', 'sysrow_'.$iRowId); + if($iRowId % 2) { + $tpl->set('d', 'BGCOLOR', $sRowBgColor1); + } else { + $tpl->set('d', 'BGCOLOR', $sRowBgColor2); + } + $tpl->next(); + $iRowId++; + } + + /* irgendwas sinnvolles :) */ + if ($usage == 'mail') + { + return $tpl->generate($cfg['path']['templates'].$cfg['templates']['systam_variables_mailattach'], true); + } + elseif ($usage == 'output') + { + // do nothing + } + +} + +/** + * sendBugReport - send users bugreport + * + * send users bugreport + * contains 4 attachements + * (1) errorlog.txt + * (2) install.log.txt + * (3) systemvariablen.html (generaten of writeSystemValuesOutput()) + * (4) phpinfo.html (generated of phpInfoToHtml()) + * + * to avoid errors when filesize attachement (1) or (2) + * is 0kb temporarily attachements with a specified message + * will be created + * + * return value: + * - error code (0-3) + * 0) mail send successfull (no errors or missing data) + * 1) not all fields are filled out + * 2) email adress is not valid + * 3) user hasn't agreed to the declaration of consent + * + * + * @return string returns several server and Contenido settings + * @author Marco Jahn + */ +function sendBugReport() +{ + global $_POST, $notification, $cfg; + + /* will be set to another value than 0 if an error attempts */ + $mailSendError = 0; + + /* check if email is filled out */ + if (strlen($_POST['sender']) == 0) + { + $mailSendError = 1; + } + + /* check if forename is filled out */ + if (strlen($_POST['forename']) == 0) + { + $mailSendError = 1; + } + + /* check if surname is filled out */ + if (strlen($_POST['surname']) == 0) + { + $mailSendError = 1; + } + + /* check if bugreport is filled out */ + if (strlen($_POST['bugreport']) == 0) + { + $mailSendError = 1; + } + + /* check if email adress is valid */ + if (isValidMail($_POST['sender']) == false) + { + $mailSendError = 2; + } + + /* user has not agreed */ + if ($_POST['agreement'] != 'on') + { + $mailSendError = 3; + } + + if ($mailSendError == 0) + { + /* send mail */ + + /* initialize mail class */ + $mail = new PHPMailer(); + + /* set sender information */ + $mail->From = strip_tags($_POST['sender']); + $mail->FromName = strip_tags($_POST['forename']." ".$_POST['surname']); + + /* set recipient */ + $mail->AddAddress($cfg['bugreport']['targetemail'], "Bugreport recipient"); + + /* set mail function to use */ + $mail->Mailer = "mail"; //use php mail function + + /* generate subject & body */ + $mail->Subject = "Bugreport"; + $mail->Body = "Fehlerbereich: ".$_POST['selectarea']."

".nl2br(strip_tags($_POST['bugreport'])); + $mail->AltBody = "Fehlerbereich: ".$_POST['selectarea']."\n\n".strip_tags($_POST['bugreport']); + + /* add attachements */ + if ($_POST['errorlog'] == 'on') + { + if (filesize($cfg['path']['contenido']."logs/errorlog.txt") > 0) + { //filesize > 0 send alternative attachement + $mail->AddAttachment($cfg['path']['contenido']."logs/errorlog.txt", "errorlog.txt"); + } else + { + $mail->AddStringAttachment("No error log entries found\n", "errorlog.txt"); + } + } + + if ($_POST['upgradeerrorlog'] == 'on') + { + if (filesize($cfg['path']['contenido']."logs/install.log.txt") > 0) + { //filesize > 0 send alternative attachement + $mail->AddAttachment($cfg['path']['contenido']."logs/install.log.txt", "install.log.txt"); + } else + { + $mail->AddStringAttachment("No install error log entries found\n", "install.log.txt"); + } + } + + if ($_POST['sysvalues'] == 'on') + { + //send sysvalue output + $mail->AddStringAttachment(writeSystemValuesOutput($usage = 'mail'), "systemvariables.html"); + } + + if ($_POST['phpinfo'] == 'on') + { + //send phpinfo output + $mail->AddStringAttachment(phpInfoToHtml(), "phpinfo.html"); + } + + if (!$mail->Send()) + { + $tmp_notification = $notification->returnNotification("error", i18n("an error occured while sending your bug report! Please try again")); + } else + { + $tmp_notification = $notification->returnNotification("info", i18n("bug report forwarded")); + } + } + elseif ($mailSendError == 1) + { + /* user should fill all fields */ + $tmp_notification = $notification->returnNotification("warning", i18n("please fill out all mandatory fields")); + } + elseif ($mailSendError == 2) + { /* email adress is not valid */ + $tmp_notification = $notification->returnNotification("warning", i18n("please enter a valid E-Mail adress")); + } + elseif ($mailSendError == 3) + { /* user hasn't agreed to the declaration of consent */ + $tmp_notification = $notification->returnNotification("warning", i18n("you must agree the declaration of consent")); + } + return $mailSendError."||".$tmp_notification; +} +?> diff --git a/conlite/includes/functions.tpl.php b/conlite/includes/functions.tpl.php new file mode 100644 index 0000000..bd45df7 --- /dev/null +++ b/conlite/includes/functions.tpl.php @@ -0,0 +1,830 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-21 + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-06-30 timo.trautmann added fix module settings were also copied in function tplDuplicateTemplate + * modified 2009-01-08, Timo Trautmann fixed bug: Changes in Head Containers in visualedit were not stored + * + * $Id: functions.tpl.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude ("includes", "functions.con.php"); + +/** + * Edit or create a new Template + * + * @author Olaf Niemann + * @author Jan Lengowski + * @copyright four for business AG + */ +function tplEditTemplate($changelayout, $idtpl, $name, $description, $idlay, $c, $default) +{ + + global $db; + global $sess; + global $auth; + global $client; + global $cfg; + global $area_tree; + global $perm; + + $db2= new DB_ConLite; + + $date = date("YmdHis"); + $author = "".$auth->auth["uname"].""; + + //******** entry in 'tpl'-table *************** + set_magic_quotes_gpc($name); + set_magic_quotes_gpc($description); + + if (!$idtpl) { + + $idtpl = $db->nextid($cfg["tab"]["tpl"]); + $idtplcfg = $db->nextid($cfg["tab"]["tpl_conf"]); + + /* Insert new entry in the + Template Conf table */ + $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." + (idtplcfg, idtpl, author) VALUES + ('".Contenido_Security::toInteger($idtplcfg)."', '".Contenido_Security::toInteger($idtpl)."', '".Contenido_Security::escapeDB($auth->auth["uname"], $db)."')"; + + $db->query($sql); + + /* Insert new entry in the + Template table */ + $sql = "INSERT INTO ".$cfg["tab"]["tpl"]." + (idtpl, idtplcfg, name, description, deletable, idlay, idclient, author, created, lastmodified) VALUES + ('".Contenido_Security::toInteger($idtpl)."', '".Contenido_Security::toInteger($idtplcfg)."', '".Contenido_Security::escapeDB($name, $db)."', '".Contenido_Security::escapeDB($description, $db)."', + '1', '".Contenido_Security::toInteger($idlay)."', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($author, $db)."', '".Contenido_Security::escapeDB($date, $db)."', + '".Contenido_Security::escapeDB($date, $db)."')"; + + $db->query($sql); + + // set correct rights for element + cInclude ("includes", "functions.rights.php"); + createRightsForElement("tpl", $idtpl); + + } else { + + /* Update */ + $sql = "UPDATE ".$cfg["tab"]["tpl"]." SET name='".Contenido_Security::escapeDB($name, $db)."', description='".Contenido_Security::escapeDB($description, $db)."', idlay='".Contenido_Security::toInteger($idlay)."', + author='".Contenido_Security::escapeDB($author, $db)."', lastmodified='".Contenido_Security::escapeDB($date, $db)."' WHERE idtpl='".Contenido_Security::toInteger($idtpl)."'"; + $db->query($sql); + + if (is_array($c)) { + + /* Delete all container assigned to this template */ + $sql = "DELETE FROM ".$cfg["tab"]["container"]." WHERE idtpl='".Contenido_Security::toInteger($idtpl, $db)."'"; + $db->query($sql); + + foreach($c as $idcontainer => $dummyval) { + + $sql = "INSERT INTO ".$cfg["tab"]["container"]." (idcontainer, idtpl, number, idmod) VALUES "; + $sql .= "("; + $sql .= "'".Contenido_Security::toInteger($db->nextid($cfg["tab"]["container"]))."', "; + $sql .= "'".Contenido_Security::toInteger($idtpl)."', "; + $sql .= "'".Contenido_Security::toInteger($idcontainer)."', "; + $sql .= "'".Contenido_Security::toInteger($c[$idcontainer])."'"; + $sql .= ") "; + $db->query($sql); + + } + } + + /* Generate code */ + conGenerateCodeForAllartsUsingTemplate($idtpl); + + } + + if ($default == 1) + { + $sql = "UPDATE ".$cfg["tab"]["tpl"]." SET defaulttemplate = '0' WHERE idclient = '".Contenido_Security::toInteger($client)."'"; + $db->query($sql); + + $sql = "UPDATE ".$cfg["tab"]["tpl"]." SET defaulttemplate = '1' WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."' AND idclient = '".Contenido_Security::toInteger($client)."'"; + $db->query($sql); + } else { + $sql = "UPDATE ".$cfg["tab"]["tpl"]." SET defaulttemplate = '0' WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."' AND idclient = '".Contenido_Security::toInteger($client)."'"; + $db->query($sql); + } + + + //******** if layout is changed stay at 'tpl_edit' otherwise go to 'tpl' + if ($changelayout != 1) { + $url = $sess->url("main.php?area=tpl_edit&idtpl=$idtpl&frame=4"); + header("location: $url"); + } + + return $idtpl; + +} + +/** + * Delete a template + * + * @param int $idtpl ID of the template to duplicate + * + * @return $new_idtpl ID of the duplicated template + * @author Olaf Niemann + * @author Jan Lengowski + * @copyright four for business AG + */ +function tplDeleteTemplate($idtpl) { + + global $db, $client, $lang, $cfg, $area_tree, $perm; + + $sql = "DELETE FROM ".$cfg["tab"]["tpl"]." WHERE idtpl='".Contenido_Security::toInteger($idtpl)."'"; + $db->query($sql); + + /* JL 160603 : Delete all unnecessary entries */ + + $sql = "DELETE FROM ".$cfg["tab"]["container"]." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + $db->query($sql); + + $idsToDelete = array(); + $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + $db->query($sql); + while ( $db->next_record() ) { + $idsToDelete[] = $db->f("idtplcfg"); + } + + foreach ( $idsToDelete as $id ) { + + $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($id)."'"; + $db->query($sql); + + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($id)."'"; + $db->query($sql); + + } + + cInclude ("includes", "functions.rights.php"); + deleteRightsForElement("tpl", $idtpl); + +} + + +/** + * Browse a specific layout for containers + * + * @param int $idtpl Layout number to browse + * + * @return string &-seperated String of all containers + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function tplBrowseLayoutForContainers($idlay, $raw_code = NULL) { + global $db; + global $cfg; + global $containerinf; + + if(is_null($raw_code) || empty($raw_code)) { + $sql = "SELECT code FROM ".$cfg["tab"]["lay"]." WHERE idlay='".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + $db->next_record(); + $code = $db->f("code"); + } else { + $code = $raw_code; + } + + preg_match_all ("/CMS_CONTAINER\[([0-9]*)\]/", $code, $a_container); + $iPosBody = stripos($code, ''); + $sCodeBeforeHeader = substr($code, 0, $iPosBody); + + foreach ($a_container[1] as $value) { + if (preg_match("/CMS_CONTAINER\[$value\]/", $sCodeBeforeHeader)) { + $containerinf[$idlay][$value]["is_body"] = false; + } else { + $containerinf[$idlay][$value]["is_body"] = true; + } + } + + if (is_array($containerinf[$idlay])) { + foreach ($containerinf[$idlay] as $key => $value) { + $a_container[1][] = $key; + } + } + + $container = Array(); + + foreach ($a_container[1] as $value) { + if (!in_array($value, $container)) { + $container[] = $value; + } + } + + asort($container); + + if (is_array($container)) { + $tmp_returnstring = implode("&",$container); + } + return $tmp_returnstring; +} + +/** + * Retrieve the container name + * + * @param int $idtpl Layout number to browse + * @param int $container Container number + * + * @return string Container name + */ +function tplGetContainerName($idlay, $container) +{ + global $db; + global $cfg; + global $containerinf; + + if (is_array($containerinf[$idlay])) + { + if (array_key_exists($container, $containerinf[$idlay])) + { + return $containerinf[$idlay][$container]["name"]; + } + } +} + +/** + * Retrieve the container mode + * + * @param int $idtpl Layout number to browse + * @param int $container Container number + * + * @return string Container name + */ +function tplGetContainerMode($idlay, $container) +{ + global $db; + global $cfg; + global $containerinf; + + if (is_array($containerinf[$idlay])) + { + if (array_key_exists($container, $containerinf[$idlay])) + { + return $containerinf[$idlay][$container]["mode"]; + } + } +} + +/** + * Retrieve the allowed container types + * + * @param int $idtpl Layout number to browse + * @param int $container Container number + * + * @return array Allowed container types + */ +function tplGetContainerTypes($idlay, $container) +{ + global $db; + global $cfg; + global $containerinf; + + if (is_array($containerinf[$idlay])) + { + if (array_key_exists($container, $containerinf[$idlay])) + { + if ($containerinf[$idlay][$container]["types"] != "") + { + $list = explode(",",$containerinf[$idlay][$container]["types"]); + + foreach ($list as $key => $value) + { + $list[$key] = trim($value); + } + return $list; + } + } + } +} + +/** + * Retrieve the default module + * + * @param int $idtpl Layout number to browse + * @param int $container Container number + * + * @return array Allowed container types + */ +function tplGetContainerDefault($idlay, $container) +{ + global $db; + global $cfg; + global $containerinf; + + if (is_array($containerinf[$idlay])) + { + if (array_key_exists($container, $containerinf[$idlay])) + { + return $containerinf[$idlay][$container]["default"]; + } + } +} + +/** + * Preparse the layout for caching purposes + * + * @param int $idtpl Layout number to browse + * + * @return none + */ +function tplPreparseLayout ($idlay, $raw_code = NULL) { + global $containerinf; + global $db; + global $cfg; + + if(is_null($raw_code) || empty($raw_code)) { + $sql = "SELECT code FROM ".$cfg["tab"]["lay"]." WHERE idlay='".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + $db->next_record(); + $code = $db->f("code"); + } else { + $code = $raw_code; + } + + $parser = new HtmlParser($code); + $bIsBody = false; + while ($parser->parse()) + { + if (strtolower($parser->iNodeName) == 'body') { + $bIsBody = true; + } + + if ($parser->iNodeName == "container" && $parser->iNodeType == NODE_TYPE_ELEMENT) + { + $idcontainer = $parser->iNodeAttributes["id"]; + + $mode = $parser->iNodeAttributes["mode"]; + + if ($mode == "") + { + $mode = "optional"; + } + + $containerinf[$idlay][$idcontainer]["name"] = $parser->iNodeAttributes["name"]; + $containerinf[$idlay][$idcontainer]["mode"] = $mode; + $containerinf[$idlay][$idcontainer]["default"] = $parser->iNodeAttributes["default"]; + $containerinf[$idlay][$idcontainer]["types"] = $parser->iNodeAttributes["types"]; + $containerinf[$idlay][$idcontainer]["is_body"] = $bIsBody; + } + } +} + +/** + * Duplicate a template + * + * @param int $idtpl ID of the template to duplicate + * + * @return $new_idtpl ID of the duplicated template + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function tplDuplicateTemplate($idtpl) { + + global $db, $client, $lang, $cfg, $sess, $auth; + + $db2 = new DB_ConLite; + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["tpl"]." + WHERE + idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + + $db->query($sql); + $db->next_record(); + + $idclient = $db->f("idclient"); + $idlay = $db->f("idlay"); + $new_idtpl = $db->nextid($cfg["tab"]["tpl"]); + //modified (added) 2008-06-30 timo.trautmann added fix module settings were also copied + $idtpl_conf = $db->f("idtplcfg"); + if($idtpl_conf) { + $new_idtpl_conf = $db->nextid($cfg["tab"]["tpl_conf"]); + } + //modified (added) 2008-06-30 end + $name = sprintf(i18n("%s (Copy)"), $db->f("name")); + $descr = $db->f("description"); + $author = $auth->auth["uname"]; + $created = time(); + $lastmod = time(); + + //modified (added) 2008-06-30 : idtplcfg -> $new_idtpl + $sql = "INSERT INTO + ".$cfg["tab"]["tpl"]." + (idclient, idlay, idtpl, ".($idtpl_conf?'idtplcfg,':'')." name, description, deletable,author, created, lastmodified) + VALUES + ('".Contenido_Security::toInteger($idclient)."', '".Contenido_Security::toInteger($idlay)."', '".Contenido_Security::toInteger($new_idtpl)."', ".($idtpl_conf?"'".Contenido_Security::toInteger($new_idtpl_conf)."', ":'')." '".Contenido_Security::escapeDB($name, $db)."', + '".Contenido_Security::escapeDB($descr, $db)."', '1', '".Contenido_Security::escapeDB($author, $db)."', '".Contenido_Security::escapeDB($created, $db)."', '".Contenido_Security::escapeDB($lastmod, $db)."')"; + $db->query($sql); + + $a_containers = array(); + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["container"]." + WHERE + idtpl = '".Contenido_Security::toInteger($idtpl)."' + ORDER BY + number"; + + $db->query($sql); + + while ($db->next_record()) { + $a_containers[$db->f("number")] = $db->f("idmod"); + } + + foreach ($a_containers as $key => $value) { + + $nextid = $db->nextid($cfg["tab"]["container"]); + + $sql = "INSERT INTO ".$cfg["tab"]["container"]." + (idcontainer, idtpl, number, idmod) VALUES ('".Contenido_Security::toInteger($nextid)."', '".Contenido_Security::toInteger($new_idtpl)."', '".Contenido_Security::toInteger($key)."', '".Contenido_Security::toInteger($value)."')"; + + $db->query($sql); + + } + + //modified (added) 2008-06-30 timo.trautmann added fix module settings were also copied + if($idtpl_conf) { + $a_container_cfg = array(); + $sql = "SELECT + * + FROM + ".$cfg["tab"]["container_conf"]." + WHERE + idtplcfg = '".Contenido_Security::toInteger($idtpl_conf)."' + ORDER BY + number"; + + $db->query($sql); + + while ($db->next_record()) { + $a_container_cfg[$db->f("number")] = $db->f("container"); + } + + foreach ($a_container_cfg as $key => $value) { + + $nextid = $db->nextid($cfg["tab"]["container_conf"]); + + $sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." + (idcontainerc, idtplcfg, number, container) VALUES ('".Contenido_Security::toInteger($nextid)."', '".Contenido_Security::toInteger($new_idtpl_conf)."', '".Contenido_Security::escapeDB($key, $db)."', '".Contenido_Security::escapeDB($value, $db)."')"; + + $db->query($sql); + + } + } + //modified (added) 2008-06-30 end + + cInclude ("includes", "functions.rights.php"); + copyRightsForElement("tpl", $idtpl, $new_idtpl); + + return $new_idtpl; + +} + +/** + * Checks if a template is in use + * + * @param int $idtpl Template ID + * + * @return bool is template in use + * + * @author Jan Lengowski + * @copyright four for business AG + * + * modified Munkh-Ulzii Balidar, improved the sql query without while loop + */ +function tplIsTemplateInUse($idtpl) { + + global $cfg, $client, $lang; + + $db = new DB_ConLite; + // Check categorys + $sql = "SELECT + b.idcatlang, b.name, b.idlang, b.idcat + FROM + ".$cfg["tab"]["cat"]." AS a, + ".$cfg["tab"]["cat_lang"]." AS b + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idcat = b.idcat AND + b.idtplcfg IN (SELECT idtplcfg FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtpl = '".$idtpl."') + ORDER BY b.idlang ASC, b.name ASC "; + $db->query($sql); + if ($db->Errno == '' && $db->num_rows() > 0) { + return true; + } + + // Check articles + $sql = "SELECT + b.idartlang, b.title, b.idlang, b.idart + FROM + ".$cfg["tab"]["art"]." AS a, + ".$cfg["tab"]["art_lang"]." AS b + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idart = b.idart AND + b.idtplcfg IN (SELECT idtplcfg FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtpl = '".$idtpl."') + ORDER BY b.idlang ASC, b.title ASC "; + + $db->query($sql); + + if ($db->Errno == '' && $db->num_rows() > 0) { + return true; + } + + return false; + +} + +/** + * Get used datas if a template is in use + * + * @param int $idtpl Template ID + * + * @return array - category name, article name + * + * @author Munkh-Ulzii Balidar + * @copyright four for business AG + */ +function tplGetInUsedData($idtpl) { + + global $cfg, $client, $lang; + + $db = new DB_ConLite; + + $aUsedData = array(); + + // Check categorys + $sql = "SELECT + b.idcatlang, b.name, b.idlang, b.idcat + FROM + ".$cfg["tab"]["cat"]." AS a, + ".$cfg["tab"]["cat_lang"]." AS b + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idcat = b.idcat AND + b.idtplcfg IN (SELECT idtplcfg FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtpl = '".$idtpl."') + ORDER BY b.idlang ASC, b.name ASC "; + $db->query($sql); + if ($db->Errno == 0 && $db->num_rows() > 0) { + while ($db->next_record()) { + $aUsedData['cat'][] = array( + 'name' => $db->f('name'), + 'lang' => $db->f('idlang'), + 'idcat' => $db->f('idcat'), + ); + } + } + + // Check articles + $sql = "SELECT + b.idartlang, b.title, b.idlang, b.idart + FROM + ".$cfg["tab"]["art"]." AS a, + ".$cfg["tab"]["art_lang"]." AS b + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idart = b.idart AND + b.idtplcfg IN (SELECT idtplcfg FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtpl = '".$idtpl."') + ORDER BY b.idlang ASC, b.title ASC "; + + $db->query($sql); + + if ($db->Errno == '' && $db->num_rows() > 0) { + while ($db->next_record()) { + $aUsedData['art'][] = array( + 'title' => $db->f('title'), + 'lang' => $db->f('idlang'), + 'idart' => $db->f('idart'), + ); + } + } + + return $aUsedData; + +} + +/** + * Copies a complete template configuration + * + * @param int $idtplcfg Template Configuration ID + * + * @return int new template configuration ID + * + */ +function tplcfgDuplicate ($idtplcfg) +{ + global $cfg; + + $db = new DB_ConLite; + $db2 = new DB_ConLite; + + $sql = "SELECT + idtpl, status, author, created, lastmodified + FROM + ".$cfg["tab"]["tpl_conf"]." + WHERE + idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."'"; + + $db->query($sql); + + if ($db->next_record()) + { + $newidtplcfg = $db2->nextid($cfg["tab"]["tpl_conf"]); + $idtpl = $db->f("idtpl"); + $status = $db->f("status"); + $author = $db->f("author"); + $created = $db->f("created"); + $lastmodified = $db->f("lastmodified"); + + $sql = "INSERT INTO + ".$cfg["tab"]["tpl_conf"]." + (idtplcfg, idtpl, status, author, created, lastmodified) + VALUES + ('".Contenido_Security::toInteger($newidtplcfg)."', '".Contenido_Security::toInteger($idtpl)."', '".Contenido_Security::toInteger($status)."', '".Contenido_Security::escapeDB($author, $db2)."', + '".Contenido_Security::escapeDB($created, $db2)."', '".Contenido_Security::escapeDB($lastmodified, $db2)."')"; + + $db2->query($sql); + + /* Copy container configuration */ + $sql = "SELECT + number, container + FROM + ".$cfg["tab"]["container_conf"]." + WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."'"; + + $db->query($sql); + + while ($db->next_record()) + { + $newidcontainerc = $db2->nextid($cfg["tab"]["container_conf"]); + $number = $db->f("number"); + $container = $db->f("container"); + + $sql = "INSERT INTO + ".$cfg["tab"]["container_conf"]." + (idcontainerc, idtplcfg, number, container) + VALUES + ('".Contenido_Security::toInteger($newidcontainerc)."', '".Contenido_Security::toInteger($newidtplcfg)."', '".Contenido_Security::toInteger($number)."', '".Contenido_Security::escapeDB($container, $db2)."')"; + $db2->query($sql); + } + } + + return ($newidtplcfg); + +} + +/* + * tplAutoFillModules + * + * This function fills in modules automatically using this logic: + * + * - If the container mode is fixed, insert the named module (if exists) + * - If the container mode is mandatory, insert the "default" module (if exists) + * + * TODO: The default module is only inserted in mandatory mode if the container + * is empty. We need a better logic for handling "changes". + */ + +function tplAutoFillModules ($idtpl) +{ + global $cfg; + global $db_autofill; + global $containerinf; + global $_autoFillcontainerCache; + + if (!is_object($db_autofill)) + { + $db_autofill = new DB_ConLite; + } + + $sql = "SELECT idlay FROM ".$cfg["tab"]["tpl"]." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + $db_autofill->query($sql); + + if (!$db_autofill->next_record()) + { + return false; + } + + $idlay = $db_autofill->f("idlay"); + + if (!(is_array($containerinf) && array_key_exists($idlay, $containerinf) && array_key_exists($idlay, $_autoFillcontainerCache))) + { + tplPreparseLayout($idlay); + $_autoFillcontainerCache[$idlay] = tplBrowseLayoutForContainers($idlay); + } + + $a_container = explode("&",$_autoFillcontainerCache[$idlay]); + + foreach ($a_container as $container) + { + switch ($containerinf[$idlay][$container]["mode"]) + { + /* Fixed mode */ + case "fixed": + if ($containerinf[$idlay][$container]["default"] != "") + { + $sql = "SELECT idmod FROM ".$cfg["tab"]["mod"] + ." WHERE name = '". + Contenido_Security::escapeDB($containerinf[$idlay][$container]["default"], $db_autofill)."'"; + + $db_autofill->query($sql); + + if ($db_autofill->next_record()) + { + $idmod = $db_autofill->f("idmod"); + + + $sql = "SELECT idcontainer FROM ".$cfg["tab"]["container"]." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."' AND number = '".Contenido_Security::toInteger($container)."'"; + + $db_autofill->query($sql); + + if ($db_autofill->next_record()) + { + $sql = "UPDATE ".$cfg["tab"]["container"]. + " SET idmod = '".Contenido_Security::toInteger($idmod)."' WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."'". + " AND number = '".Contenido_Security::toInteger($container)."' AND ". + " idcontainer = '".Contenido_Security::toInteger($db_autofill->f("idcontainer"))."'"; + $db_autofill->query($sql); + } else { + $sql = "INSERT INTO ".$cfg["tab"]["container"]. + " (idcontainer, idtpl, number, idmod) ". + " VALUES ('".$db_autofill->nextid($cfg["tab"]["container"])."', ". + " '$idtpl', '$container', '$idmod')"; + $db_autofill->query($sql); + } + } + } + + + case "mandatory": + + if ($containerinf[$idlay][$container]["default"] != "") + { + $sql = "SELECT idmod FROM ".$cfg["tab"]["mod"] + ." WHERE name = '". + Contenido_Security::escapeDB($containerinf[$idlay][$container]["default"], $db)."'"; + + $db_autofill->query($sql); + + if ($db_autofill->next_record()) + { + $idmod = $db_autofill->f("idmod"); + + + $sql = "SELECT idcontainer, idmod FROM ".$cfg["tab"]["container"] + ." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."' AND number = '".Contenido_Security::toInteger($container)."'"; + + $db_autofill->query($sql); + + if ($db_autofill->next_record()) + { + + } else { + $sql = "INSERT INTO ".$cfg["tab"]["container"]. + " (idcontainer, idtpl, number, idmod) ". + " VALUES ('".Contenido_Security::toInteger($db_autofill->nextid($cfg["tab"]["container"]))."', ". + " '".Contenido_Security::toInteger($idtpl)."', '".Contenido_Security::toInteger($container)."', '".Contenido_Security::toInteger($idmod)."')"; + $db_autofill->query($sql); + } + } + } + } + } + +} + +?> \ No newline at end of file diff --git a/conlite/includes/functions.upl.php b/conlite/includes/functions.upl.php new file mode 100644 index 0000000..d909a1e --- /dev/null +++ b/conlite/includes/functions.upl.php @@ -0,0 +1,973 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-28 + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2008-11-27, Andreas Lindner, add possibility to define additional chars as allowed in file / dir names + * modified 2009-03-16, Ingo van Peeren, fixed some sql-statements and a missing parameter in uplRenameDirectory() + * modified 2009-10-22, OliverL, fixed uplHasFiles is only one file in directory you can delete Directory + * modified 2009-10-29, Murat Purc, replaced deprecated functions (PHP 5.3 ready) and usage of is_dbfs() + * + * $Id: functions.upl.php 350 2015-09-24 11:52:45Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Function reduces long path names and creates a dynamic tooltipp which shows + * the full path name on mouseover + * + * @author Timo Trautmann (4fb) + * @param string $sDisplayPath - original filepath + * @param int $iLimit - limit of chars which were displayed directly. If the path + * string is shorter there will be no tooltipp + * @return string - string, which contains short path name and tooltipp if neccessary + */ +function generateDisplayFilePath ($sDisplayPath, $iLimit) { + $sDisplayPath = (string) trim($sDisplayPath); + $iLimit = (int) $iLimit; + if (strlen($sDisplayPath) > $iLimit) { + $sDisplayPathShort = capiStrTrimHard($sDisplayPath, $iLimit); + + $sTooltippString = ''; + $iCharcount = 0; + + $aPathFragments = explode('/', $sDisplayPath); + + foreach ($aPathFragments as $sFragment) { + if ($sFragment != '') { + if (strlen($sFragment) > ($iLimit-5)) { + $sFragment = capiStrTrimHard($sFragment, $iLimit); + } + + if($iCharcount+strlen($sFragment)+1 > $iLimit) { + $sTooltippString .= '
'.$sFragment.'/'; + $iCharcount = strlen($sFragment); + } else { + $iCharcount = $iCharcount+1+strlen($sFragment); + $sTooltippString .= $sFragment.'/'; + } + } + } + + $sDisplayPath = ''.$sDisplayPathShort.''; + } + return $sDisplayPath; +} + +function uplDirectoryListRecursive ($currentdir, $startdir=NULL, $files=array(), $depth=-1, $pathstring="") { + $depth++; + + $unsorted_files = array(); + + if (chdir ($currentdir) == false) + { + return; + } + + // remember where we started from + if (!$startdir) { + $startdir = $currentdir; + } + $d = opendir ("."); + + //list the files in the dir + while ($file = readdir ($d)) { + if ($file != ".." && $file != ".") { + if (is_dir ($file)) { + $unsorted_files[] = $file; + } else { + } + } + } + if (is_array($unsorted_files)) sort($unsorted_files); + $sorted_files = $unsorted_files; + + if(is_array($sorted_files)) { + foreach ($sorted_files as $file) { + if ($file != ".." && $file != ".") { + + if ((filetype(getcwd()."/".$file) == "dir") && + (opendir(getcwd()."/".$file) !== false)) { + $a_file['name'] = $file; + $a_file['depth'] = $depth; + $a_file['pathstring'] = $pathstring.$file.'/';; + + $files[] = $a_file; + // If $file is a directory take a look inside + $files = uplDirectoryListRecursive (getcwd().'/'.$file, getcwd(), $files, $depth, $a_file['pathstring']); + } else { + // If $ file is not a directory then do nothing + } + } + } + } + + closedir ($d); + chdir ($startdir); + return $files; +} + +function upldelete($path, $files) { + global $cfgClient, $client, $con_cfg, $db, $cfg; + + $path = $cfgClient[$client]['upl']['path'].$path; + + if (!is_array($files)) { + $tmp[] = $files; + unset($files); + $files = $tmp; + } + + $ArrayCount = count($files); + for ($i=0; $i<$ArrayCount; $i++) { + if (is_dir($path.urldecode($files[$i]))) { + uplRecursiveRmDirIfEmpty($path.urldecode($files[$i])); + + $sql = "DELETE FROM ".$cfg["tab"]["upl"]." WHERE dirname='".Contenido_Security::escapeDB($files[$i], $db)."/'"; + $db->query($sql); + } else { + if (file_exists ($cfgClient[$client]["path"]["frontend"].$con_cfg['PathFrontendTmp'].urldecode($files[$i]))) { + unlink($cfgClient[$client]["path"]["frontend"].$con_cfg['PathFrontendTmp'].urldecode($files[$i])); + } + + $file_name = urldecode($files[$i]); + $sql_dirname = str_replace($cfgClient[$client]['upl']['path'], '', $path); + + unlink($path.$file_name); + + $sql = "SELECT idupl + FROM ".$cfg["tab"]["upl"]." + WHERE + idclient='".Contenido_Security::toInteger($client)."' + AND + filename='".Contenido_Security::toInteger($file_name)."' + AND + dirname='".Contenido_Security::escapeDB($sql_dirname)."'"; + $db->query($sql); + if ($db->next_record()) { + $sql = "DELETE FROM ".$cfg["tab"]["upl"]." WHERE idupl='".Contenido_Security::toInteger($db->f("idupl"))."'"; + $db->query($sql); + } + + } + } +} + +function uplRecursiveRmDirIfEmpty($dir) { + + global $notification; + + if(!is_dir($dir)) { + return 0; + } + $directory = @opendir($dir); + + if (!$directory) + { + return false; + } + readdir($directory); + + while(false !== ($dir_entry = readdir($directory))) { + if($dir_entry != "." && $dir_entry != "..") { + if (is_dir($dir."/".$dir_entry)) { + uplrecursivermdir($dir."/".$dir_entry); + } else { + $notification->displayNotification("warning", "Im Verzeichnis $dir sind noch Dateien vorhanden. Löschen nicht möglich."); + } + } + } + closedir($directory); + unset($directory); + if (@rmdir($dir)) { + return 1; + } else { + return 0; + } +} + +function uplHasFiles($dir) +{ + global $client, $cfgClient; + + $directory = @opendir($cfgClient[$client]["upl"]["path"].$dir); + + if (!$directory) { + return true; + } + + while(false !== ($dir_entry = readdir($directory))) { + if($dir_entry != "." && $dir_entry != "..") { + closedir($directory); + return (true); + } + } + closedir($directory); + unset($directory); + + return false; +} + +function uplHasSubdirs($dir) +{ + global $client, $cfgClient; + + $directory = @opendir($cfgClient[$client]["upl"]["path"].$dir); + + if (!$directory) + { + return true; + } + + readdir($directory); + + $ret = false; + + while(false !== ($dir_entry = readdir($directory))) { + if ($dir_entry != "." && $dir_entry != "..") + { + if (is_dir($cfgClient[$client]["upl"]["path"].$dir.$dir_entry)) + { + closedir($directory); + return true; + } + } + } + + return ($ret); +} + + +/** + * uplSyncDirectory ($path) + * Sync database contents with directory + * + * @param string $path Specifies the path to scan + */ +function uplSyncDirectory ($path) +{ + global $cfgClient, $client, $cfg, $db; + + if (is_dbfs($path)) + { + return uplSyncDirectoryDBFS($path); + } + + $uploads = new UploadCollection; + $properties = new PropertyCollection; + + /* Read all files in a specific directory */ + $dir = $cfgClient[$client]['upl']['path'].$path; + + $olddir = getcwd(); + + @chdir($dir); + $dirhandle = @opendir($dir); + + /* Whoops, probably failed to open. Return to the caller, but clean up stuff first. */ + if (!$dirhandle) + { + $uploads->select("dirname = '$path' AND idclient = '$client'"); + + while ($upload = $uploads->next()) + { + if (!file_exists($cfgClient[$client]["upl"]["path"].$upload->get("dirname").$upload->get("filename"))) + { + $uploads->delete($upload->get("idupl")); + } + } + + // A click on "Upload" (root) would result in path = "" and this will result in LIKE '%' = everything + // So, we have to exclude dbfs-files, as they "don't exist" (-> file_exists) + $properties->select("idclient = '$client' AND itemtype='upload' AND type='file' AND itemid LIKE '".$path."%' AND itemid NOT LIKE 'dbfs%'"); + + while ($property = $properties->next()) + { + if (!file_exists($cfgClient[$client]["upl"]["path"].$property->get("itemid"))) + { + $properties->delete($property->get("idproperty")); + } + } + + chdir($olddir); + return; + } + + /* Put all the files into the $files array */ + while ($file = readdir ($dirhandle)) + { + if ($file != "." && $file != "..") + { + if (is_file($file)) + { + $uploads->sync($path, $file); + } + } + } + + $uploads->select("dirname = '$path' AND idclient = '$client'"); + + while ($upload = $uploads->next()) + { + if (!file_exists($cfgClient[$client]["upl"]["path"].$upload->get("dirname").$upload->get("filename"))) + { + $uploads->delete($upload->get("idupl")); + } + } + + // A click on "Upload" (root) would result in path = "" and this will result in LIKE '%' = everything + // So, we have to exclude dbfs-files, as they "don't exist" (-> file_exists) + $properties->select("idclient = '$client' AND itemtype='upload' AND type='file' AND itemid LIKE '".$path."%' AND itemid NOT LIKE 'dbfs%'"); + + while ($property = $properties->next()) + { + if (!file_exists($cfgClient[$client]["upl"]["path"].$property->get("itemid"))) + { + $properties->delete($property->get("idproperty")); + } + } + + chdir($olddir); +} + +/** + * uplSyncDirectoryDBFS ($path) + * Sync database contents with DBFS + * + * @param string $path Specifies the path to scan + */ +function uplSyncDirectoryDBFS ($path) +{ + global $cfgClient, $client, $cfg, $db; + + $uploads = new UploadCollection; + $properties = new PropertyCollection; + $dbfs = new DBFSCollection; + + if ($dbfs->dir_exists($path)) + { + $strippath = $dbfs->strip_path($path); + + $dbfs->select("dirname = '$strippath'"); + + while ($file = $dbfs->next()) + { + if ($file->get("filename") != ".") + { + $uploads->sync($path."/", $file->get("filename")); + } + } + } + + $uploads->select("dirname = '$path/' AND idclient = '$client'"); + + while ($upload = $uploads->next()) + { + if (!$dbfs->file_exists($upload->get("dirname").$upload->get("filename"))) + { + $uploads->delete($upload->get("idupl")); + } + } + + $properties->select("idclient = '$client' AND itemtype='upload' AND type='file' AND itemid LIKE '".$path."%'"); + + while ($property = $properties->next()) + { + if (!$dbfs->file_exists($property->get("itemid"))) + { + $properties->delete($property->get("idproperty")); + } + } + + return; +} + + +function uplmkdir($path,$name) { + + global $cfgClient, $client, $action; + + if (is_dbfs($path)) + { + $path = str_replace("dbfs:","", $path); + + $fullpath = $path."/".$name."/."; + + $dbfs = new DBFSCollection; + $dbfs->create($fullpath); + return; + } + + $name = uplCreateFriendlyName($name); + $name = strtr($name, "'", "."); + if(file_exists($cfgClient[$client]['upl']['path'].$path.$name)) { + $action = "upl_mkdir"; + return "0702"; + } else { + $oldumask = umask(0); + @mkdir($cfgClient[$client]['upl']['path'].$path.$name,0775); + umask($oldumask); + } +} + +function uplRenameDirectory ($oldpath, $newpath, $parent) +{ + global $cfgClient, $client, $cfg, $db; + + $db2 = new DB_ConLite; + + rename($cfgClient[$client]['upl']['path'].$parent.$oldpath, $cfgClient[$client]['upl']['path'].$parent.$newpath."/"); + + /* Fetch all directory strings starting with the old path, and replace them + with the new path */ + $sql = "SELECT dirname, idupl FROM ".$cfg["tab"]["upl"]." WHERE idclient='".Contenido_Security::toInteger($client)."' AND dirname LIKE '".Contenido_Security::escapeDB($parent, $db).Contenido_Security::escapeDB($oldpath, $db)."%'"; + $db->query($sql); + + while ($db->next_record()) + { + $moldpath = $db->f("dirname"); + $junk = substr($moldpath, strlen($parent) + strlen($oldpath)); + + $newpath2 = $parent . $newpath . $junk; + + $idupl = $db->f("idupl"); + $sql = "UPDATE ".$cfg["tab"]["upl"]." SET dirname='".Contenido_Security::escapeDB($newpath2, $db)."' WHERE idupl = '".Contenido_Security::toInteger($idupl)."'"; + $db2->query($sql); + + } + + $sql = "SELECT itemid, idproperty FROM ".$cfg["tab"]["properties"]." WHERE itemid LIKE '".Contenido_Security::escapeDB($parent, $db).Contenido_Security::escapeDB($oldpath, $db)."%'"; + $db->query($sql); + + while ($db->next_record()) + { + $moldpath = $db->f("itemid"); + $junk = substr($moldpath, strlen($parent) + strlen($oldpath)); + + $newpath2 = $parent . $newpath . $junk; + $idproperty = $db->f("idproperty"); + $sql = "UPDATE ".$cfg["tab"]["properties"]." SET itemid = '$newpath2' WHERE idproperty='$idproperty'"; + $db2->query($sql); + } + +} + + +function uplRecursiveDirectoryList ($directory, &$rootitem, $level, $sParent = '', $iRenameLevel = null) +{ + $dirhandle = @opendir($directory); + + if (!$dirhandle) + { + } + else + { + $aInvalidDirectories = array(); + + unset($files); + + //list the files in the dir + while ($file = readdir ($dirhandle)) + { + if ($file != "." && $file != "..") + { + if (@chdir($directory.$file."/")) + { + if (uplCreateFriendlyName($file) == $file) { + $files[] = $file; + } else { + if ($_GET['force_rename'] == 'true') { + if ($iRenameLevel == 0 || $iRenameLevel == $level) { + uplRenameDirectory($file, uplCreateFriendlyName($file), $sParent); + $iRenameLevel = $level; + $files[] = uplCreateFriendlyName($file); + } else { + array_push($aInvalidDirectories, $file); + } + } else { + array_push($aInvalidDirectories, $file); + } + } + } + } + } + + if (is_array($files)) + { + sort($files); + foreach ($files as $key => $file) + { + /* We aren't using is_dir anymore as that function is buggy */ + $olddir = getcwd(); + if ($file != "." && $file != "..") + { + if (@chdir($directory.$file."/")) + { + unset($item); + $item = new TreeItem($file, $directory.$file."/",true); + $item->custom["level"] = $level; + + if ($key == count($files)-1) + { + $item->custom["lastitem"] = true; + } else { + $item->custom["lastitem"] = false; + } + + $item->custom["parent"] = $directory; + + $rootitem->addItem($item); + $old = $rootitem; + $aArrayTemp = uplRecursiveDirectoryList($directory.$file."/", $item, $level + 1, $sParent.$file.'/', $iRenameLevel); + $aInvalidDirectories = array_merge($aInvalidDirectories, $aArrayTemp); + $rootitem = $old; + chdir($olddir); + } + } + } + } + } + + @closedir ($dirhandle); + return $aInvalidDirectories; +} + + +function uplRecursiveDBDirectoryList ($directory, &$rootitem, $level) +{ + $dbfs = new DBFSCollection; + $dbfs->select("filename = '.'","dirname", "dirname ASC"); + $count = 0; + $lastlevel = 0; + $item["."] = &$rootitem; + + while ($dbitem = $dbfs->next()) + { + $dirname = $dbitem->get("dirname"); + $level = substr_count($dirname, "/")+2; + $file = basename($dbitem->get("dirname")); + $parent = dirname($dbitem->get("dirname")); + + if ($dirname != "." && $file != ".") + { + $item[$dirname] = new TreeItem($file, "dbfs:/".$dirname,true); + $item[$dirname]->custom["level"] = $level; + $item[$dirname]->custom["parent"] = $parent; + $item[$dirname]->custom["lastitem"] = true; + + if ($prevobj[$level]->custom["level"] == $level) + { + if (is_object($prevobj[$level])) + { + $prevobj[$level]->custom["lastitem"] = false; + } + } + + if ($lastlevel > $level) + { + unset($prevobj[$lastlevel]); + $lprevobj->custom["lastitem"] = true; + } + + $prevobj[$level] = &$item[$dirname]; + $lprevobj = &$item[$dirname]; + + $lastlevel = $level; + + if (is_object($item[$parent])) + { + $item[$parent]->addItem($item[$dirname]); + } + + $count++; + } + } +} + + +function uplGetThumbnail ($file, $maxsize) +{ + global $client, $cfgClient, $cfg; + + if ($maxsize == -1) + { + return uplGetFileIcon ($file); + } + + switch (getFileExtension($file)) + { + case "png": + case "gif": + case "tiff": + case "tif": + case "bmp": + case "jpeg": + case "jpg": + case "bmp": + case "iff": + case "xbm": + case "wbmp": + $img = capiImgScale($cfgClient[$client]["upl"]["path"].$file, $maxsize, $maxsize, false, false, 50); + + if ($img !== false) + { + return $img; + } else { + $value = capiImgScale($cfg["path"]["contenido"]."images/unknown.jpg", $maxsize, $maxsize, false, false, 50); + if ($value !== false) + { + return $value; + } else { + return uplGetFileIcon($file); + } + } + break; + default: + return uplGetFileIcon ($file); + break; + + } +} + +/** + * Returns the icon for a file type + * + * @param $file Filename to retrieve the extension for + * + * @return Icon for the file type + * + */ +function uplGetFileIcon ($file) +{ + global $cfg; + + switch (getFileExtension($file)) { + case "sxi": + case "sti": + case "pps": + case "pot": + case "kpr": + case "pptx": + case "potx": + case "pptm": + case "potm": + case "ppt": $icon = "ppt.gif"; + break; + case "doc": + case "dot": + case "sxw": + case "stw": + case "sdw": + case "docx": + case "dotx": + case "docm": + case "dotm": + case "kwd": $icon = "word.gif"; + break; + case "xls": + case "sxc": + case "stc": + case "xlw": + case "xlt": + case "csv": + case "ksp": + case "xlsx": + case "xltx": + case "xlsm": + case "xlsb": + case "xltm": + case "sdc": $icon = "excel.gif"; + break; + case "txt": + case "rtf": $icon = "txt.gif"; + break; + case "gif": $icon = "gif.gif"; + break; + case "png": $icon = "png.gif"; + break; + case "jpeg": + case "jpg": $icon = "jpg.gif"; + break; + case "html": + case "htm": $icon = "html.gif"; + break; + case "lha": + case "rar": + case "arj": + case "bz2": + case "bz": + case "gz": + case "tar": + case "tbz2": + case "tbz": + case "tgz": + case "zip": $icon = "zip.gif"; + break; + case "pdf": $icon = "pdf.gif"; + break; + case "mov": + case "avi": + case "mpg": + case "mpeg": + case "wmv": $icon = "movie.gif"; + break; + case "swf": $icon = "swf.gif"; + break; + case "js": $icon = "js.gif"; + break; + case "vcf": $icon = "vcf.gif"; + break; + case "odf": $icon = "odf.gif"; + break; + case "php": $icon = "php.gif"; + break; + case "mp3": + case "wma": + case "ogg": + case "mp4": $icon = "sound.gif"; + break; + case "psd": + case "ai": + case "eps": + case "cdr": + case "qxp": + case "ps": $icon = "design.gif"; + break; + case "css": $icon = "css.gif"; + + default: + if (file_exists($cfg['path']['contenido_fullhtml'] . $cfg["path"]["images"]. "filetypes/".getFileExtension($file).".gif")) { + $icon = getFileExtension($file).".gif"; + } else { + $icon = "unknown.gif"; + } + break; + } + + return $cfg['path']['contenido_fullhtml'] . $cfg["path"]["images"]. "filetypes/".$icon; +} + + +/** + * Returns the description for a file type + * + * @param $extension Extension to use + * + * @return Text for the file type + * + */ +function uplGetFileTypeDescription ($extension) +{ + global $cfg; + + switch ($extension) + { + /* Presentation files */ + case "sxi": return (i18n("OpenOffice.org Presentation")); + case "sti": return (i18n("OpenOffice.org Presentation Template")); + case "pps": return (i18n("Microsoft PowerPoint Screen Presentation")); + case "pot": return (i18n("Microsoft PowerPoint Presentation Template")); + case "kpr": return (i18n("KDE KPresenter Document")); + case "ppt": return (i18n("Microsoft PowerPoint Presentation Template")); + + /* Document files */ + case "doc": return (i18n("Microsoft Word Document or regular text file")); + case "dot": return (i18n("Microsoft Word Template")); + case "sxw": return (i18n("OpenOffice.org Text Document")); + case "stw": return (i18n("OpenOffice.org Text Document Template")); + case "sdw": return (i18n("StarOffice 5.0 Text Document")); + case "kwd": return (i18n("KDE KWord Document")); + + /* Spreadsheet files */ + case "xls": return (i18n("Microsoft Excel Worksheet")); + case "sxc": return (i18n("OpenOffice.org Table")); + case "stc": return (i18n("OpenOffice.org Table Template")); + case "xlw": return (i18n("Microsoft Excel File")); + case "xlt": return (i18n("Microsoft Excel Template")); + case "csv": return (i18n("Comma Seperated Value File")); + case "ksp": return (i18n("KDE KSpread Document")); + case "sdc": return (i18n("StarOffice 5.0 Table")); + + /* Text types */ + case "txt": return (i18n("Plain Text")); + case "rtf": return (i18n("Rich Text Format")); + + /* Images */ + case "gif": return (i18n("GIF Image")); + case "png": return (i18n("PNG Image")); + case "jpeg": return (i18n("JPEG Image")); + case "jpg": return (i18n("JPEG Image")); + case "tif": return (i18n("TIFF Image")); + case "psd": return (i18n("Adobe Photoshop Image")); + + /* HTML */ + case "html": return (i18n("Hypertext Markup Language Document")); + case "htm": return (i18n("Hypertext Markup Language Document")); + case "css": return (i18n("Cascading Style Sheets")); + + /* Archives */ + case "lha": return (i18n("LHA Archive")); + case "rar": return (i18n("RAR Archive")); + case "arj": return (i18n("ARJ Archive")); + case "bz2": return (i18n("bz2-compressed File")); + case "bz": return (i18n("bzip-compressed File")); + case "zip": return (i18n("ZIP Archive")); + case "tar": return (i18n("TAR Archive")); + case "gz": return (i18n("GZ Compressed File")); + + /* Source files */ + case "c": return (i18n("C Program Code")); + case "c++": + case "cc": + case "cpp": return (i18n("C++ Program Code")); + case "hpp": + case "h": return (i18n("C or C++ Program Header")); + case "php": + case "php3": + case "php4": return (i18n("PHP Program Code")); + case "phps": return (i18n("PHP Source File")); + + case "pdf": return (i18n("Adobe Acrobat Portable Document")); + + /* Movies */ + case "mov": return (i18n("QuickTime Movie")); + case "avi": return (i18n("avi Movie")); + case "mpg": + case "mpeg": return (i18n("MPEG Movie")); + case "wmv": return (i18n("Windows Media Video")); + + default: return (i18n($extension."-File")); + } +} + +function uplCreateFriendlyName ($filename, $spacer="_") +{ + global $cfg; + + $newfilename = ""; + + if (!is_array($cfg['upl']['allow_additional_chars'])) { + $filename = str_replace(" ", $spacer, $filename); + } elseif (in_array(' ', $cfg['upl']['allow_additional_chars']) === FALSE) { + $filename = str_replace(" ", $spacer, $filename); + } + + for ($i=0;$iselect("idclient='".Contenido_Security::toInteger($client)."' AND itemtype = 'upload' AND type='file' AND name='keywords' AND value LIKE '%".Contenido_Security::escapeDB($mysearch, $db)."%'","itemid"); + + while ($item = $properties->next()) + { + $items[$item->get("itemid")] += (substr_count(strtolower($item->get("value")), strtolower($searchfor)) * 5); + } + + /* Search for medianame , ranking +4 */ + $properties->select("idclient='".Contenido_Security::toInteger($client)."' AND itemtype = 'upload' AND type='file' AND name='medianame' AND value LIKE '%".Contenido_Security::escapeDB($mysearch, $db)."%'","itemid"); + + while ($item = $properties->next()) + { + $items[$item->get("itemid")] += (substr_count(strtolower($item->get("value")), strtolower($searchfor)) * 4); + } + + /* Search for media notes, ranking +3 */ + $properties->select("idclient='".Contenido_Security::toInteger($client)."' AND itemtype = 'upload' AND type='file' AND name='medianotes' AND value LIKE '%".Contenido_Security::escapeDB($mysearch, $db)."%'","itemid"); + + while ($item = $properties->next()) + { + $items[$item->get("itemid")] += (substr_count(strtolower($item->get("value")), strtolower($searchfor)) * 3); + } + + /* Search for description, ranking +2 */ + $uploads->select("idclient='".Contenido_Security::toInteger($client)."' AND description LIKE '%".Contenido_Security::escapeDB($mysearch, $db)."%'", "idupl"); + + while ($item = $uploads->next()) + { + $items[$item->get("dirname").$item->get("filename")] += (substr_count(strtolower($item->get("description")), strtolower($searchfor)) * 2); + } + + /* Search for file name, ranking +1 */ + $uploads->select("idclient='".Contenido_Security::toInteger($client)."' AND filename LIKE '%".Contenido_Security::escapeDB($mysearch, $db)."%'", "idupl"); + + while ($item = $uploads->next()) + { + $items[$item->get("dirname").$item->get("filename")] += 1; + } + + return ($items); +} + +function uplGetFileExtension ($sFile) +{ + /* Fetch the dot position */ + $iDotPosition = strrpos($sFile, "."); + + $sExtension = substr($sFile, $iDotPosition + 1); + if (strpos($sExtension, "/") !== false) + { + return false; + } else { + return $sExtension; + } +} +?> diff --git a/conlite/includes/globals_off.inc.php b/conlite/includes/globals_off.inc.php new file mode 100644 index 0000000..e1c8907 --- /dev/null +++ b/conlite/includes/globals_off.inc.php @@ -0,0 +1,120 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unkown + * modified 2008-06-25, Frederic Schneider, add stripslashes_deep and contenido_stripslashes constant + * modified 2008-06-26 Removed $_SERVER and $_ENV because this global vars are read only + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) and removed code for PHP older than 4.1.0 + * modified 2011-02-04, Murat Purc, fixed potential attac by manipulated request variables (see http://forum.contenido.org/viewtopic.php?f=11&t=30812) + * $Id: globals_off.inc.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +// set constant value depending on get_magic_quotes_gpc status +define('CONTENIDO_STRIPSLASHES', (get_magic_quotes_gpc() == 0)); + + +// PHP5 with register_long_arrays off? +if (!isset($HTTP_POST_VARS) && isset($_POST)) { + $HTTP_POST_VARS = & $_POST; + $HTTP_GET_VARS = & $_GET; + $HTTP_COOKIE_VARS = & $_COOKIE; + $HTTP_POST_FILES = & $_FILES; + + // _SESSION is the only superglobal which is conditionally set + if (isset($_SESSION)) { + $HTTP_SESSION_VARS = & $_SESSION; + } +} + +// simulate get_magic_quotes_gpc on if turned off +if (CONTENIDO_STRIPSLASHES) { + + /** + * Adds slashes to passed variable + * + * @param mixed $value Either a string or a multi-dimensional array of values + * @return array + */ + function addslashes_deep($value) + { + $value = is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value); + + return $value; + } + + /** + * Removes slashes from passed variable. + * + * @param mixed $value Either a string or a multi-dimensional array of values + * @return array + */ + function stripslashes_deep($value) + { + $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); + + return $value; + } + + $_POST = array_map('addslashes_deep', $_POST); + $_GET = array_map('addslashes_deep', $_GET); + $_COOKIE = array_map('addslashes_deep', $_COOKIE); + + $cfg['simulate_magic_quotes'] = true; +} else { + $cfg['simulate_magic_quotes'] = false; +} + +if (!isset($_REQUEST) || $cfg['simulate_magic_quotes']) { + /* Register post,get and cookie variables into $_REQUEST */ + $_REQUEST = array_merge($_GET, $_POST, $_COOKIE); +} + +// this should be the default setting, but only for PHP older than 5.3.0 +if (!CONTENIDO_STRIPSLASHES && (version_compare(PHP_VERSION, '5.3.0', '<'))) { + @set_magic_quotes_runtime(0); +} + +// register globals +$types_to_register = array ('GET', 'POST', 'COOKIE', 'SESSION', 'SERVER'); +foreach ($types_to_register as $global_type) { + $arr = @ ${'_' . $global_type}; + if (is_array($arr) && count($arr) > 0) { + // second loop to prevent overwriting of globals by other globals' values + foreach ($types_to_register as $global_type) { + $key = '_' . $global_type; + if (isset($arr[$key])) { + unset($arr[$key]); + } + } + // echo "
\$_$global_type:"; print_r ($arr); echo "
"; + extract($arr, EXTR_OVERWRITE); + } +} +// save memory +unset ($types_to_register, $global_type, $arr); + +$FORM = $_REQUEST; + +?> \ No newline at end of file diff --git a/conlite/includes/grouprights.inc.php b/conlite/includes/grouprights.inc.php new file mode 100644 index 0000000..6e7a1b5 --- /dev/null +++ b/conlite/includes/grouprights.inc.php @@ -0,0 +1,337 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-07-28, Bilal Arslan, moved inline html to template + * + * $Id: grouprights.inc.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if(!is_object($db2)) +$db2 = new DB_ConLite; + +if(!is_object($oTpl)) +$oTpl = new Template(); +$oTpl->reset(); + +//set new right_list (=all possible rights) +if(!is_array($right_list)){ + //register these list fore following sites + # same shit like every rights area ;) + # commented out by H. Librenz, 2007-08-31 + //$sess->register("right_list"); + + $plugxml=new XML_Doc(); + + //select all rights , actions an theeir locations without area login + $sql="SELECT A.idarea, A.parent_id, B.location,A.name FROM ".$cfg["tab"]["area"]." as A LEFT JOIN ".$cfg["tab"]["nav_sub"]." as B ON A.idarea = B.idarea WHERE A.name!='login' AND A.relevant='1' AND A.online='1' GROUP BY A.name ORDER BY A.idarea"; + $db->query($sql); + + while($db->next_record()) + { + if($db->f("parent_id")=="0"){ + $right_list[$db->f("name")][$db->f("name")]["perm"]=$db->f("name"); + $right_list[$db->f("name")][$db->f("name")]["location"]=$db->f('location'); + }else{ + $right_list[$db->f("parent_id")][$db->f("name")]["perm"]=$db->f("name"); + $right_list[$db->f("parent_id")][$db->f("name")]["location"] = $db->f('location'); + } + + $sql="SELECT * FROM ".$cfg["tab"]["actions"]." WHERE idarea='".Contenido_Security::toInteger($db->f("idarea"))."' AND relevant='1'"; + $db2->query($sql); + while($db2->next_record()) + { + if($db->f("parent_id")=="0"){ + $right_list[$db->f("name")][$db->f("name")]["action"][]=$db2->f("name"); + }else{ + $right_list[$db->f("parent_id")][$db->f("name")]["action"][]=$db2->f("name"); + } + } + } +} + +##Header Area Begin +// Set the session id +$oTpl->set("s", "SESS_ID", $sess->id); + +##End of Header Area + +if(!isset($actionarea)){ + $actionarea="area"; +} +##Body Area Begin +$oTpl->set("s", "ACTION_URL", $sess->url("main.php")); +$oTpl->set("s", "TYPE_ID", "groupid"); +$oTpl->set("s", "USER_ID", $groupid); +$oTpl->set("s", "AREA", $area); + +$mgroup = new Group; +$mgroup->loadGroupByGroupID($groupid); + +$userperms = $mgroup->getField("perms"); + +$oTpl->set("s", "TABLE_BORDER",$cfg["color"]["table_border"]); +$oTpl->set("s", "TABLE_BGCOLOR", $cfg["color"]["table_dark"]); +$oTpl->set("s", "RIGHTS_PERMS", $rights_perms); + +//selectbox for clients +$oHtmlSelect = new cHTMLSelectElement ('rights_clientslang', "", "rights_clientslang"); + + $clientclass = new Client; + $clientList = $clientclass->getAccessibleClients(); + $firstsel = false; + $i = 0; + + foreach ($clientList as $key=>$value) { + $sql="SELECT * FROM ".$cfg["tab"]["lang"]." as A, ".$cfg["tab"]["clients_lang"]." as B WHERE B.idclient='".Contenido_Security::toInteger($key)."' AND A.idlang=B.idlang"; + $db->query($sql); + + while($db->next_record()) + { + if((strpos($userperms, "client[$key]") !== false) && + (strpos($userperms, "lang[".$db->f("idlang")."]") !== false) + && ($perm->have_perm("lang[".$db->f("idlang")."]"))){ + + if ($firstsel == false) + { + $firstsel = true; + $firstclientslang = $db->f("idclientslang"); + } + + if ($rights_clientslang == $db->f("idclientslang")) { + # printf("",$db->f("idclientslang"),$value["name"] . " -> ".$db->f("name")); + $oHtmlSelectOption = new cHTMLOptionElement($value["name"] . " -> ".$db->f("name"), $db->f("idclientslang"), true); + $oHtmlSelect->addOptionElement($i, $oHtmlSelectOption); + $i++; + + + if(!isset($rights_client)) + { + $firstclientslang = $db->f("idclientslang"); + } + } else { + #printf("",$db->f("idclientslang"),$value["name"] . " -> ".$db->f("name")); + $oHtmlSelectOption = new cHTMLOptionElement($value["name"] . " -> ".$db->f("name"), $db->f("idclientslang"), false); + $oHtmlSelect->addOptionElement($i, $oHtmlSelectOption); + $i++; + } + } + } + } +// Render Select Box +$oTpl->set('s', 'INPUT_SELECT_CLIENT', $oHtmlSelect->render()); + + if ($area != 'groups_content') { + $oTpl->set('s', 'INPUT_SELECT_RIGHTS', ''); + $oTpl->set('s', 'DISPLAY_RIGHTS', 'none'); + } else { + + #filter for displaying rights + $oHtmlSelect = new cHTMLSelectElement ('filter_rights', '', "filter_rights"); + $oHtmlSelectOption = new cHTMLOptionElement('--- '.i18n("All").' ---', '', false); + $oHtmlSelect->addOptionElement(0, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Article rights"), 'article', false); + $oHtmlSelect->addOptionElement(1, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Category rights"), 'category', false); + $oHtmlSelect->addOptionElement(2, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Template rights"), 'template', false); + $oHtmlSelect->addOptionElement(3, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Plugin/Other rights"), 'other', false); + $oHtmlSelect->addOptionElement(4, $oHtmlSelectOption); + $oHtmlSelect->setEvent('change', "document.rightsform.submit();"); + $oHtmlSelect->setDefault($_POST['filter_rights']); + + #set global array which defines rights to display + $aArticleRights = array('con_syncarticle', 'con_lock', 'con_deleteart', 'con_makeonline', 'con_makestart', 'con_duplicate', 'con_editart', 'con_newart', 'con_edit'); + $aCategoryRights = array('con_synccat', 'con_makecatonline', 'con_makepublic'); + $aTempalteRights = array('con_changetemplate', 'con_tplcfg_edit'); + + $aViewRights = array(); + $bExclusive = false; + if (isset($_POST['filter_rights'])) { + switch($_POST['filter_rights']) { + case 'article': + $aViewRights = $aArticleRights; + break; + case 'category': + $aViewRights = $aCategoryRights; + break; + case 'template': + $aViewRights = $aTempalteRights; + break; + case 'other': + $aViewRights = array_merge($aArticleRights, $aCategoryRights, $aTempalteRights); + $bExclusive = true; + break; + default: + break; + } + } + $oTpl->set('s', 'INPUT_SELECT_RIGHTS', $oHtmlSelect->render()); + $oTpl->set('s', 'DISPLAY_RIGHTS', 'block'); + + } + + +if(!isset($rights_clientslang)) +{ + $rights_clientslang = $firstclientslang; +} + +$sql = "SELECT idclient, idlang FROM ".$cfg["tab"]["clients_lang"]." WHERE idclientslang = '$rights_clientslang'"; +$db->query($sql); + +if ($db->next_record()) +{ + $rights_client = $db->f("idclient"); + $rights_lang = $db->f("idlang"); +} else { + $notification->displayNotification("error", i18n("Current group doesn't have any rights to any client/language.")); + die; +} + + // current set it on null + $oTpl->set('s', 'NOTIFICATION', ''); + + $oTpl->set('s', 'OB_CONTENT', ''); + +function saverightsarea() +{ + global $db, $cfg,$groupid,$rights_client,$rights_lang,$rights_admin,$rights_sysadmin,$rights_perms,$rights_list; + + if(!isset($rights_perms)){ + //search for the permissions of this user + $sql="SELECT perms FROM ".$cfg["tab"]["groups"]." WHERE group_id='".Contenido_Security::escapeDB($groupid, $db)."'"; + $db->query($sql); + $db->next_record(); + $rights_perms=$db->f("perms"); + } + + + //if there are no permissions, delete permissions for lan and client + if(!is_array($rights_list)){ + $rights_perms=preg_replace("/,+client\[$rights_client\]/","",$rights_perms); + $rights_perms=preg_replace("/,+lang\[$rights_lang\]/","",$rights_perms); + }else{ + if(!strstr($rights_perms,"client[$rights_client]")) + $rights_perms.=",client[$rights_client]"; + if(!strstr($rights_perms,"lang[$rights_lang]")) + $rights_perms.=",lang[$rights_lang]"; + } + + //if admin is checked + if($rights_admin==1){ + //if admin is mot set + if(!strstr($rights_perms,"admin[$rights_client]")) + $rights_perms.=",admin[$rights_client]"; + }else{ + //cut admin from the string + $rights_perms=preg_replace("/,*admin\[$rights_client\]/","",$rights_perms); + } + + //if sysadmin is checked + if($rights_sysadmin==1){ + //if sysadmin is not set + if(!strstr($rights_perms,"sysadmin")) + $rights_perms.=",sysadmin"; + }else{ + //cat sysadmin from string + $rights_perms=preg_replace("/,*sysadmin/","",$rights_perms); + } + + + //cut ',' in front of the string + $rights_perms=preg_replace("/^,/","",$rights_perms); + + //update table + $sql="UPDATE ".$cfg["tab"]["groups"]." SET perms='".Contenido_Security::escapeDB($rights_perms, $db)."' WHERE group_id='".Contenido_Security::escapeDB($groupid, $db)."'"; + + $db->query($sql); + + //save the other rights + saverights(); +} + +function saverights() { + + global $rights_list, $rights_list_old, $db; + global $cfg, $groupid, $rights_client, $rights_lang; + global $perm, $sess, $notification; + + //if no checkbox is checked + if (!is_array($rights_list)) { + $rights_list = array (); + } + + //search all checks which are not in the new Rights_list for deleting + $arraydel = array_diff(array_keys($rights_list_old), array_keys($rights_list)); + //search all checks which are not in the Rights_list_old for saving + $arraysave = array_diff(array_keys($rights_list), array_keys($rights_list_old)); + + if (is_array($arraydel)) { + foreach ($arraydel as $value) { + $data = explode("|", $value); + $data[0] = $perm->getIDForArea($data[0]); + $data[1] = $perm->getIDForAction($data[1]); + + $sql = "DELETE FROM ".$cfg["tab"]["rights"]." WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND idarea='".Contenido_Security::toInteger($data[0])."' AND idcat='".Contenido_Security::toInteger($data[2])."' AND idaction='".Contenido_Security::toInteger($data[1])."' AND type=1"; + $db->query($sql); + } + } + + unset($data); + + //search for all mentioned checkboxes + if (is_array($arraysave)) { + foreach ($arraysave as $value) { + //explodes the key it consits areait+actionid+itemid + $data = explode("|", $value); + + // Since areas are stored in a numeric form in the rights table, we have + // to convert them from strings into numbers + + $data[0] = $perm->getIDForArea($data[0]); + $data[1] = $perm->getIDForAction($data[1]); + + if (!isset ($data[1])) { + $data[1] = 0; + } + // Insert new right + $sql = "INSERT INTO ".$cfg["tab"]["rights"]." + (idright, user_id,idarea,idaction,idcat,idclient,idlang, type) + VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["rights"]))."', '".Contenido_Security::escapeDB($groupid, $db)."', '".Contenido_Security::toInteger($data[0])."','".Contenido_Security::toInteger($data[1])."', '".Contenido_Security::toInteger($data[2])."', '".Contenido_Security::toInteger($rights_client)."', '".Contenido_Security::toInteger($rights_lang)."', 1)"; + $db->query($sql); + } + + } + $rights_list_old = $rights_list; + + $notification->displayNotification("info", i18n("Changes saved")); +} +?> \ No newline at end of file diff --git a/conlite/includes/grouprights_area.inc.php b/conlite/includes/grouprights_area.inc.php new file mode 100644 index 0000000..9a9d312 --- /dev/null +++ b/conlite/includes/grouprights_area.inc.php @@ -0,0 +1,202 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-07-28, Bilal Arslan, moved inline html to template + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: grouprights_area.inc.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/grouprights.inc.php'); +$debug = 0; +// declare new Template variables +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + +// declare new javascript variables; +$sJsBefore .= "var areatree=new Array();\n"; + +//set the areas which are in use fore selecting these + +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND idcat='0' AND A.idaction = C.idaction AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "group_edit")) +{ + saverights(); +} else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +if(!isset($rights_perms)||$action==""||!isset($action)) +{ + //search for the permissions of this user + $sql="SELECT perms FROM ".$cfg["tab"]["groups"]." WHERE group_id='".Contenido_Security::escapeDB($groupid, $db)."'"; + + $db->query($sql); + $db->next_record(); + $rights_perms=$db->f("perms"); +} + +$oTable = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $oTable->start_table(); + +$sTable .= $oTable->header_row(); +$sTable .= $oTable->header_cell(" ","left"); +$sTable .= $oTable->header_cell(" ","left"); +$sTable .= $oTable->header_cell(i18n("Check all"),"left"); +$sTable .= $oTable->end_row(); + +//checkbox for all rights +$sTable .= $oTable->header_row(); +$sTable .= $oTable->header_cell(' ',"center", '', '', 0); +$sTable .= $oTable->header_cell(' ',"center", '', '', 0); +$sTable .= $oTable->header_cell("", "center", '', '', 0); +$sTable .= $oTable->end_row(); + +//Select the itemid�s +if ($xml->load($cfg['path']['xml'] . $cfg['lang'][$belang]) == false) +{ + if ($xml->load($cfg['path']['xml'] . 'lang_en_US.xml') == false) + { + die("Unable to load any XML language file"); + } +} + +$nav = new Contenido_Navigation; + +foreach($right_list as $key => $value){ + + + + // look for possible actions in mainarea + foreach($value as $key2 =>$value2) + { + if($key==$key2){ + //does the user have the right + if(in_array($value2["perm"]."|fake_permission_action|0",array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + /* Extract names from the XML document. */ + $main = $nav->getName(str_replace('/overview', '/main', $value2['location'])); + + if ($debug) + { + $locationString = $value2["location"] . " " . $value2["perm"]. "-->".$main; + } else { + $locationString = $main; + } + + $sTable .= $oTable->row(); + $sTable .= $oTable->cell($locationString,"", "", " class=\"td_rights1\"", false); + $sTable .= $oTable->cell("" ,"", "", " class=\"td_rights2\"", false); + $sTable .= $oTable->cell("","", "", " class=\"td_rights2\"", false); + $sTable .= $oTable->end_row(); + + //set javscript array for areatree + $sJsBefore .= " + areatree[\"$key\"]=new Array(); + areatree[\"$key\"][\"".$value2["perm"]."0\"]=\"rights_list[".$value2["perm"]."|fake_permission_action|0]\";\n"; + + } + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + $idaction = $value3; + //does the user have the right + if(in_array($value2["perm"]."|$idaction|0",array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + $darkRow = !$darkRow; + if ($darkRow) { + $bgColor = $cfg["color"]["table_dark"]; + } else { + $bgColor = $cfg["color"]["table_light"]; + } + + //set the checkbox the name consits of areait+actionid+itemid + $sCellContent = ''; + if ($debug) + { + $sCellContent = "     " . $value2["perm"] . " | ". $value3 . "-->".$lngAct[$value2["perm"]][$value3]."    "; + } else { + if ($lngAct[$value2["perm"]][$value3] == "") + { + $sCellContent = "     " . $value2["perm"] . "|" .$value3 ."    "; + + } else { + $sCellContent = "     " . $lngAct[$value2["perm"]][$value3]."    "; + } + } + $sTable .= $oTable->row(); + $sTable .= $oTable->cell($sCellContent,"left", "", " class=\"td_rights1\"", false); + $sTable .= $oTable->cell("", false); + $sTable .= $oTable->cell(" ", false); + $sTable .= $oTable->end_row(); + + //set javscript array for areatree + $sJsBefore .= "areatree[\"$key\"][\"".$value2["perm"]."$value3\"]=\"rights_list[".$value2["perm"]."|$value3|0]\";"; + + } + } + +} + +//checkbox for checking all actions fore this itemid +$sTable .= $oTable->row(); +$sTable .= $oTable->sumcell("","right"); +$sTable .= $oTable->end_row(); +$sTable .= $oTable->end_table(); + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + +?> diff --git a/conlite/includes/grouprights_con.inc.php b/conlite/includes/grouprights_con.inc.php new file mode 100644 index 0000000..27d0b20 --- /dev/null +++ b/conlite/includes/grouprights_con.inc.php @@ -0,0 +1,249 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-07-28, Bilal Arslan, moved inline html to template + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: grouprights_con.inc.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/grouprights.inc.php'); + +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("con")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND A.type = 1 AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "group_edit")) +{ + saverights(); +} else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + + +$sJsExternal .= ''; +$sJsExternal .= ''; + +// declare new javascript variables; +$sJsBefore .= " var itemids=new Array(); + var actareaids=new Array();"; +$colspan=0; + +$oTable = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + + $sTable .= $oTable->start_table(); + $sTable .= $oTable->header_row(); + $sTable .= $oTable->header_cell(i18n("Category"),"left"); + $sTable .= $oTable->header_cell(" ","left"); + + + $possible_areas=array(); + $aSecondHeaderRow=array(); + // look for possible actions in mainarea [] in str and con + foreach($right_list["con"] as $value2) + { + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + if ((in_array($value3, $aViewRights) && !$bExclusive) || + (!in_array($value3, $aViewRights) && $bExclusive) || + (count($aViewRights) == 0)) { + //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + + $colspan++; + //set the possible areas and actions for this areas + + //checkbox for the whole action + $sTable .= $oTable->header_cell($lngAct[$value2["perm"]][$value3]); + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";\n"; + array_push($aSecondHeaderRow, ""); + + } + } + } + + //checkbox for all rights + $sTable .= $oTable->header_cell(i18n('Check all')); + array_push($aSecondHeaderRow, ""); + $colspan++; + + $sTable .= $oTable->header_row(); + $sTable .= $oTable->header_cell(' ',"center", '', '', 0); + $sTable .= $oTable->header_cell(' ',"center", '', '', 0); + + foreach ($aSecondHeaderRow as $value) { + $sTable .= $oTable->header_cell($value, "center", '', '', 0); + } + $sTable .= $oTable->end_row(); + + + $colspan++; + + $sql = "SELECT A.idcat, level, name,parentid FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND C.idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY idtree"; + + $db->query($sql); + $counter=array(); + $parentid="leer"; + $sScript = ''; + + $aRowname = array(); + $iLevel = 0; + + while ($db->next_record()) { + $iCurrentIdCat = $db->f('idcat'); + + if ($db->f("level") == 0 && $db->f("preid") != 0) { + $sTable .= $oTable->row(); + $sTable .= $oTable->sumcell(" ","right"); + $sTable .= $oTable->end_row(); + + + }else { + if ($db->f("level") < $iLevel) { + $iDistance = $iLevel-$db->f("level"); + + for ($i = 0; $i < $iDistance; $i++) { + array_pop($aRowname); + } + $iLevel = $db->f("level"); + } + + if ($db->f("level") >= $iLevel) { + if ($db->f("level") == $iLevel) { + array_pop($aRowname); + } else { + $iLevel = $db->f("level"); + } + array_push($aRowname, $db->f("idcat")); + } + + //find out parentid for inheritance + //if parentid is the same increase the counter + if($parentid==$db->f("parentid")){ + + $counter[$parentid]++; + }else{ + $parentid=$db->f("parentid"); + // if these parentid is in use increase the counter + if(isset($counter[$parentid])){ + $counter[$parentid]++; + }else{ + $counter[$parentid]=0; + } + + + } + + $spaces=''; + + + $darkRow = !$darkRow; + if ($darkRow) { + $bgColor = $cfg["color"]["table_dark"]; + } else { + $bgColor = $cfg["color"]["table_light"]; + } + + + $sTable .= $oTable->row("id=\"".implode('_', $aRowname)."\""); + $sTable .= $oTable->cell($spaces.$db->f("name"),"", "", " class=\"td_rights0\"", false); + $sTable .= $oTable->cell("f("idcat")."')\" class=\"action\">","", "", " class=\"td_rights1\"", false); + + $sJsAfter.="itemids[\"".$db->f("idcat")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + foreach($right_list["con"] as $value2){ + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + if ((in_array($value3, $aViewRights) && !$bExclusive) || + (!in_array($value3, $aViewRights) && $bExclusive) || + (count($aViewRights) == 0)) { + //does the user have the right + if(isset($rights_list_old[$value2["perm"]."|$value3|".$iCurrentIdCat])) + $checked="checked=\"checked\""; + else + $checked=""; + + //set the checkbox the name consits of areaid+actionid+itemid the id = parebntid+couter for these parentid+areaid+actionid + $sTable .= $oTable->cell("f("idcat")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + } + } + } + //checkbox for checking all actions fore this itemid + + $sTable .= $oTable->cell("f("idcat")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idcat")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $oTable->end_row(); + + } + +} + + +$colspan = $colspan+2; +$sTable .= $oTable->end_row(); +$sTable .= $oTable->row(); +$sTable .= $oTable->sumcell(" "); +$sTable .= $oTable->end_row(); +$sTable .= $oTable->end_table(); + +$sJsAfter .= "aTranslations = new Object(); + aTranslations['pfeil_links.gif'] = '".i18n("Apply rights for this category to all categories on the same level or above")."'; + aTranslations['pfeil_runter.gif'] = '".i18n("Apply rights for this category to all categories below the current category")."'; + setImageTags(aTranslations); + + init('".i18n("Open category")."', '".i18n("Close category")."'); \n"; + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + +?> diff --git a/conlite/includes/grouprights_lay.inc.php b/conlite/includes/grouprights_lay.inc.php new file mode 100644 index 0000000..f8c490e --- /dev/null +++ b/conlite/includes/grouprights_lay.inc.php @@ -0,0 +1,191 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-07-29, Bilal Arslan, moved inline html to template + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: grouprights_lay.inc.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/grouprights.inc.php'); + +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("lay")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND A.type = 1 AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +// declare temp variables +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + +$sJsBefore .= "var itemids=new Array(); + var actareaids=new Array(); \n"; + +if (($perm->have_perm_area_action($area, $action)) && ($action == "group_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + + +$colspan=0; + +$oTable = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $oTable->start_table(); +$sTable .= $oTable->header_row(); +$sTable .= $oTable->header_cell(i18n("Layout name")); +$sTable .= $oTable->header_cell(i18n("Description")); + +$possible_areas=array(); +$sCheckboxesRow = ''; +$aSecondHeaderRow = array(); + +// look for possible actions in mainarea [] +foreach($right_list["lay"] as $value2) +{ + //if there are some actions + if(is_array($value2["action"])) + //set the areas that are in use + foreach($value2["action"] as $key3 => $value3) + { + $possible_areas[$value2["perm"]]=""; + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";\n"; + + //checkbox for the whole action + $sTable .= $oTable->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + + } +} + + //checkbox for all rights +$sTable .= $oTable->header_cell(i18n("Check all")); +array_push($aSecondHeaderRow, ""); +$sTable .= $oTable->end_row(); + +$colspan++; + +$sTable .= $oTable->header_row(); +$sTable .= $oTable->header_cell(' ', 'center', '', '', 0); +$sTable .= $oTable->header_cell(' ', 'center', '', '', 0); + +// Put the checkbox in the table +foreach($aSecondHeaderRow as $value){ + $sTable .= $oTable->header_cell($value, "center", "", "", 0); +} +$sTable .= $oTable->end_row(); + +//Select the itemid�s +$sql = "SELECT * FROM ".$cfg["tab"]["lay"]." WHERE idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY name"; +$db->query($sql); + + +while ($db->next_record()) { + + $sTplName = clHtmlEntities($db->f("name")); + $sDescription = clHtmlEntities($db->f("description")); + + + $sTable .= $oTable->row(); + $sTable .= $oTable->cell($sTplName, "", "", " class=\"td_rights0\"", false); + $sTable .= $oTable->cell($sDescription, "", "", " class=\"td_rights1\" style=\"white-space:normal; \"", false); + + + //set javscript array for itemids + $sJsBefore .= "itemids[\"".$db->f("idlay")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + foreach($right_list["lay"] as $value2) + { + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idlay"),array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + + //set the checkbox the name consits of areait+actionid+itemid + //"f("idlay")."]\" value=\"x\" $checked> + $sTable .= $oTable->cell("f("idlay")."]\" value=\"x\" $checked>", "", "", " class=\"td_rights3\"", false ); + + } + + + } +//checkbox for checking all actions fore this itemid + $sTable .= $oTable->cell("f("idlay")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idlay")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $oTable->end_row(); + +} + +$sTable .= $oTable->end_row(); +$sTable .= $oTable->row(); +$sTable .= $oTable->sumcell(" ","right"); +$sTable .= $oTable->end_row(); +$sTable .= $oTable->end_table(); + + +// generate Template +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + +?> diff --git a/conlite/includes/grouprights_members.inc.php b/conlite/includes/grouprights_members.inc.php new file mode 100644 index 0000000..60f9f9f --- /dev/null +++ b/conlite/includes/grouprights_members.inc.php @@ -0,0 +1,232 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-06-03 + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * + * $Id: grouprights_members.inc.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$db2 = new DB_ConLite; +$tpl3 = new Template; + +if(!$perm->have_perm_area_action($area,$action)) +{ + $notification->displayNotification("error", i18n("Permission denied")); +} else { + if ( !isset($groupid) ) + { + + } else { + if (($action == "group_deletemember") &&( $perm->have_perm_area_action($area, $action))) + { + $aDeleteMembers = array(); + if (!is_array($_POST['user_in_group'])) { + if ($_POST['user_in_group'] > 0) { + array_push($aDeleteMembers, $_POST['user_in_group']); + } + } else { + $aDeleteMembers = $_POST['user_in_group']; + } + + foreach ($aDeleteMembers as $idgroupuser) { + $idgroupuser = Contenido_Security::toInteger($idgroupuser); + + $sql = "DELETE FROM " + .$cfg["tab"]["groupmembers"]." + WHERE idgroupuser = '". $idgroupuser ."'"; + $db->query($sql); + } + } + + if (($action == "group_addmember") && ($perm->have_perm_area_action($area, $action))) + { + if (is_array($newmember)) + { + foreach ($newmember as $key => $value) + { + $myUser = new User(); + + if (!$myUser->loadUserByUserID($value)) + { + $myUser->loadUserByUserName($value); + } + + if ($myUser->getField("user_id") == "") + { + + } else { + + $sql = "SELECT * FROM + ".$cfg["tab"]["groupmembers"]." WHERE + group_id = '".Contenido_Security::escapeDB($groupid, $db)."' AND + user_id = '".Contenido_Security::escapeDB($myUser->getField("user_id"), $db)."'"; + $db->query($sql); + if (!$db->next_record()) + { + $nextid = $db->nextid($cfg["tab"]["groupmembers"]); + $sql = "INSERT INTO + ".$cfg["tab"]["groupmembers"]." + SET idgroupuser = '".Contenido_Security::toInteger($nextid)."', + group_id = '".Contenido_Security::escapeDB($groupid, $db)."', + user_id = '".Contenido_Security::escapeDB($myUser->getField("user_id"), $db)."'"; + + $db->query($sql); + + if ($notiAdded == "") + { + $notiAdded .= $myUser->getField("realname"); + } else { + $notiAdded .= ", ".$myUser->getField("realname"); + } + } else { + if ($notiAlreadyExisting == "") + { + $notiAlreadyExisting .= $myUser->getField("realname"); + } else { + $notiAlreadyExisting .= ", ".$myUser->getField("realname"); + } + + } + } + } + } + } + $tab1 = $cfg["tab"]["groupmembers"]; + $tab2 = $cfg["tab"]["phplib_auth_user_md5"]; + + $sortby = getEffectiveSetting ("backend","sort_backend_users_by",""); + + if ($sortby!='') { + $sql = "select ".$tab1.".idgroupuser, ".$tab1.".user_id FROM ".$tab1." + INNER JOIN ".$tab2." ON ".$tab1.".user_id = ".$tab2.".user_id WHERE + group_id = '".Contenido_Security::escapeDB($groupid, $db)."' order by ".$tab2.".".$sortby; + } else { + #Show previous behaviour by default + $sql = "select ".$tab1.".idgroupuser, ".$tab1.".user_id FROM ".$tab1." + INNER JOIN ".$tab2." ON ".$tab1.".user_id = ".$tab2.".user_id WHERE + group_id = '".Contenido_Security::escapeDB($groupid, $db)."' order by ".$tab2.".realname, ".$tab2.".username"; + } + + $db->query($sql); + + $sInGroupOptions = ''; + $aAddedUsers = array(); + $myUser = new User(); + + while ($db->next_record()) + { + $bgColor = !$bgColor; + + if ($bgColor) { + $color = $cfg["color"]["table_light"]; + } else { + $color = $cfg["color"]["table_dark"]; + } + + $myUser->loadUserByUserID($db->f("user_id")); + $aAddedUsers[] = $myUser->getField("username"); + + $sOptionLabel = $myUser->getField("realname").' ('.$myUser->getField("username").')'; + $sOptionValue = $db->f("idgroupuser"); + if ($sOptionValue != '' && $sOptionLabel != '') { + $sInGroupOptions .= ''."\n"; + } + } + + $tpl3->set('s', 'IN_GROUP_OPTIONS', $sInGroupOptions); + + $bgColor = !$bgColor; + + if ($bgColor) { + $color = $cfg["color"]["table_light"]; + } else { + $color = $cfg["color"]["table_dark"]; + } + + $userlist = new Users; + $users = $userlist->getAccessibleUsers(explode(',',$auth->auth["perm"])); + + $sortby = getEffectiveSetting ("backend","sort_backend_users_by",""); + if ($sortby!='') { + //Sort user list by given criteria + unset($users2); + $sql = "SELECT * FROM ".$cfg["tab"]["phplib_auth_user_md5"]." ORDER BY ".$sortby; + $db->query($sql); + while ($db->next_record()) { + $users2[$db->f("user_id")] = $users[$db->f("user_id")]; + } + $users = $users2; + } + + $bAddedUser = false; + $sNonGroupOptions = ''; + if ( is_array($users) ) { + + foreach ($users as $key => $value) { + if (!in_array($value["username"], $aAddedUsers)) + { + $bAddedUser = true; + + $sOptionLabel = $value["realname"] . " (".$value["username"].")"; + $sOptionValue = $key; + if ($sOptionValue != '' && $sOptionLabel != '') { + $sNonGroupOptions .= ''."\n"; + } + } + } + + } + $tpl3->set('s', 'NON_GROUP_OPTIONS', $sNonGroupOptions); + + $tpl3->set('s', 'CATNAME', i18n("Manage group members")); + $tpl3->set('s', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl3->set('s', 'BGCOLOR_CONTENT', $cfg["color"]["table_dark"]); + $tpl3->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl3->set('s', 'CATFIELD', " "); + $tpl3->set('s', 'FORM_ACTION', $sess->url('main.php')); + $tpl3->set('s', 'AREA', $area); + $tpl3->set('s', 'GROUPID', $groupid); + $tpl3->set('s', 'FRAME', $frame); + $tpl3->set('s', 'IDLANG', $lang); + $tpl3->set('s', 'RECORD_ID_NAME', 'groupid'); + $tpl3->set('s', 'ADD_ACTION', 'group_addmember'); + $tpl3->set('s', 'DELETE_ACTION', 'group_deletemember'); + $tpl3->set('s', 'STANDARD_ACTION', 'group_addmember'); + $tpl3->set('s', 'IN_GROUP_VALUE', $_POST['filter_in']); + $tpl3->set('s', 'NON_GROUP_VALUE', $_POST['filter_non']); + $tpl3->set('s', 'DISPLAY_OK', 'none'); + $tpl3->set('s', 'RELOADSCRIPT', ''); + + # Generate template + $tpl3gen = $tpl3->generate($cfg['path']['templates'] . $cfg['templates']['grouprights_memberselect'],true); + echo $tpl3gen; + } +} +?> diff --git a/conlite/includes/grouprights_mod.inc.php b/conlite/includes/grouprights_mod.inc.php new file mode 100644 index 0000000..ad84eec --- /dev/null +++ b/conlite/includes/grouprights_mod.inc.php @@ -0,0 +1,169 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-07-29, Bilal Arslan, moved inline html to template + * + * $Id: grouprights_mod.inc.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/grouprights.inc.php'); + +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("mod")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND A.type = 1 AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "group_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +// Init the temp variables +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + +// declare new javascript variables; +$sJsBefore .= "var itemids=new Array(); + var actareaids=new Array();"; +$colspan=0; + +$table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $table->start_table(); +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(i18n("Module name")); +$sTable .= $table->header_cell(i18n("Description")); +$aSecondHeaderRow = array(); +$possible_areas=array(); +// look for possible actions in mainarea [] +foreach($right_list["mod"] as $value2) +{ + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";\n"; + + //checkbox for the whole action + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + + } +} + + +//checkbox for all rights +$sTable .= $table->header_cell(i18n('Check all')); +array_push($aSecondHeaderRow, ""); +$sTable .= $table->end_row(); +$colspan++; + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell(' ',"center", '', '', 0); + +foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); +} +$sTable .= $table->end_row(); + +//Select the itemid�s +$sql = "SELECT * FROM ".$cfg["tab"]["mod"]." WHERE idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY name"; +$db->query($sql); + +while ($db->next_record()) { + + $tplname = clHtmlEntities($db->f("name")); + $description = clHtmlEntities($db->f("description")); + + $sTable .= $table->row(); + $sTable .= $table->cell($tplname,"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell($description,"", "", " class=\"td_rights1\" style=\"white-space:normal;\"", false); + + //set javscript array for itemids + $sJsAfter .= "itemids[\"".$db->f("idmod")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + foreach($right_list["mod"] as $value2) + { + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idmod"),array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + //set the checkbox the name consits of areait+actionid+itemid + $sTable .= $table->cell("f("idmod")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + + + } + } + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idmod")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idmod")."')\">","", "", " class=\"td_rights3\"", false); + + +} + +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +// Set the temp variables +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + + +?> diff --git a/conlite/includes/grouprights_str.inc.php b/conlite/includes/grouprights_str.inc.php new file mode 100644 index 0000000..7ce3f95 --- /dev/null +++ b/conlite/includes/grouprights_str.inc.php @@ -0,0 +1,227 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-07-29, Bilal Arslan, moved inline html to template + * + * $Id: grouprights_str.inc.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/grouprights.inc.php'); + +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("str")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND A.type = 1 AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "group_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +// Init the temp variables +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + + $sJsExternal = ''; + $sJsExternal .= ''; + + // declare new javascript variables; + $sJsBefore = " var itemids=new Array(); + var actareaids=new Array();"; + $colspan=0; + + $table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + + $sTable .= $table->start_table(); + $sTable .= $table->header_row(); + $sTable .= $table->header_cell(i18n("Category"),"left"); + $sTable .= $table->header_cell(" ","left"); + + $possible_areas=array(); + $aSecondHeaderRow = array(); + // look for possible actions in mainarea [] in str and con + foreach($right_list["str"] as $value2) { + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + + # HACK! + if ($value3 != "str_newtree") + { + $possible_areas[$value2["perm"]]=""; + + + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";"; + + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + } + } + } + + //checkbox for all rights + $sTable .= $table->header_cell(i18n("Check all")); + array_push($aSecondHeaderRow, ""); + $sTable .= $table->end_row(); + $colspan++; + + $sTable .= $table->header_row(); + $sTable .= $table->header_cell(' ',"center", '', '', 0); + $sTable .= $table->header_cell(' ',"center", '', '', 0); + + foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); + } + $sTable .= $table->end_row(); + + $sql = "SELECT A.idcat, level, name,parentid FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND C.idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY idtree"; + $db->query($sql); + $counter=array(); + $parentid="leer"; + + $aRowname = array(); + $iLevel = 0; + + while ($db->next_record()) { + + if ($db->f("level") == 0 && $db->f("preid") != 0) { + echo " "; + }else { + if ($db->f("level") < $iLevel) { + $iDistance = $iLevel-$db->f("level"); + + for ($i = 0; $i < $iDistance; $i++) { + array_pop($aRowname); + } + $iLevel = $db->f("level"); + } + + if ($db->f("level") >= $iLevel) { + if ($db->f("level") == $iLevel) { + array_pop($aRowname); + } else { + $iLevel = $db->f("level"); + } + array_push($aRowname, $db->f("idcat")); + } + + //find out parentid for inheritance + //if parentid is the same increase the counter + if($parentid==$db->f("parentid")){ + + $counter[$parentid]++; + }else{ + $parentid=$db->f("parentid"); + // if these parentid is in use increase the counter + if(isset($counter[$parentid])){ + $counter[$parentid]++; + }else{ + $counter[$parentid]=0; + } + + + } + //set javscript array for itemids + $sJsAfter .= "itemids[\"".$db->f("idcat")."\"]=\"x\";"; + + $spaces = ""; + + for ($i=0; $i<$db->f("level"); $i++) { + $spaces = $spaces . "    "; + } + + $sTable .= $table->row("id=\"".implode('_', $aRowname)."\""); + $sTable .= $table->cell(' '.$db->f("name"),"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell(" f("idcat")."')\" class=\"action\">","",""," class=\"td_rights0\"", false); + + // look for possible actions in mainarea[] + + foreach($right_list["str"] as $value2){ + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) { + # HACK! + if ($value3 != "str_newtree") { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idcat"),array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + //set the checkbox the name consits of areaid+actionid+itemid the id = parebntid+couter for these parentid+areaid+actionid + $sTable .= $table->cell("f("idcat")."]\" value=\"x\" $checked>", "", "", " class=\"td_rights2\"", false); + } + } + } + + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idcat")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idcat")."')\">", "", "", " class=\"td_rights2\"", false); + } +} + + +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); +$sJsAfter .=" + aTranslations = new Object(); + aTranslations['pfeil_links.gif'] = '".i18n("Apply rights for this category to all categories on the same level or above")."'; + aTranslations['pfeil_runter.gif'] = '".i18n("Apply rights for this category to all categories below the current category")."'; + setImageTags(aTranslations); + init('".i18n("Open category")."', '".i18n("Close category")."');"; + +$oTpl->set("s", "NOTIFICATION","" ); +$oTpl->set("s", "OB_CONTENT", ""); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set("s", "JS_SCRIPT_BEFORE", $sJsBefore); +$oTpl->set("s", "JS_SCRIPT_AFTER", $sJsAfter); +$oTpl->set("s", "EXTERNAL_SCRIPTS", $sJsExternal); + +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + + +?> diff --git a/conlite/includes/grouprights_tpl.inc.php b/conlite/includes/grouprights_tpl.inc.php new file mode 100644 index 0000000..36eeac1 --- /dev/null +++ b/conlite/includes/grouprights_tpl.inc.php @@ -0,0 +1,170 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * + * $Id: grouprights_tpl.inc.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/grouprights.inc.php'); + +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("tpl")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($groupid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND A.type = 1 AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "group_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} +// Temp variables +$sJsBefore = ''; +$sJsAfter = ''; +$sTable = ''; + +// declare new javascript variables; +$sJsBefore .= " var itemids = new Array(); + var actareaids = new Array(); +"; + +$colspan=0; + +$table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $table->start_table(); +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(i18n("Template name")); +$sTable .= $table->header_cell(i18n("Description")); + + +$aSecondHeaderRow = array(); +$possible_areas=array(); +// look for possible actions in mainarea [] + +foreach($right_list["tpl"] as $value2) +{ + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\"; \n"; + + + //checkbox for the whole action + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + } +} + + +//checkbox for all rights +$sTable .= $table->header_cell(i18n('Check all')); +array_push($aSecondHeaderRow, ""); +$sTable .= $table->end_row(); +$colspan++; + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell(' ',"center", '', '', 0); + +foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); +} +$sTable .= $table->end_row(); + + + +//Select the itemid�s +$sql = "SELECT * FROM ".$cfg["tab"]["tpl"]." WHERE idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY name"; +$db->query($sql); + + +while ($db->next_record()) { + + $tplname = clHtmlEntities($db->f("name")); + $description = clHtmlEntities($db->f("description")); + + $sTable .= $table->row(); + $sTable .= $table->cell($tplname,"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell($description,"", "", " class=\"td_rights1\" style=\"white-space:normal;\"", false); + + //set javscript array for itemids + $sJsAfter .= "itemids[\"".$db->f("idtpl")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + foreach($right_list["tpl"] as $value2) + { + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idtpl"),array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + //set the checkbox the name consits of areait+actionid+itemid + $sTable .= $table->cell("f("idtpl")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + + + } + } + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idtpl")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idtpl")."')\">","", "", " class=\"td_rights3\"", false); +} +$sTable .=$table->end_row(); +$sTable .=$table->row(); +$sTable .=$table->sumcell(" ","right"); +$sTable .=$table->end_row(); +$sTable .=$table->end_table(); + + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + +?> diff --git a/conlite/includes/include.CMS_EASYIMG.php b/conlite/includes/include.CMS_EASYIMG.php new file mode 100644 index 0000000..8186fec --- /dev/null +++ b/conlite/includes/include.CMS_EASYIMG.php @@ -0,0 +1,163 @@ + + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-10 + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.CMS_EASYIMG.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ($doedit == "1") { + cInclude("includes","functions.upl.php"); + $rootpath = $cfgClient[$client]["path"]["htmlpath"] . $cfgClient[$client]["upload"]; + + if ($action == "cancel") + { + header("location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client")); + } else { + if (count($_FILES) == 1) + { + foreach ($_FILES['uplfile']['name'] as $key => $value) + { + if (file_exists($_FILES['uplfile']['tmp_name'][$key])) + { + $friendlyName = uplCreateFriendlyName($_FILES['uplfile']['name'][$key]); + move_uploaded_file($_FILES['uplfile']['tmp_name'][$key], $cfgClient[$client]['upl']['path'].$upldir.$friendlyName); + + uplSyncDirectory($upldir); + + if ($path == "") { $path = "/"; } + + $sql = "SELECT idupl FROM ".$cfg["tab"]["upl"]." WHERE dirname='$upldir' AND filename='$friendlyName'"; + $db->query($sql); + $db->next_record(); + + $CMS_LINK = $rootpath . $upldir. $friendlyName; + + conSaveContentEntry($idartlang, "CMS_IMG", $typenr, $db->f("idupl")); + // Note: Not conMakeArticleIndex as img not relevant for the index + conGenerateCodeForArtInAllCategories($idart); + } + + } + } + + header("location:".$sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit")); + } +} + +?> + + +contenido +contenido.css"> + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +setVar("lang",$lang); + $form->setVar("typenr",$typenr); + $form->setVar("idart",$idart); + $form->setVar("idcat",$idcat); + $form->setVar("idartlang",$idartlang); + $form->setVar("contenido",$sess->id); + $form->setVar("action",10); + $form->setVar("doedit",1); + $form->setVar("type",$type); + $form->setVar("changeview","edit"); + $form->setVar("CMS_LINK", $a_content["CMS_LINK"][$typenr]); + + $header = sprintf(i18n("Edit image for container %s"),$typenr); + $form->addHeader($header); + + + $upload = new cHTMLUpload("uplfile[]"); + + + $form->add(i18n("Upload image"), $upload); + + $form->unsetActionButton("submit"); + + $form->setActionButton("cancel", $cfg["path"]["contenido_fullhtml"]."images/but_cancel.gif", i18n("Discard changes"), "c", "cancel"); + $form->setActionButton("submit", $cfg['path']['contenido_fullhtml']."images/but_ok.gif", i18n("Save changes"), "s"); + echo $form->render(); +?> +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_HEAD.php b/conlite/includes/include.CMS_HEAD.php new file mode 100644 index 0000000..7647321 --- /dev/null +++ b/conlite/includes/include.CMS_HEAD.php @@ -0,0 +1,99 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-01-05, Timo Trautmann, add clHtmlSpecialChars() instead of htmlentitydecode() because of UTF-8 Bug + * + * $Id: include.CMS_HEAD.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ( $doedit == "1" ) { + conSaveContentEntry ($idartlang, "CMS_HEAD", $typenr, $CMS_HEAD); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); + header("location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&action=con_editart&idart=$idart&idartlang=$idartlang&idcat=$idcat&changeview=edit&client=$client").""); + +} +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + +contenido.css"> + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +"; + $sess->hidden_session(); + echo " "; +// echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo ""; + + echo " "; + + if ($type == "CMS_HEAD") { + echo " "; + } + + $tmp_area = "con_editcontent"; + + echo " "; + + echo "
 ".$typenr.". ".$a_description[$type][$typenr].": "; + echo " "; + echo "

+ + +
+ "; + +?> +
+ + diff --git a/conlite/includes/include.CMS_HTML.php b/conlite/includes/include.CMS_HTML.php new file mode 100644 index 0000000..8955b27 --- /dev/null +++ b/conlite/includes/include.CMS_HTML.php @@ -0,0 +1,109 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-16, H. Librenz, Hotfix: check for illegal calls added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.CMS_HTML.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( $doedit == "1" || $doedit == "2" ) +{ + conSaveContentEntry($idartlang, "CMS_HTML", $typenr, $CMS_HTML); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); +} +if ( $doedit == "1" ) +{ + header( "location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client").""); +} +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + +contenido.css"> + + + + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+\n"; + echo " ".$sess->hidden_session(); + echo " \n"; + // echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + $tmp_area = "con_editcontent"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 ".$typenr.". ".$a_description[$type][$typenr].": 
"; + + include ($cfg["path"]["wysiwyg"] . 'editor.php'); + + echo "\n

\n"; + echo " url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&lang=$lang")."\">\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " \n"; +?> +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_HTMLHEAD.php b/conlite/includes/include.CMS_HTMLHEAD.php new file mode 100644 index 0000000..a3e4067 --- /dev/null +++ b/conlite/includes/include.CMS_HTMLHEAD.php @@ -0,0 +1,111 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-03-02 + * modified 2008-06-16, Holger Librenz, Hotfix: check for illegal calls added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.CMS_HTMLHEAD.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( $doedit == "1" || $doedit == "2" ) +{ + conSaveContentEntry ($idartlang, "CMS_HTMLHEAD", $typenr, $CMS_HTML); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); +} + +if ( $doedit == "1" ) +{ + header("location:" . $sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client")); +} +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + + contenido.css" /> + + + + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+\n"; + echo " ".$sess->hidden_session(); + echo " \n"; +// echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + $tmp_area = "con_editcontent"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 ".$typenr.". ".$a_description[$type][$typenr].": 
\n"; + + include ($cfg["path"]["wysiwyg"] . 'editor.php'); + + echo "\n

\n"; + echo " url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&lang=$lang")."\">\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " \n"; +?> +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_HTMLTEXT.php b/conlite/includes/include.CMS_HTMLTEXT.php new file mode 100644 index 0000000..b137565 --- /dev/null +++ b/conlite/includes/include.CMS_HTMLTEXT.php @@ -0,0 +1,97 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.CMS_HTMLTEXT.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ($doedit == "1") { + conSaveContentEntry ($idartlang, "CMS_HTMLTEXT", $typenr, $CMS_HTMLTEXT); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); + header("Location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&lang=$lang&changeview=edit&client=$client").""); +} +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + + contenido.css"> + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +"; + $sess->hidden_session(); + echo " "; +// echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo ""; + echo " "; + echo " "; + echo ""; + echo " "; + + echo " "; + $tmp_area = "con_editcontent"; + echo " "; + + echo "
 ".$typenr.". ".$a_description[$type][$typenr].": "; + echo " "; + echo "

+ + +
+ "; + +?> + + + + + + +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_IMG.php b/conlite/includes/include.CMS_IMG.php new file mode 100644 index 0000000..314fc48 --- /dev/null +++ b/conlite/includes/include.CMS_IMG.php @@ -0,0 +1,289 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-10 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-07-07, Dominik Ziegler, fixed language bug + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.CMS_IMG.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ($doedit == "1") { + conSaveContentEntry ($idartlang, "CMS_IMG", $typenr, $CMS_IMG); + conSaveContentEntry ($idartlang, "CMS_IMGDESCR", $typenr, $CMS_IMGDESCR); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); + header("location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client")); +} + +?> + + +contenido +contenido.css"> + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +query($sql); + $db->next_record(); + $img_dir = $db->f("dirname"); + } + + $sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE idclient='".$client."' AND filetype IN ('jpeg', 'jpg', 'gif', 'png') ORDER BY dirname, filename ASC"; + $db->query($sql); + + $ds_name = Array(); + $ds_lvl = array(); + + while ( $db->next_record() ) + { + + $descr = $db->f("description"); + + if ( strlen($descr) > 24 ) + { + $descr = substr($descr, 0, 24); + $descr .= ".."; + } + + // collect data for dir selection + $dirname = $db->f("dirname"); + $tmp = explode('/', $dirname); + + $mypath = array(); + $mylvl = 0; + + foreach ($tmp as $value) + { + if ($value != "") + { + /* Make sure an entry exists for each path component */ + $mypath[]= $value; + + $thispath = implode("/", $mypath)."/"; + + if (!in_array($thispath, $ds_name)) + { + $mylvl++; + $ds_lvl[$thispath] = $mylvl; + $ds_name[$thispath] = $value; + $ds_fullpath[$thispath] = $thispath; + + } + } + } + if (!in_array($tmp[count($tmp)-2],$ds_name)) + { + $ds_lvl[$dirname] = count($tmp)-1; + $ds_name[$dirname] = $tmp[count($tmp)-2]; + $ds_fullpath[$dirname] = $db->f("dirname"); + } + + if (strcmp($img_dir,$db->f("dirname"))==0) + { + $img_list[] = $db->f("filename"); + $img_id[] = $db->f("idupl"); + $img_descr[] = $descr; + } + + } + + $form = new UI_Table_Form("editcontent", $cfg["path"]["contenido_fullhtml"].$cfg["path"]["includes"]."include.backendedit.php"); + $form->setVar("lang",$lang); + $form->setVar("typenr",$typenr); + $form->setVar("idart",$idart); + $form->setVar("idcat",$idcat); + $form->setVar("idartlang",$idartlang); + $form->setVar("contenido",$sess->id); + $form->setVar("action",10); + $form->setVar("doedit",1); + $form->setVar("type",$type); + $form->setVar("changeview","edit"); + $form->setVar("CMS_LINK", $a_content["CMS_LINK"][$typenr]); + + $header = sprintf(i18n("Edit image for container %s"),$typenr); + $form->addHeader($header); + + $dirselect = new cHTMLSelectElement("img_dir"); + $dirselect->setEvent("change", "doedit.value=0; submit();"); + $dirselect->setSize($dirheight); + $dirselect->setStyle("width: {$dirwidth}px;"); + + foreach ($ds_lvl as $key => $value) + { + $text = str_repeat("-",$value*2)."> ".$ds_name[$key]; + + $option = new cHTMLOptionElement($text, $ds_fullpath[$key]); + + switch ($value) + { + case 0: + case 1: $style="background-color:#C0C0C0;"; break; + case 2: $style="background-color:#D0D0D0;"; break; + case 3: $style="background-color:#E0E0E0;"; break; + default: $style="background-color:#F0F0F0;"; break; + } + + if (strcmp($img_dir,$ds_fullpath[$key])==0) + { + $option->setSelected("selected"); + } + + $dirselect->addOptionElement($key, $option); + + } + + $script = '"; + + $fileselect = new cHTMLSelectElement("CMS_IMG"); + $fileselect->setEvent("change", "disp_preview(this.value);"); + $fileselect->setSize($fileheight); + $fileselect->setStyle("width: {$filewidth}px;"); + + $option = new cHTMLOptionElement("-- ".i18n("None")." --", "0"); + + if ($a_content["CMS_IMG"][$typenr] == 0) + { + $option->setSelected("selected"); + } + + $fileselect->addOptionElement(-1,$option); + + if (is_array($img_list)) + { + foreach ($img_list as $key => $value) + { + $description = $img_descr[$key]; + + if ($description != "") + { + $text = $value . " (". $description .")"; + } else { + $text = $value; + } + + switch ($key % 2) + { + case 0: $style="background-color:#D0D0D0;"; break; + case 1: $style="background-color:#E0E0E0;"; break; + } + + $option = new cHTMLOptionElement($text, $img_id[$key]); + + if ($a_content["CMS_IMG"][$typenr]==$img_id[$key]) + { + $option->setSelected("selected"); + } + + $option->setStyle($style); + $fileselect->addOptionElement($key, $option); + } + } + + $form->add(i18n("Directory / File"), $dirselect->render().$script.$fileselect->render()); + + $textarea = new cHTMLTextarea("CMS_IMGDESCR", $a_content["CMS_IMGDESCR"][$typenr], $descrwidth, $descrheight); + $form->add(i18n("Description"), $textarea->render()); + + $preview = ''; + + $form->add(i18n("Preview"), $preview); + + $form->render(false); +?> +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_LINK.php b/conlite/includes/include.CMS_LINK.php new file mode 100644 index 0000000..7a3b07e --- /dev/null +++ b/conlite/includes/include.CMS_LINK.php @@ -0,0 +1,393 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.CMS_LINK.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ($doedit == "1") { + global $cfgClient; + global $client; + global $_FILES; + global $upldir; + global $uplfile; + global $HTTP_POST_FILES; + + cInclude("includes","functions.upl.php"); + + $rootpath = $cfgClient[$client]["path"]["htmlpath"] . $cfgClient[$client]["upload"]; + + $CMS_LINK = $CMS_LINKextern; + + if ($CMS_LINKintern) + { + $CMS_LINK = $CMS_LINKintern; + } + + if($selectpdf){ + $CMS_LINK = $rootpath . $selectpdf; + } + if($selectimg){ + $CMS_LINK = $rootpath . $selectimg; + } + if($selectzip){ + $CMS_LINK = $rootpath . $selectzip; + } + if($selectaudio){ + $CMS_LINK = $rootpath . $selectaudio; + } + if($selectany){ + $CMS_LINK = $rootpath . $selectany; + } + + if (count($_FILES) == 1) + { + foreach ($_FILES['uplfile']['name'] as $key => $value) + { + if (file_exists($_FILES['uplfile']['tmp_name'][$key])) + { + $friendlyName = uplCreateFriendlyName($_FILES['uplfile']['name'][$key]); + move_uploaded_file($_FILES['uplfile']['tmp_name'][$key], $cfgClient[$client]['upl']['path'].$upldir.$friendlyName); + + uplSyncDirectory($upldir); + + if ($path == "") { $path = "/"; } + + $sql = "SELECT idupl FROM ".$cfg["tab"]["upl"]." WHERE dirname='".Contenido_Security::escapeDB($upldir, $db)."' AND filename='".Contenido_Security::escapeDB($friendlyName, $db)."'"; + $db->query($sql); + $db->next_record(); + + $CMS_LINK = $rootpath . $upldir. $friendlyName; + } + + } + } + + + conSaveContentEntry ($idartlang, "CMS_LINK", $typenr, $CMS_LINK); + conSaveContentEntry ($idartlang, "CMS_LINKDESCR", $typenr, $CMS_LINKDESCR); + conSaveContentEntry ($idartlang, "CMS_LINKTARGET", $typenr, $CMS_LINKTARGET); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForartInAllCategories($idart); + Header("Location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client")); +} + +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + + + +file selector +contenido.css"> + + + + + + + + + + "; + + + echo "
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ setVar("lang",$lang); + $form->setVar("typenr",$typenr); + $form->setVar("idart",$idart); + $form->setVar("idcat",$idcat); + $form->setVar("idartlang",$idartlang); + $form->setVar("contenido",$sess->id); + $form->setVar("action",10); + $form->setVar("doedit",1); + $form->setVar("type",$type); + $form->setVar("changeview","edit"); + $form->setVar("CMS_LINK", $a_content["CMS_LINK"][$typenr]); + + $header = sprintf(i18n("Edit link for container %s"),$typenr); + $form->addHeader($header); + + if (is_numeric($a_content["CMS_LINK"][$typenr])) { + $a_link_intern_value = $a_content["CMS_LINK"][$typenr]; + $a_link_extern_value = ""; + } else { + $a_link_intern_value = "0"; + $a_link_extern_value = $a_content["CMS_LINK"][$typenr]; + } + + $form->add(i18n("External link"),formGenerateField ("text", "CMS_LINKextern", $a_link_extern_value, 60, 255)); + + $sql = "SELECT + * + FROM + ".$cfg["tab"]["cat_tree"]." AS a, + ".$cfg["tab"]["cat_art"]." AS b, + ".$cfg["tab"]["cat"]." AS c, + ".$cfg["tab"]["cat_lang"]." AS d, + ".$cfg["tab"]["art_lang"]." AS e + WHERE + a.idcat = b.idcat AND + b.idcat = d.idcat AND + d.idlang = '".Contenido_Security::toInteger($lang)."' AND + b.idart = e.idart AND + c.idcat = a.idcat AND + c.idclient = '".Contenido_Security::toInteger($client)."' AND + e.idlang = '".Contenido_Security::toInteger($lang)."' + ORDER BY + a.idtree"; + + + $db->query($sql); + + $intlink .= ""; + + $form->add(i18n("Internal link"),$intlink); + + + + $pdflink.= ""; + + $form->add(i18n("Link to a document"),$pdflink); + + + $imglink .= ""; + + $form->add(i18n("Link to an image"),$imglink); + + $ziplink .= ""; + + $form->add(i18n("Link to an archive"),$ziplink); + + $audiolink .= ""; + + $form->add(i18n("Link to a media file"),$audiolink); + + + $anylink .= ""; + + $form->add(i18n("Link to any file"),$anylink); + + + cInclude("includes","functions.upl.php"); + + // Laden der Verzeichnisse und Dateien in separate Arrays + $olddir = getcwd(); + chdir($cfgClient[$client]['upl']['path'].rawurldecode($path)); + + $dirlist = uplDirectoryListRecursive($cfgClient[$client]['upl']['path'].rawurldecode($path)); + + + chdir($olddir); + + $upldirs = '"; + + $form->add(i18n("Upload file"),$upldirs.''); + $form->add(i18n("Description"),""); + + $linktarget = " "; + + $form->add(i18n("Target frame"),$linktarget); + + $newwindow = " "; + $newwindow .= " + + + "; + + $form->add(i18n("Open in new window"),$newwindow); + + $tmp_area = "con_editcontent"; + $form->addCancel($sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat")); + echo $form->render(); + + echo "
+ "; + + + + +?> + + + \ No newline at end of file diff --git a/conlite/includes/include.CMS_QRCODE.php b/conlite/includes/include.CMS_QRCODE.php new file mode 100644 index 0000000..0d7fc88 --- /dev/null +++ b/conlite/includes/include.CMS_QRCODE.php @@ -0,0 +1,89 @@ + + * @license http://www.ConLite.org/license/LIZENZ.txt + * @link http://www.ConLite.org + * @since file available since ConLite release 2.0 + * + * {@internal + * created 2012-12-06 + * modified 2012-12-20, Rene Mansveld + * + * $Id: include.CMS_QRCODE.php 207 2013-01-23 09:23:45Z Mansveld $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ($doedit == "1") { + conSaveContentEntry ($idartlang, "CMS_QRCODE", $typenr, $CMS_QRCODE); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); + header("Location:".$sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&lang=$lang&changeview=edit&client=$client").""); +} +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + + contenido.css"> + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +"; + $sess->hidden_session(); + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo ""; + echo " "; + echo " "; + echo ""; + echo " "; + echo " "; + $tmp_area = "con_editcontent"; + echo " "; + + echo "
 ".$typenr.". ".$a_description[$type][$typenr].": "; + echo " "; + echo "

+ + +
+ "; + +?> + +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_SIMPLELINK.php b/conlite/includes/include.CMS_SIMPLELINK.php new file mode 100644 index 0000000..0650012 --- /dev/null +++ b/conlite/includes/include.CMS_SIMPLELINK.php @@ -0,0 +1,173 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.CMS_SIMPLELINK.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ($doedit == "1") { + global $cfgClient; + global $client; + global $_FILES; + global $upldir; + global $uplfile; + global $HTTP_POST_FILES; + + cInclude("includes","functions.upl.php"); + + $rootpath = $cfgClient[$client]["path"]["htmlpath"] . $cfgClient[$client]["upload"]; + + $CMS_LINK = $CMS_LINKextern; + + if ($CMS_LINKintern) + { + $CMS_LINK = $CMS_LINKintern; + } + + if($selectpdf){ + $CMS_LINK = $rootpath . $selectpdf; + } + if($selectimg){ + $CMS_LINK = $rootpath . $selectimg; + } + if($selectzip){ + $CMS_LINK = $rootpath . $selectzip; + } + if($selectaudio){ + $CMS_LINK = $rootpath . $selectaudio; + } + if($selectany){ + $CMS_LINK = $rootpath . $selectany; + } + + if (count($_FILES) == 1) + { + foreach ($_FILES['uplfile']['name'] as $key => $value) + { + if (file_exists($_FILES['uplfile']['tmp_name'][$key])) + { + $friendlyName = uplCreateFriendlyName($_FILES['uplfile']['name'][$key]); + move_uploaded_file($_FILES['uplfile']['tmp_name'][$key], $cfgClient[$client]['upl']['path'].$upldir.$friendlyName); + + uplSyncDirectory($upldir); + + if ($path == "") { $path = "/"; } + + $sql = "SELECT idupl FROM ".$cfg["tab"]["upl"]." WHERE dirname='".Contenido_Security::escapeDB($upldir, $db)."' AND filename='".Contenido_Security::escapeDB($friendlyName, $db)."'"; + $db->query($sql); + $db->next_record(); + + $CMS_LINK = $rootpath . $upldir. $friendlyName; + } + + } + } + + + conSaveContentEntry ($idartlang, "CMS_LINK", $typenr, $CMS_LINK); + conSaveContentEntry ($idartlang, "CMS_LINKDESCR", $typenr, $CMS_LINKDESCR); + conSaveContentEntry ($idartlang, "CMS_LINKTARGET", $typenr, $CMS_LINKTARGET); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForartInAllCategories($idart); + Header("Location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client")); +} +?> + + + + +contenido +contenido.css"> + + + + + + + + + + "; + + + echo "
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ setVar("lang",$lang); + $form->setVar("typenr",$typenr); + $form->setVar("idart",$idart); + $form->setVar("idcat",$idcat); + $form->setVar("idartlang",$idartlang); + $form->setVar("contenido",$sess->id); + $form->setVar("action",10); + $form->setVar("doedit",1); + $form->setVar("type",$type); + $form->setVar("changeview","edit"); + $form->setVar("CMS_LINK", $a_content["CMS_LINK"][$typenr]); + + $header = sprintf(i18n("Edit link for container %s"),$typenr); + $form->addHeader($header); + + if (is_numeric($a_content["CMS_LINK"][$typenr])) { + $a_link_intern_value = $a_content["CMS_LINK"][$typenr]; + $a_link_extern_value = ""; + } else { + $a_link_intern_value = "0"; + $a_link_extern_value = $a_content["CMS_LINK"][$typenr]; + } + + $form->add(i18n("Link"),formGenerateField ("text", "CMS_LINKextern", $a_link_extern_value, 60, 255)); + + + $form->add(i18n("Description"),""); + + + + $tmp_area = "con_editcontent"; + $form->addCancel($sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat")); + echo $form->render(); + + echo "
+ "; + + + + +?> + + + \ No newline at end of file diff --git a/conlite/includes/include.CMS_SWF.php b/conlite/includes/include.CMS_SWF.php new file mode 100644 index 0000000..06139f6 --- /dev/null +++ b/conlite/includes/include.CMS_SWF.php @@ -0,0 +1,115 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.CMS_SWF.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ($doedit == "1") { + conSaveContentEntry ($idartlang, "CMS_SWF", $typenr, $CMS_SWF); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); + header("location:".$sess->url($cfg['path']['contenido_fullhtml']."external/backendedit/front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&changeview=edit&client=$client")); +} + +?> + + +contenido +contenido.css"> + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +"; + + $sess->hidden_session(); + + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo ""; + echo " "; + echo " "; + echo ""; + + echo " "; + + echo " "; + + $tmp_area = "con_editcontent"; + + echo " "; + + echo "
 ".$typenr.". ".$a_description["CMS_SWF"][$typenr].": "; + echo ""; + echo "

+ + +
+ "; + +?> +
+ + \ No newline at end of file diff --git a/conlite/includes/include.CMS_TEXT.php b/conlite/includes/include.CMS_TEXT.php new file mode 100644 index 0000000..f751982 --- /dev/null +++ b/conlite/includes/include.CMS_TEXT.php @@ -0,0 +1,90 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-07 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.CMS_TEXT.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if ($doedit == "1") { + conSaveContentEntry ($idartlang, "CMS_TEXT", $typenr, $CMS_TEXT); + conMakeArticleIndex ($idartlang, $idart); + conGenerateCodeForArtInAllCategories($idart); + header("Location:".$sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?area=$tmp_area&idart=$idart&idcat=$idcat&lang=$lang&changeview=edit&client=$client").""); +} +header("Content-Type: text/html; charset={$encoding[$lang]}"); +?> + + + + contenido.css"> + + + + + + + + + + +
spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">spacer.gif" width="10" height="10">
+ +"; + $sess->hidden_session(); + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo ""; + echo " "; + echo " "; + echo ""; + echo " "; + echo " "; + $tmp_area = "con_editcontent"; + echo " "; + + echo "
 ".$typenr.". ".$a_description[$type][$typenr].": "; + echo " "; + echo "

+ + +
+ "; + +?> + +
+ + \ No newline at end of file diff --git a/conlite/includes/include.backendedit.php b/conlite/includes/include.backendedit.php new file mode 100644 index 0000000..4d39eab --- /dev/null +++ b/conlite/includes/include.backendedit.php @@ -0,0 +1,136 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix and include security_class + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: include.backendedit.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('../includes/startup.php'); + +$fullstart = getmicrotime(); + +cInclude ("includes", 'functions.api.php'); +cInclude ("includes", 'functions.forms.php'); +cInclude ("includes", 'functions.con.php'); + + +page_open(array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); +cInclude ("includes", 'cfg_language_de.inc.php'); + + + +# Create Contenido classes +$db = new DB_ConLite; +$notification = new Contenido_Notification; +$classarea = new Area(); +$classlayout = new Layout(); +$classclient = new Client(); +$classuser = new User(); + +# change Client +if ( is_numeric($changeclient) ) { + $client = $changeclient; + unset($lang); +} + +# Sprache wechseln +if ( is_numeric($changelang) ) { + unset($area_rights); + unset($item_rights); + + $lang = $changelang; +} + +if (!is_numeric($client) || $client == "") { + $sess->register("client"); + $sql = "SELECT idclient FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC"; + $db->query($sql); + $db->next_record(); + $client = $db->f("idclient"); +} else { + $sess->register("client"); +} + +if (!is_numeric($lang) || $lang == "") { + $sess->register("lang"); + # search for the first language of this client + $sql = "SELECT * FROM ".$cfg["tab"]["lang"]." AS A, ".$cfg["tab"]["clients_lang"]." AS B WHERE A.idlang=B.idlang AND idclient='$client' ORDER BY A.idlang ASC"; + $db->query($sql); + $db->next_record(); + $lang = $db->f("idlang"); +} else { + $sess->register("lang"); +} + +$perm->load_permissions(); + +# Create Contenido classes +$xml = new XML_doc; +$tpl = new Template; +$backend = new Contenido_Backend; + +# Register session variables +$sess->register("sess_area"); + +if (isset($area)) { + $sess_area = $area; +} else { + $area = ( isset($sess_area) && $sess_area != "" ) ? $sess_area : 'login'; +} + +$sess->register("cfgClient"); +$sess->register("errsite_idcat"); +$sess->register("errsite_idart"); + +if ($cfgClient["set"] != "set") +{ + rereadClients(); +} + +$start = getmicrotime(); + +include ($cfg["path"]["contenido"].$cfg["path"]["includes"].'include.'.$type.'.php'); + +$end = getmicrotime(); + +if ($cfg["debug"]["rendering"] == true) +{ + echo "Rendering this page took: " . ($end - $start)." seconds
"; + echo "Building the complete page took: " . ($end - $fullstart)." seconds
"; +} +page_close(); + +?> diff --git a/conlite/includes/include.blank.php b/conlite/includes/include.blank.php new file mode 100644 index 0000000..bf1f162 --- /dev/null +++ b/conlite/includes/include.blank.php @@ -0,0 +1,37 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * + * $Id: include.blank.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'CONTENTS', ''); +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['blank']); +?> \ No newline at end of file diff --git a/conlite/includes/include.client_artspec.php b/conlite/includes/include.client_artspec.php new file mode 100644 index 0000000..bc8e622 --- /dev/null +++ b/conlite/includes/include.client_artspec.php @@ -0,0 +1,180 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * + * $Id: include.client_artspec.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ($action == "client_artspec_save") +{ + if(!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } else { + addArtspec($_POST['artspectext'], $online); + } +} + +if ($action == "client_artspec_delete") +{ + if(!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } else { + deleteArtspec($_GET['idartspec']); + } +} + +if ($action == "client_artspec_online") +{ + if(!$perm->have_perm_area_action($area, "client_artspec_save")) + { + $notification->displayNotification("error", i18n("Permission denied")); + } else { + setArtspecOnline($_GET['idartspec'], $online); + } +} + +if ($action == "client_artspec_default") +{ + if(!$perm->have_perm_area_action($area, "client_artspec_save")) + { + $notification->displayNotification("error", i18n("Permission denied")); + } else { + setArtspecDefault($_GET['idartspec'], $online); + } +} + +$page = new UI_Page; +$list = new UI_List; + +$list->setCell(1,1, i18n("Article specification")); +$list->setCell(1,2, i18n("Options")); + +$list->setBgColor(1,$cfg['color']['table_header']); +$list->setBorder(1); +$list->setWidth ("250px"); + +$count = 2; + +$link = new Link; +$link->setCLink($area, $frame, "client_artspec_edit"); +$link->setContent(''.i18n('Edit').''); + +$dlink = new Link; +$dlink->setCLink($area, $frame, "client_artspec_delete"); +$dlink->setContent(''.i18n('Delete').''); + +$olink = new Link; +$olink->setCLink($area, $frame, "client_artspec_online"); + +$defLink = new Link; +$defLink->setCLink($area, $frame, "client_artspec_default"); + +$artspec = getArtspec(); + +if (is_array($artspec)) +{ + foreach ($artspec as $id => $tmp_artspec) + { + $link->setCustom("idartspec", $id); + $link->updateAttributes(array ('style' => 'padding:3')); + + $dlink->setCustom("idartspec", $id); + $dlink->updateAttributes(array ('style' => 'padding:3')); + + $olink->setCustom("idartspec", $id); + $olink->updateAttributes(array ('style' => 'padding:3')); + + $defLink->setCustom("idartspec", $id); + $defLink->updateAttributes(array ('style' => 'padding:3')); + + if (($action == "client_artspec_edit") && ($idartspec == $id)) + { + $form = new UI_Form("artspec"); + $form->setVar("area",$area); + $form->setVar("frame", $frame); + $form->setVar("idartspec", $id); + $form->setVar("action", "client_artspec_save"); + $form->setVar("online", $artspec[$id]['online']); + $inputbox = new cHTMLTextbox ("artspectext", urldecode($artspec[$id]['artspec'])); + $inputbox->setStyle("border:1px;border-style:solid;border-color:black;"); + $form->add("name",$inputbox->render()); + $form->add("submit", ''); + + $list->setCell($count,1, $form->render(true)); + } else { + $list->setCell($count,1, urldecode($artspec[$id]['artspec'])); + } + + if ($artspec[$id]['online'] == 0) + { //it is offline (std!) + $olink->setContent(''.i18n('Make online').''); + $olink->setCustom("online", 1); + } else + { + $olink->setContent(''.i18n('Make offline').''); + $olink->setCustom("online", 0); + } + + if ($artspec[$id]['default'] == 0) + { + $defLink->setContent(''); + $list->setCell($count,2, $link->render().$dlink->render().$olink->render().$defLink->render()); + } else + { + $defLinkText = ''; + $list->setCell($count,2, $link->render().$dlink->render().$olink->render().$defLinkText); + } + + $count++; + } + +} else +{ + $list->setCell($count,1, i18n("No article specifications found!")); + $list->setCell($count,2, ''); +} + +unset($form); + +$form = new UI_Table_Form("artspec"); +$form->setVar("area",$area); +$form->setVar("frame", $frame); +$form->setVar("action", "client_artspec_save"); +$form->addHeader(i18n("Create new article specification")); +$inputbox = new cHTMLTextbox ("artspectext"); +$inputbox->setStyle("border:1px;border-style:solid;border-color:black;"); +$form->add(i18n("Specification name"),$inputbox->render()); + +$page->setContent($list->render()."
".$form->render()); +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.client_edit.php b/conlite/includes/include.client_edit.php new file mode 100644 index 0000000..40a4485 --- /dev/null +++ b/conlite/includes/include.client_edit.php @@ -0,0 +1,354 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-30 + * modified 2008-06-26, Dominik Ziegler, add security fix + * + * $Id: include.client_edit.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$properties = new PropertyCollection; + +$db2 = new DB_ConLite; + +if ($action == "client_new") +{ + $nextid = $db->nextid($cfg["tab"]["clients"]); + $idclient = $nextid; + $new = true; +} +if(!$perm->have_perm_area_action($area)) +{ + $notification->displayNotification("error", i18n("Permission denied")); +} else { + if ( !isset($idclient) ) + { + $notification->displayNotification("error", i18n("No client ID passed")); + } else { + if (($action == "client_edit") && ($perm->have_perm_area_action($area, $action))) + { + $sNewNotification = ''; + if ($active != "1") + { + $active = "0"; + } + + if ($new == true) + { + + $sLangNotification = i18n('Notice: In order to use this client, you must create a new language for it.'); + $sTarget = $sess->url('frameset.php?area=lang'); + $sJsLink = "parent.parent.location.href='".$sTarget."'; + top.header.markActive(top.header.document.getElementById('sub_lang'));"; + $sLangNotificationLink = sprintf(i18n('Please click %shere%s to create a new language.'), '', ''); + $sNewNotification = '
'.$sLangNotification.'
'.$sLangNotificationLink; + if (substr($frontendpath, strlen($frontendpath)-1) != "/") + { + $frontendpath .= "/"; + } + + if (substr($htmlpath, strlen($htmlpath)-1) != "/") + { + $htmlpath .= "/"; + } + + $sql = "INSERT INTO + ".$cfg["tab"]["clients"]." + SET + name = '".Contenido_Security::escapeDB($clientname, $db)."', + frontendpath = '".Contenido_Security::escapeDB($frontendpath, $db)."', + htmlpath = '".Contenido_Security::escapeDB($htmlpath, $db)."', + errsite_cat = '".Contenido_Security::toInteger($errsite_cat)."', + errsite_art = '".Contenido_Security::toInteger($errsite_art)."', + idclient = '".Contenido_Security::toInteger($idclient)."'"; + + $properties->setValue("idclient", $idclient, "backend", "clientimage", $clientlogo); + + // Copy the client template to the real location + $destPath = $frontendpath; + $sourcePath = $cfg['path']['contenido'] . $cfg['path']['frontendtemplate']; + + if($copytemplate) { + if(!file_exists($destPath)) { + if(recursive_copy($sourcePath, $destPath)) { + $res = fopen($destPath."config.php","rb+"); + $res2 = fopen($destPath."config.php.new", "ab+"); + if($res && $res2) { + while(!feof($res)) { + $buffer = fgets($res, 4096); + $buffer = str_replace("!CLIENT!", $idclient, $buffer); + $buffer = str_replace("!PATH!", $cfg["path"]["contenido"], $buffer); + fwrite($res2, $buffer); + } + } else { + $notification->displayNotification("error",i18n("Couldn't write the file config.php.")); + } + + fclose($res); + fclose($res2); + + unlink($destPath."config.php"); + rename($destPath."config.php.new", $destPath."config.php"); + $message = sprintf(i18n("Succesfully copied client-template to %s."),$destPath); + $notification->displayNotification("info", $message); + } else { + $message = sprintf(i18n("Cannot create directory %s . The client was created, but you have to copy the frontend-template yourself"),$destPath); + $notification->displayNotification("warning", $message); + } + } else { + $message = sprintf(i18n("The directory %s already exists. The client was created, but you have to copy the frontend-template yourself"),$destPath); + $notification->displayNotification("warning", $message); + } + } else { + $message = sprintf(i18n("Client '%s' created."),$clientname); + $notification->displayNotification("info", $message); + } + rereadClients(); +} else { + $pathwithoutslash = $frontendpath; + if (substr($frontendpath, strlen($frontendpath)-1) != "/") + { + $frontendpath .= "/"; + } + + if (substr($htmlpath, strlen($htmlpath)-1) != "/") + { + $htmlpath .= "/"; + } + + if (($oldpath != $frontendpath) && ($oldpath != $pathwithoutslash)) + { + $notification->displayNotification("warning", i18n("You changed the client path. You might need to copy the frontend to the new location")); + + } + $sql = "UPDATE + ".$cfg["tab"]["clients"]." + SET + name = '".Contenido_Security::escapeDB($clientname, $db)."', + frontendpath = '".Contenido_Security::escapeDB($frontendpath, $db)."', + htmlpath = '".Contenido_Security::escapeDB($htmlpath, $db)."', + errsite_cat = '".Contenido_Security::toInteger($errsite_cat)."', + errsite_art = '".Contenido_Security::toInteger($errsite_art)."' + WHERE + idclient = '".Contenido_Security::toInteger($idclient)."'"; + } + + $db->query($sql); + $new = false; + rereadClients(); + + $properties->setValue("idclient", $idclient, "backend", "clientimage", $clientlogo); + + /* Clear the con_code table */ + $sql = "DELETE FROM ".$cfg["tab"]["code"]." WHERE idclient = '".Contenido_Security::toInteger($idclient)."'"; + $db->query($sql); + + $notification->displayNotification("info", i18n("Changes saved").$sNewNotification); + + $cApiClient = new cApiClient; + $cApiClient->loadByPrimaryKey($idclient); + + if(isset($_REQUEST["generate_xhtml"])) { + switch($_REQUEST["generate_xhtml"]) { + case "html": + $cApiClient->setProperty("generator", "xhtml", "false"); + $cApiClient->setProperty("generator", "html5", "false"); + break; + + case "xhtml": + $cApiClient->setProperty("generator", "xhtml", "true"); + $cApiClient->setProperty("generator", "html5", "false"); + break; + + case "html5": + $cApiClient->setProperty("generator", "xhtml", "false"); + $cApiClient->setProperty("generator", "html5", "true"); + break; + + default: // do nothing + break; + } + } + } + + + $tpl->reset(); + + $sql = "SELECT + idclient, name, frontendpath, htmlpath, errsite_cat, errsite_art + FROM + ".$cfg["tab"]["clients"]." + WHERE + idclient = '".Contenido_Security::toInteger($idclient)."'"; + + $db->query($sql); + + $db->next_record(); + + $form = '
+ '.$sess->hidden_session().' + + + + + + '; + + $tpl->set('s', 'JAVASCRIPT', $javascript); + $tpl->set('s', 'FORM', $form); + $tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('s', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('s', 'SUBMITTEXT', i18n("Save changes")); + $tpl->set('s', 'CANCELTEXT', i18n("Discard changes")); + $tpl->set('s', 'CANCELLINK', $sess->url("main.php?area=$area&frame=4&idclient=$idclient")); + + if ($error) + { + echo $error; + } + + $tpl->set('d', 'CATNAME', i18n("Property")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', i18n("Value")); + $tpl->set('d', 'BRDRT', 1); + $tpl->set('d', 'BRDRB', 0); + $tpl->set('d', 'FONT', 'textg_medium'); + $tpl->next(); + + $tpl->set('d', 'CATNAME', i18n("Client name")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "clientname", clHtmlSpecialChars($db->f("name")), 50, 255)); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + $serverpath = $db->f("frontendpath"); + + if ($serverpath == "") + { + $serverpath = $cfg['path']['frontend']; + } + + $tpl->set('d', 'CATNAME', i18n("Server path")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "frontendpath", clHtmlSpecialChars($serverpath), 50, 255)); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + $htmlpath = $db->f("htmlpath"); + + if ($htmlpath == "") + { + $htmlpath = "http://"; + } + + $tpl->set('d', 'CATNAME', i18n("Web address")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "htmlpath", clHtmlSpecialChars($htmlpath), 50, 255)); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + $tpl->set('d', 'CATNAME', i18n("Error page category")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "errsite_cat", $db->f("errsite_cat"), 10, 10)); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + $tpl->set('d', 'CATNAME', i18n("Error page article")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "errsite_art", $db->f("errsite_art"), 10, 10)); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + $clientLogo = $properties->getValue ("idclient", $idclient, "backend", "clientimage"); + + $tpl->set('d', 'CATNAME', i18n("Client logo")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "clientlogo", $clientLogo, 50, 255)); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + $aChoices = array("html" => i18n("HTML"), "xhtml" => i18n("XHTML"), "html5" => i18n("HTML5")); + + $oXHTMLSelect = new cHTMLSelectElement("generate_xhtml"); + $oXHTMLSelect->autoFill($aChoices); + + $cApiClient = new cApiClient; + $cApiClient->loadByPrimaryKey($idclient); + if ($cApiClient->getProperty("generator", "xhtml") == "true") { + $oXHTMLSelect->setDefault("xhtml"); + } else if ($cApiClient->getProperty("generator", "html5") == "true") { + $oXHTMLSelect->setDefault("html5"); + } else { + $oXHTMLSelect->setDefault("html"); + } + + $tpl->set('d', 'CATNAME', i18n("Generate")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', $oXHTMLSelect->render()); + $tpl->set('d', 'BRDRT', 0); + $tpl->set('d', 'BRDRB', 1); + $tpl->set('d', 'FONT', 'text_medium'); + $tpl->next(); + + if ($new == true) + { + $tpl->set('d', 'CATNAME', i18n("Copy frontend template")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', "BORDERCOLOR", $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateCheckbox ("copytemplate", "checked", 1)); + $tpl->next(); + } + + $tpl->set('s', 'IDCLIENT', $idclient); + + # Generate template + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['client_edit']); + } +} +?> diff --git a/conlite/includes/include.client_left_top.php b/conlite/includes/include.client_left_top.php new file mode 100644 index 0000000..a82d02d --- /dev/null +++ b/conlite/includes/include.client_left_top.php @@ -0,0 +1,59 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-29 + * modified 2008-06-26, Dominik Ziegler, add security fix + * + * $Id: include.client_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'ID', 'oTplSel'); +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'CAPTION', ''); +$tpl->set('s', 'SESSID', $sess->id); + + +$tpl->set('s', 'ACTION', $select); + +$tmp_mstr = '%s'; +$area = "client"; +$mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=client&frame=3"), + 'right_bottom', + $sess->url("main.php?area=client_edit&action=client_new&frame=4"), + i18n("Create client")); +if (strpos($auth->auth["perm"],"sysadmin") !== false) +{ + $tpl->set('s', 'NEWCLIENT', $mstr); +} else { + $tpl->set('s', 'NEWCLIENT', ' '); +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['client_left_top']); +?> diff --git a/conlite/includes/include.client_menu.php b/conlite/includes/include.client_menu.php new file mode 100644 index 0000000..04644ff --- /dev/null +++ b/conlite/includes/include.client_menu.php @@ -0,0 +1,104 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-08 + * modified 2008-06-26, Dominik Ziegler, add security fix + * + * $Id: include.client_menu.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'SID', $sess->id); + +if (!isset($action)) $action = ""; + +if ($action == "client_delete") +{ + if ($perm->have_perm_area_action("client", "client_delete")) { + + $sql = "DELETE FROM " + .$cfg["tab"]["clients"]. + " WHERE + idclient = '".Contenido_Security::toInteger($idclient)."'"; + $db->query($sql); + } + +} + +$sql = "SELECT + * + FROM + ".$cfg["tab"]["clients"]; + +$db->query($sql); + +while ($db->next_record()) { + $idclient = $db->f("idclient"); + if ((strpos($auth->auth["perm"],"admin[$idclient]") !== false) || + (strpos($auth->auth["perm"],"sysadmin") !== false)) + { + $dark = !$dark; + if ($dark) { + $bgColor = $cfg["color"]["table_dark"]; + } else { + $bgColor = $cfg["color"]["table_light"]; + } + + $tmp_mstr = '%s'; + $idclient = $db->f("idclient"); + $mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&idclient=$idclient"), + 'right_bottom', + $sess->url("main.php?area=client_edit&frame=4&idclient=$idclient"), + $db->f("name") ); + + if (!$classclient->hasLanguageAssigned($idclient) && $perm->have_perm_area_action('client',"client_delete") ) { + $delTitle = i18n("Delete client"); + $delDescr = sprintf(i18n("Do you really want to delete the following client:

%s
"),clHtmlSpecialChars($db->f("name"))); + + $tpl->set('d', 'DELETE', ''.$delTitle.''); + + } else { + $tpl->set('d', 'DELETE', ' '); + } + + $tpl->set('d', 'ICON', ''); + $tpl->set('d', 'BGCOLOR', $bgColor); + $tpl->set('d', 'TEXT', $mstr); + + if ($_GET['idclient'] == $idclient) { + $tpl->set('d', 'ID', 'id="marked"'); + } else { + $tpl->set('d', 'ID', ''); + } + + $tpl->next(); + } +} +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['client_menu']); +?> diff --git a/conlite/includes/include.clientsettings.php b/conlite/includes/include.clientsettings.php new file mode 100644 index 0000000..82b9a6e --- /dev/null +++ b/conlite/includes/include.clientsettings.php @@ -0,0 +1,216 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Dominik Ziegler, add security fix + * modified 2008-11-13, Timo Trautmann - Fixed wron escaping of chars + * + * $Id: include.clientsettings.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oPage = new cPage; +$oList = new cScrollList; + +$idclient = $_GET['idclient']; +if (strlen($idclient) == 0) +{ + $idclient = $_POST['idclient']; +} + +$oFrmRange = new UI_Table_Form('range'); +$oFrmRange->setVar('area',$area); +$oFrmRange->setVar('frame', $frame); +$oFrmRange->setVar('idclient', $idclient); +$oFrmRange->addHeader(i18n('Select range')); + +$oSelRange = new cHTMLSelectElement ('idclientslang'); +$oOption = new cHTMLOptionElement(i18n("Language independent"), 0); +$oSelRange->addOptionElement(0, $oOption); + +$sSQL = "SELECT A.name AS name, A.idlang AS idlang, B.idclientslang AS idclientslang + FROM + ".$cfg["tab"]["lang"]." AS A, + ".$cfg["tab"]["clients_lang"]." AS B + WHERE + A.idlang=B.idlang AND + B.idclient='".Contenido_Security::toInteger($idclient)."' + ORDER BY A.idlang"; + +$db->query($sSQL); + +while ($db->next_record()) { + $iID = $db->f("idclientslang"); + $oOption = new cHTMLOptionElement($db->f("name")." (".$db->f("idlang").")", $iID); + $oSelRange->addOptionElement($iID, $oOption); +} + +if (is_numeric($_REQUEST["idclientslang"])) { + $oSelRange->setDefault($_REQUEST["idclientslang"]); +} + +$oSelRange->setStyle('border:1px;border-style:solid;border-color:black;'); +$oSelRange->setEvent("onchange", "document.forms.range.submit();"); +$oFrmRange->add(i18n('Range'),$oSelRange->render()); + +if (!is_numeric($_REQUEST["idclientslang"]) || $_REQUEST["idclientslang"] == 0) { + $oClient = new cApiClient($idclient); +} else { + $oClient = new cApiClientLanguage(); + $oClient->loadByPrimaryKey($_REQUEST["idclientslang"]); +} + +if ($_POST['action'] == 'clientsettings_save_item') +{ + $oClient->setProperty($_POST['cstype'], $_POST['csname'], $_POST['csvalue'], $_POST['csidproperty']); +} + +if ($_GET['action'] == 'clientsettings_delete_item') +{ + $oClient->deletePropertyById($_GET['idprop']); +} + +$oList->setHeader(i18n('Type'), i18n('Name'), i18n('Value'), ' '); +$oList->objHeaderItem->updateAttributes(array('width' => 52)); +$oList->objRow->updateAttributes(array('valign' => 'top')); + +$aItems = $oClient->getProperties(); + +if ($aItems !== false) +{ + $oLnkDelete = new Link; + $oLnkDelete->setCLink($area, $frame, "clientsettings_delete_item"); + $oLnkDelete->setContent(''.i18n('); + $oLnkDelete->setCustom("idclient", $idclient); + $oLnkDelete->setCustom("idclientslang", $_REQUEST["idclientslang"]); + + $oLnkEdit = new Link; + $oLnkEdit->setCLink($area, $frame, "clientsettings_edit_item"); + $oLnkEdit->setContent(''.i18n('); + $oLnkEdit->setCustom("idclient", $idclient); + $oLnkEdit->setCustom("idclientslang", $_REQUEST["idclientslang"]); + + $iCounter = 0; + foreach($aItems as $iKey => $aValue) + { + $oLnkDelete->setCustom("idprop", $iKey); + $oLnkEdit->setCustom("idprop", $iKey); + + if (($_GET['action'] == "clientsettings_edit_item") && ($_GET['idprop'] == $iKey)) + { + $oForm = new UI_Form("clientsettings"); + $oForm->setVar("area",$area); + $oForm->setVar("frame", $frame); + $oForm->setVar("action", "clientsettings_save_item"); + $oForm->setVar("idclient", $idclient); + $oForm->setVar("idclientslang", $_REQUEST["idclientslang"]); + + $oInputboxValue = new cHTMLTextbox ("csvalue", $aValue['value']); + $oInputboxValue->setStyle("border:1px;border-style:solid;border-color:black;width:200px;"); + + $oInputboxName = new cHTMLTextbox ("csname", $aValue['name']); + $oInputboxName->setStyle("border:1px;border-style:solid;border-color:black;width:200px;"); + + $oInputboxType = new cHTMLTextbox ("cstype", $aValue['type']); + $oInputboxType->setStyle("border:1px;border-style:solid;border-color:black;width:200px;"); + + $hidden = ''; + $sSubmit = ' '; + + $oList->setData($iCounter, $oInputboxType->render(), $oInputboxName->render(), $oInputboxValue->render().$hidden.$sSubmit, $oLnkEdit->render() . '   ' . $oLnkDelete->render()); + } else + { + $sMouseoverTemplate = '%s'; + + if (strlen($aValue['type']) > 35) { + $sShort = clHtmlSpecialChars(capiStrTrimHard($aValue['type'], 35)); + $aValue['type'] = sprintf($sMouseoverTemplate, clHtmlSpecialChars(addslashes($aValue['type']), ENT_QUOTES), $sShort); + } + + if (strlen($aValue['value']) > 35) { + $sShort = clHtmlSpecialChars(capiStrTrimHard($aValue['value'], 35)); + $aValue['value'] = sprintf($sMouseoverTemplate, clHtmlSpecialChars(addslashes($aValue['value']), ENT_QUOTES), $sShort); + } + + if (strlen($aValue['name']) > 35) { + $sShort = clHtmlSpecialChars(capiStrTrimHard($aValue['name'], 35)); + $aValue['name'] = sprintf($sMouseoverTemplate, clHtmlSpecialChars(addslashes($aValue['name']), ENT_QUOTES), $sShort); + } + + $oList->setData($iCounter, $aValue['type'], $aValue['name'], $aValue['value'], $oLnkEdit->render() . '   ' . $oLnkDelete->render()); + } + $iCounter++; + } +} else +{ + $oList->objItem->updateAttributes(array('colspan' => 4)); + $oList->setData(0, i18n("No defined properties")); +} + +$oForm = new UI_Table_Form('clientsettings'); +$oForm->setVar('area',$area); +$oForm->setVar('frame', $frame); +$oForm->setVar('action', 'clientsettings_save_item'); +$oForm->setVar('idclient', $idclient); +$oForm->setVar('idclientslang', $_REQUEST["idclientslang"]); +$oForm->addHeader(i18n('Add new variable')); + +$oInputbox = new cHTMLTextbox ('cstype'); +$oInputbox->setStyle('border:1px;border-style:solid;border-color:black;'); +$oForm->add(i18n('Type'),$oInputbox->render()); + +$oInputbox = new cHTMLTextbox ('csname'); +$oInputbox->setStyle('border:1px;border-style:solid;border-color:black;'); +$oForm->add(i18n('Name'),$oInputbox->render()); + +$oInputbox = new cHTMLTextbox ('csvalue'); +$oInputbox->setStyle('border:1px;border-style:solid;border-color:black;'); +$oForm->add(i18n('Value'),$oInputbox->render()); + +if (($_GET['action'] == "clientsettings_edit_item")) +{ + $oForm2 = new UI_Form("clientsettings"); + $oForm2->setVar("area",$area); + $oForm2->setVar("frame", $frame); + $oForm2->setVar("action", "clientsettings_save_item"); + $oForm2->setVar("idclient", $idclient); + $oForm2->setVar("idclientslang", $_REQUEST["idclientslang"]); + + $oForm2->add('list', $oList->render()); + $sSettingsList = $oForm2->render(); +} else { + $sSettingsList = $oList->render(); +} + +$sTooltippScript = ' + '; + +$oPage->addScript('tooltippstyle', ''); +$oPage->setContent($sTooltippScript."\n".$oFrmRange->render() . '
' . $sSettingsList . '
' . $oForm->render()); +$oPage->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.con_art_overview.php b/conlite/includes/include.con_art_overview.php new file mode 100644 index 0000000..8837c56 --- /dev/null +++ b/conlite/includes/include.con_art_overview.php @@ -0,0 +1,1021 @@ + + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-26 + * modified 2005-06-23, Andreas Lindner + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.con_art_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes","functions.tpl.php"); +cInclude("includes","functions.str.php"); +cInclude("includes", "functions.pathresolver.php"); +$firstMark = false; +$db2 = new DB_ConLite; + +$idcat = ( isset($_GET['idcat']) && is_numeric($_GET['idcat'])) ? $_GET['idcat'] : -1; +$next = ( isset($_GET['next']) && is_numeric($_GET['next']) && $_GET['next'] > 0) ? $_GET['next'] : 0; + +$dateformat = getEffectiveSetting("backend", "timeformat_date", "Y-m-d"); +$debug = false; +$templateDescription = ''; + +if (!isset($syncfrom)) +{ + $syncfrom = -1; +} + +$syncoptions = $syncfrom; + +if ($action == "con_duplicate") +{ + $newidartlang = conCopyArticle($duplicate, $idcat); +} + +if ($action == "con_syncarticle") +{ + /* Verify that the category is available in this language */ + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + if ($db->next_record()) + { + conSyncArticle($syncarticle, $sourcelanguage, $lang); + } else { + strSyncCategory($idcat, $sourcelanguage, $lang); + conSyncArticle($syncarticle, $sourcelanguage, $lang); + } +} + +/* Which columns to display? */ +$listColumns = array( "start" => i18n("Article"), + "title" => i18n("Title"), + "changeddate" => i18n("Changed"), + "publisheddate" => i18n("Published"), + "sortorder" => i18n("Sort order"), + "template" => i18n("Template"), + "actions" => i18n("Actions")); + +/* Which actions to display? */ +$actionList = array( "online", + "duplicate", + "locked", + "todo", + "delete", + "usetime"); + + +/* Call chains to process the columns and the action list */ +$_cecIterator = $_cecRegistry->getIterator("Contenido.ArticleList.Columns"); + +if ($_cecIterator->count() > 0) +{ + while ($chainEntry = $_cecIterator->next()) + { + $newColumnList = $chainEntry->execute($listColumns); + + if (is_array($newColumnList)) + { + $listColumns = $newColumnList; + } + } +} + +$_cecIterator = $_cecRegistry->getIterator("Contenido.ArticleList.Actions"); + +if ($_cecIterator->count() > 0) +{ + while ($chainEntry = $_cecIterator->next()) + { + $newActionList = $chainEntry->execute($actionList); + + if (is_array($newActionList)) + { + $actionList = $newActionList; + } + } +} + +$cat_idtpl = 0; + +if ( is_numeric($idcat) && ($idcat >= 0)) { + // Saving sort and elements per page user settings (if specified) + // Should be changed to User->setProperty... someday + if (isset($sort)) + { + $currentuser->setUserProperty("system","sortorder-idlang-$lang-idcat-$idcat",$sort); + } + + if (isset($elemperpage) && is_numeric($elemperpage)) + { + $currentuser->setUserProperty("system","elemperpage-idlang-$lang-idcat-$idcat", $elemperpage); + + } else { + $elemperpage = $currentuser->getUserProperty("system","elemperpage-idlang-$lang-idcat-$idcat"); + + if (!is_numeric($elemperpage)) + { + $elemperpage = 25; + } + } + + $col = new InUseCollection(); + + if ((( $idcat == 0 || + $perm->have_perm_area_action("con")) && $perm->have_perm_item("str", $idcat)) || + $perm->have_perm_area_action("con", "con_makestart") || + $perm->have_perm_area_action("con", "con_makeonline") || + $perm->have_perm_area_action("con", "con_deleteart") || + $perm->have_perm_area_action("con", "con_tplcfg_edit") || + $perm->have_perm_area_action("con", "con_lock") || + $perm->have_perm_area_action("con", "con_makecatonline") || + $perm->have_perm_area_action("con", "con_changetemplate") || + $perm->have_perm_area_action("con_editcontent", "con_editart") || + $perm->have_perm_area_action("con_editart", "con_edit") || + $perm->have_perm_area_action("con_editart", "con_newart") || + $perm->have_perm_area_action("con_editart", "con_saveart") || + $perm->have_perm_area_action("con_tplcfg", "con_tplcfg_edit") || + $perm->have_perm_area_action_item("con", "con_makestart", $idcat) || + $perm->have_perm_area_action_item("con", "con_makeonline", $idcat) || + $perm->have_perm_area_action_item("con", "con_deleteart", $idcat) || + $perm->have_perm_area_action_item("con", "con_tplcfg_edit", $idcat) || + $perm->have_perm_area_action_item("con", "con_lock", $idcat) || + $perm->have_perm_area_action_item("con", "con_makecatonline", $idcat) || + $perm->have_perm_area_action_item("con", "con_changetemplate", $idcat) || + $perm->have_perm_area_action_item("con_editcontent", "con_editart", $idcat) || + $perm->have_perm_area_action_item("con_editart", "con_edit", $idcat) || + $perm->have_perm_area_action_item("con_editart", "con_newart", $idcat) || + $perm->have_perm_area_action_item("con_tplcfg", "con_tplcfg_edit",$idcat) || + $perm->have_perm_area_action_item("con_editart", "con_saveart", $idcat)) { + + $sort = $currentuser->getUserProperty("system","sortorder-idlang-$lang-idcat-$idcat"); + + $sql = "SELECT + a.idart AS idart, + a.idlang AS idlang, + a.idartlang AS idartlang, + a.title AS title, + c.idcat AS idcat, + {ISSTART} + c.idcatart AS idcatart, + a.idtplcfg AS idtplcfg, + a.published AS published, + a.online AS online, + a.created AS created, + a.lastmodified AS lastmodified, + a.timemgmt AS timemgmt, + a.datestart AS datestart, + a.dateend AS dateend, + a.artsort AS artsort, + a.redirect AS redirect, + a.locked AS locked + FROM + ".$cfg["tab"]["art_lang"]." AS a, + ".$cfg["tab"]["art"]." AS b, + ".$cfg["tab"]["cat_art"]." AS c + WHERE + (a.idlang = '".$lang."' {SYNCOPTIONS}) AND + a.idart = b.idart AND + b.idclient = '".$client."' AND + b.idart = c.idart AND + c.idcat = '".$idcat."'"; + + // Simple SQL statement to get the number of articles + $sql_count = + "SELECT + COUNT(*) AS article_count + FROM + ".$cfg["tab"]["art_lang"]." AS a, + ".$cfg["tab"]["art"]." AS b, + ".$cfg["tab"]["cat_art"]." AS c + WHERE + (a.idlang = '".Contenido_Security::toInteger($lang)."' {SYNCOPTIONS}) AND + a.idart = b.idart AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idart = c.idart AND + c.idcat = '".Contenido_Security::toInteger($idcat)."'"; + + if ($cfg["is_start_compatible"] == true) + { + $sql = str_replace("{ISSTART}", "c.is_start AS is_start,", $sql); + } else { + $sql = str_replace("{ISSTART}", "", $sql); + } + + if ($syncoptions == -1) + { + $sql = str_replace("{SYNCOPTIONS}", "", $sql); + $sql_count = str_replace("{SYNCOPTIONS}", "", $sql_count); + } else { + $sql = str_replace("{SYNCOPTIONS}", "OR a.idlang = '".$syncoptions."'", $sql); + $sql_count = str_replace("{SYNCOPTIONS}", "OR a.idlang = '".$syncoptions."'", $sql_count); + } + + # Article sort + switch ($sort) + { + case 2: + $sql .= " ORDER BY a.lastmodified DESC"; + break; + case 3: + $sql .= " ORDER BY a.published DESC, a.lastmodified DESC"; + break; + case 4: + $sql .= " ORDER BY a.artsort ASC"; + break; + default: + // Default sort order + $sql .= " ORDER BY a.title ASC"; + $sort = 1; + } + + + # Getting article count, if necessary + if ($elemperpage > 0) + { + $db->query($sql_count); + $db->next_record(); + $iArticleCount = $db->f("article_count"); + + # If not beyond scope, limit + if ($iArticleCount == 0) + { + $next = 0; + } else if ($next >= $iArticleCount) { + $next = (ceil($iArticleCount / $elemperpage) - 1) * $elemperpage; + } + $sql .= " LIMIT $next, $elemperpage"; + } else { + $iArticleCount = 0; // Will be used to "hide" the browsing area + } + + # Debug info + if ( $debug ) { + echo "
";
+			echo $sql;
+			echo "
"; + } + + # Getting data + $db->query($sql); + + # Reset Template + $tpl->reset(); + + # No article + $no_article = true; + + $aArticles = Array(); + + while ($db->next_record() ) { + $sItem = "k" . $db->f("idart"); + + if ($db->f("idlang") == $lang || !array_key_exists($sItem, $aArticles)) { + $aArticles[$sItem]["idart"] = $db->f("idart"); + $aArticles[$sItem]["idlang"] = $db->f("idlang"); + $aArticles[$sItem]["idartlang"] = $db->f("idartlang"); + $aArticles[$sItem]["title"] = $db->f("title"); + if ($cfg["is_start_compatible"] == true) { + $aArticles[$sItem]["is_start"] = $db->f("is_start"); + } else { + $aArticles[$sItem]["is_start"] = isStartArticle($db->f("idartlang"), $idcat, $lang); + } + + $aArticles[$sItem]["idcatart"] = $db->f("idcatart"); + $aArticles[$sItem]["idtplcfg"] = $db->f("idtplcfg"); + $aArticles[$sItem]["published"] = $db->f("published"); + $aArticles[$sItem]["online"] = $db->f("online"); + $aArticles[$sItem]["created"] = $db->f("created"); + $aArticles[$sItem]["idcat"] = $db->f("idcat"); + $aArticles[$sItem]["lastmodified"] = $db->f("lastmodified"); + $aArticles[$sItem]["timemgmt"] = $db->f("timemgmt"); + $aArticles[$sItem]["datestart"] = $db->f("datestart"); + $aArticles[$sItem]["dateend"] = $db->f("dateend"); + $aArticles[$sItem]["artsort"] = $db->f("artsort"); + $aArticles[$sItem]["locked"] = $db->f("locked"); + $aArticles[$sItem]["redirect"] = $db->f("redirect"); + } + } + + $artlist = array(); + $dyn_cnt = 0; + foreach ($aArticles as $sart) { + $dyn_cnt++; + $idart = $sart["idart"]; + $idlang = $sart["idlang"]; + + $idtplcfg = $sart["idtplcfg"]; + $idartlang = $sart["idartlang"]; + $lidcat = $sart["idcat"]; + $idcatlang = 0; + $idart = $sart["idart"]; + $published = $sart["published"]; + $online = $sart["online"]; + + $is_start = $sart["is_start"]; + + $idcatart = $sart["idcatart"]; + $created = $sart["created"]; + $modified = $sart["lastmodified"]; + $title = clHtmlSpecialChars($sart["title"]); + $timemgmt = $sart["timemgmt"]; + $datestart = $sart["datestart"]; + $dateend = $sart["dateend"]; + $sortkey = $sart["artsort"]; + $locked = $sart["locked"]; + $redirect = $sart["redirect"]; + + $published = ($published != '0000-00-00 00:00:00') ? date($dateformat,strtotime($published)) : i18n("not yet published"); + $created = date($dateformat,strtotime($created)); + $modified = date($dateformat,strtotime($modified)); + $alttitle = "idart".': '.$idart.' '."idcatart".': '.$idcatart.' '."idartlang".': '.$idartlang; + + if (($obj = $col->checkMark("article", $idartlang)) === false) + { + $inUse = false; + } else { + $vuser = new User; + $vuser->loadUserByUserID($obj->get("userid")); + $inUseUser = $vuser->getField("username"); + $inUseUserRealName = $vuser->getField("realname"); + + $inUse = true; + $title = $title . " (" . i18n("Article is in use").")"; + $alttitle = sprintf(i18n("Article in use by %s (%s)"), $inUseUser, $inUseUserRealName). " ". $alttitle; + } + + $bgcolor = $cfg["color"]["table_light"]; + if ($idlang != $lang) + { + $bgcolor = ( is_int($dyn_cnt / 2) ) ? $cfg["color"]["table_light_sync"] : $cfg["color"]["table_dark_sync"]; + } + + /* Id of the row, + stores informations about + the article and category */ + $tmp_rowid = $idart."-".$idartlang."-".$lidcat."-".$idcatlang."-".$idcatart."-".$idlang; + $tpl->set('d', 'ROWID', $tmp_rowid); + + $colitem[$tmp_rowid] = $bgcolor; + # Backgroundcolor of the table row + $tpl->set('d', 'BGCOLOR', $bgcolor); + + # Article Title + if ($perm->have_perm_area_action( "con_editcontent", "con_editart" ) || + $perm->have_perm_area_action_item( "con_editcontent", "con_editart" ,$idcat) ) + { + if ($idlang != $lang) + { + $tmp_alink = $sess->url("main.php?area=con_editcontent&action=con_editart&changeview=prev&idartlang=$idartlang&idart=$idart&idcat=$idcat&frame=$frame&tmpchangelang=$idlang"); + $titlelink = ''.$title.''; + } else { + $tmp_alink = $sess->url("main.php?area=con_editcontent&action=con_editart&changeview=edit&idartlang=$idartlang&idart=$idart&idcat=$idcat&frame=$frame"); + $titlelink = ''.$title.''; + } + } else { + $tmp_alink = ""; + $titlelink = $title; + } + + if ($timemgmt == "1") + { + $sql = "SELECT NOW() AS TIME"; + + $db3 = new DB_ConLite; + + $db3->query($sql); + $db3->next_record(); + + $starttimestamp = strtotime($datestart); + $endtimestamp = strtotime($dateend); + $nowtimestamp = strtotime($db3->f("TIME")); + + if (($nowtimestamp < $endtimestamp) && ($nowtimestamp > $starttimestamp)) + { + $usetime = 'Artikel mit Zeitsteuerung online'; + } else { + $usetime = 'Artikel mit Zeitsteuerung offline'; + } + } else { + $usetime = ""; + } + + # Article Title + if (($perm->have_perm_area_action( "con", "con_lock" ) || + $perm->have_perm_area_action_item( "con", "con_lock" ,$idcat)) && $inUse == false ) + { + if ($locked == 1) + { + $lockimg = 'images/article_locked.gif'; + $lockalt = i18n("Unfreeze article"); + } else { + $lockimg = 'images/article_unlocked.gif'; + $lockalt = i18n("Freeze article"); + } + $tmp_lock = ''.$lockalt.''; + } else { + if ($locked == 1) + { + $lockimg = 'images/article_locked.gif'; + $lockalt = i18n("Article is frozen"); + } else { + $lockimg = 'images/article_unlocked.gif'; + $lockalt = i18n("Article is not frozen"); + } + $tmp_lock = ''.$lockalt.''; + } + + if ($idlang != $lang) + { + $lockedlink = ""; + } else { + $lockedlink = $tmp_lock; + } + + if ($sortkey == "") + { + $sortkey = " "; + } + + $tmp_articletitle = $titlelink; + + # Article conf button + if ($perm->have_perm_area_action("con_editart","con_edit") || + $perm->have_perm_area_action_item("con_editart","con_edit",$idcat)) + { + $tmp_artconf = ''.i18n('; + } else { + $tmp_artconf=""; + } + + $tmp_sync = ''; + if ($idlang != $lang) + { + + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; + + $db->query($sql); + if ($db->next_record()) + { + $tmp_sync = ''.i18n('; + + } else { + $tmp_sync = ""; + } + } + + # Article Template + if ( !is_object($db2) ) + { + $db2 = new DB_ConLite; + } + + $sql2 = + "SELECT + b.name AS tplname, + b.idtpl AS idtpl, + b.description AS description + FROM + ".$cfg["tab"]["tpl_conf"]." AS a, + ".$cfg["tab"]["tpl"]." AS b + WHERE + a.idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' AND + a.idtpl = b.idtpl"; + + $db2->query($sql2); + $db2->next_record(); + + $a_tplname = $db2->f("tplname"); + $a_idtpl = $db2->f("idtpl"); + + $templateDescription = $db2->f("description"); + + + # Uses Category Template + if ( 0 == $idtplcfg ) + { + $a_tplname = "--- ".i18n("None")." ---"; + } + + # Make Startarticle button + $imgsrc = "isstart"; + + if ($is_start == false) { + $imgsrc.='0'; + } else { + $imgsrc.='1'; + } + + if (isArtInMultipleUse($idart)) { + $imgsrc.='m'; + } + + if ((int)$redirect == 1) { + $imgsrc.='r'; + } + + $imgsrc.='.gif'; + + if ( ($perm->have_perm_area_action("con","con_makestart") || $perm->have_perm_area_action_item("con","con_makestart",$idcat)) && $idcat != 0) { + if ( $is_start == false) { + $tmp_link = ''.i18n('; + } else { + $tmp_link = ''.i18n('; + } + } else { + if ($is_start == true) { + $sTitle = i18n("Start article"); + } else { + $sTitle = i18n("Normal article"); + } + + $tmp_img = ''.$sTitle.''; + + $tmp_link = $tmp_img; + } + + $tmp_start = $tmp_link; + + # Make copy button + if ( ($perm->have_perm_area_action("con","con_duplicate") || $perm->have_perm_area_action_item("con","con_duplicate",$idcat)) && $idcat != 0) { + + $imgsrc = "but_copy.gif"; + $tmp_link = ''.i18n('; + } else { + $tmp_link = ""; + } + + if ($idlang != $lang) + { + $duplicatelink = ""; + } else { + $duplicatelink = $tmp_link; + } + + $subject = urlencode(sprintf(i18n("Reminder for Article '%s'"),$title)); + $mycatname = ""; + conCreateLocationString($idcat, " / ", $mycatname); + $message = urlencode(sprintf(i18n("Reminder for Article '%s'\nCategory: %s"),$title,$mycatname)); + + $todolink = new TODOLink("idart", $idart, $subject, $message); + + # Make On-/Offline button + if ( $online ) { + if (($perm->have_perm_area_action("con","con_makeonline") || + $perm->have_perm_area_action_item("con","con_makeonline",$idcat)) && ($idcat != 0)) + { + $tmp_online = ''.i18n('; + } else { + $tmp_online = ''.i18n('; + } + } else { + if (($perm->have_perm_area_action("con","con_makeonline") || + $perm->have_perm_area_action_item("con","con_makeonline",$idcat)) && ($idcat != 0)) + { + $tmp_online = ''.i18n('; + } else { + $tmp_online = ''.i18n('; + } + } + + if ($idlang != $lang) + { + $onlinelink = ""; + } else { + $onlinelink = $tmp_online; + } + + # Delete button + if (($perm->have_perm_area_action("con","con_deleteart") || + $perm->have_perm_area_action_item("con","con_deleteart",$idcat)) && $inUse == false) + { + $tmp_title = $title; + + if (strlen($tmp_title) > 30) + { + $tmp_title = substr($tmp_title, 0, 27) . "..."; + } + + $confirmString = sprintf(i18n("Are you sure to delete the following article:

%s"),clHtmlSpecialChars($tmp_title)); + $tmp_del = ''.i18n('; + + } else { + $tmp_del = ""; + } + + if ($idlang != $lang) + { + $deletelink = ""; + } else { + $deletelink = $tmp_del; + } + + // DIRECTION + cInclude('includes', 'functions.lang.php'); + $tpl->set('d', 'DIRECTION', 'dir="' . langGetTextDirection($lang) . '"'); + + # Next iteration + + # Articles found + $no_article = false; + foreach ($listColumns as $listColumn => $ctitle) + { + switch ($listColumn) + { + case "start": + $value = $tmp_start; + break; + case "title": + $value = $tmp_articletitle; + break; + case "changeddate": + $value = $modified; + break; + case "publisheddate": + $value = $published; + break; + case "sortorder": + $value = $sortkey; + break; + case "template": + $value = $a_tplname; + break; + case "actions": + $actions = array(); + foreach ($actionList as $actionItem) + { + switch ($actionItem) + { + case "todo": + $actionValue = $todolink->render(); + break; + case "artconf": + $actionValue = $tmp_artconf; + break; + case "online": + $actionValue = $onlinelink; + break; + case "locked": + $actionValue = $lockedlink; + break; + case "duplicate": + $actionValue = $duplicatelink; + break; + case "delete": + $actionValue = $deletelink; + break; + case "usetime": + $actionValue = $usetime; + break; + default: + /* Ask chain about the entry */ + $_cecIterator = $_cecRegistry->getIterator("Contenido.ArticleList.RenderAction"); + $contents = array(); + if ($_cecIterator->count() > 0) + { + while ($chainEntry = $_cecIterator->next()) + { + $contents[] = $chainEntry->execute($idcat, $idart, $idartlang, $actionItem); + } + } + $actionValue = implode("", $contents); + break; + } + + $actions[] = $actionValue; + } + + if ($tmp_sync != '') { + $actions[] = $tmp_sync; + } + + $value = implode("\n", $actions); + break; + default: + $contents = array(); + /* Call chain to retrieve value */ + $_cecIterator = $_cecRegistry->getIterator("Contenido.ArticleList.RenderColumn"); + + if ($_cecIterator->count() > 0) + { + $contents = array(); + while ($chainEntry = $_cecIterator->next()) + { + $contents[] = $chainEntry->execute($idcat, $idart, $idartlang, $listColumn); + } + } + $value = implode("", $contents); + } + $artlist[$tmp_rowid][$listColumn] = $value; + $artlist[$tmp_rowid]['templateDescription'] = $templateDescription; + } + } + + + $headers = array(); + + foreach ($listColumns as $key => $listColumn) + { + /* Dirty hack to force column widths */ + if ($key == "title" || $listColumn == i18n("Title")) + { + $headers[] = ''.$listColumn.''; + } else { + $headers[] = ''.$listColumn.''; + } + } + + $tpl->set('s', 'HEADERS', implode("\n", $headers)); + + if($elemperpage > 0 && $iArticleCount > 0) { + $sBrowseLinks = ""; + for ($i = 1; $i <= ceil($iArticleCount / $elemperpage); $i++) { + $iNext = ($i - 1) * $elemperpage; + if ($sBrowseLinks !== "") { + $sBrowseLinks .= " "; + } + if ($next == $iNext) { + $sBrowseLinks .= $i."\n"; // I'm on the current page, no link + } else { + $tmp_alink = $sess->url("main.php?area=con&frame=$frame&idcat=$idcat&next=$iNext"); + $sBrowseLinks .= ''.$i.''."\n"; + } + } + $tpl->set('s', 'NEXT', $next); + $tpl->set('s', 'BROWSE', sprintf(i18n("Go to page: %s"), $sBrowseLinks)); + } else { + $tpl->set('s', 'NEXT', "0"); + $tpl->set('s', 'BROWSE', sprintf(i18n("Go to page: %s"), "1")); + } + + $tpl->set('s', 'CLICK_ROW_NOTIFICATION', i18n("with click select line for further treatment")); + + + if (count($artlist) > 0) + { + foreach ($artlist as $key2 => $artitem) + { + if ($firstMark == false) { + $script = 'function initTheOne() { + var theOne = document.getElementById("'.$key2.'"); + artRow.reset(); + artRow.over( theOne ); + artRow.click( theOne ) + } + initTheOne()'; + $firstMark = true; + $tpl->set('s', 'ROWMARKSCRIPT', $script); + } + + $cells = array(); + + foreach ($listColumns as $key => $listColumn) + { + // Description for hover effect + if($key == 'template') + { + $templateDescription = $artitem['templateDescription']; + $descString = ''.$artitem[$key].''; + + $sTemplatename = capiStrTrimHard($artitem[$key], 20); + if (strlen($artitem[$key]) > 20) { + $cells[] = ''.$sTemplatename.''; + } else { + $cells[] = ''.$artitem[$key].''; + } + } + else + { + $cells[] = ''.$artitem[$key].''; + } + } + $tpl->set('d', 'CELLS', implode("\n", $cells)); + $tpl->set('d', 'BGCOLOR', $colitem[$key2]); + + if ($colitem[$key2] == $cfg["color"]["table_dark_sync"] || $colitem[$key2] == $cfg["color"]["table_light_sync"]) { + $tpl->set('d', 'CSS_CLASS', 'class="con_sync"'); + } else { + $tpl->set('d', 'CSS_CLASS', ''); + } + + $tpl->set('d', 'ROWID', $key2); + $tpl->next(); + } + }else + { + $emptyCell = ''.i18n("No articles found").''; + $tpl->set('d', 'CELLS', $emptyCell); + $tpl->set('s', 'ROWMARKSCRIPT', ''); + } + + # Sortierungs select + $s_types = array(1 => i18n("Alphabetical"), + 2 => i18n("Last change"), + 3 => i18n("Published date"), + 4 => i18n("Sort key")); + + $tpl2 = new Template; + $tpl2->set('s', 'NAME', 'sort'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'onchange="artSort(this)"'); + + foreach ($s_types as $key => $value) { + + $selected = ( $sort == $key ) ? 'selected="selected"' : ''; + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value); + $tpl2->set('d', 'SELECTED', $selected); + $tpl2->next(); + + } + + $select = ( !$no_article ) ? $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true) : ' '; + $caption = ( !$no_article ) ? i18n("Sort articles:") : ' '; + + $tpl->set('s', 'ARTSORTCAPTION', $caption); + $tpl->set('s', 'ARTSORT', $select); + + # Elements per Page select + $aElemPerPage = array(0 => i18n("All"), + 25 => "25", + 50 => "50", + 75 => "75", + 100 => "100"); + + $tpl2 = new Template; + $tpl2->set('s', 'NAME', 'sort'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'onchange="changeElemPerPage(this)"'); + + foreach ($aElemPerPage as $key => $value) { + $selected = ( $elemperpage == $key ) ? 'selected="selected"' : ''; + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value); + $tpl2->set('d', 'SELECTED', $selected); + $tpl2->next(); + } + + $select = ( !$no_article ) ? $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true) : ' '; + $caption = ( !$no_article ) ? i18n("Items per page:") : ' '; + + $tpl->set('s', 'ELEMPERPAGECAPTION', $caption); + $tpl->set('s', 'ELEMPERPAGE', $select); + + + # Extract Category and Catcfg + $sql = "SELECT + b.name AS name, + d.idtpl AS idtpl + FROM + (".$cfg["tab"]["cat"]." AS a, + ".$cfg["tab"]["cat_lang"]." AS b, + ".$cfg["tab"]["tpl_conf"]." AS c) + LEFT JOIN + ".$cfg["tab"]["tpl"]." AS d + ON + d.idtpl = c.idtpl + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idcat = '".Contenido_Security::toInteger($idcat)."' AND + b.idlang = '".Contenido_Security::toInteger($lang)."' AND + b.idcat = a.idcat AND + c.idtplcfg = b.idtplcfg"; + + $db->query($sql); + + if ($db->next_record()) + { + //$foreignlang = false; + //conCreateLocationString($idcat, " / ", $cat_name); + } + + // Show path of selected category to user + prCreateURLNameLocationString($idcat, '/', $cat_name_tmp); + + if ($cat_name_tmp != '') { + $cat_name = '
'; + $cat_name .= $cat_name_tmp.'/'; + $cat_name .= (isset($sFistArticleName))?clHtmlSpecialChars($sFistArticleName):''; + $cat_name .= "
"; + } else { + $cat_name = ''; + } + + $cat_idtpl = $db->f("idtpl"); + + # Hinweis wenn kein Artikel gefunden wurde + if ( $no_article ) { + + $tpl->set("d", "START", " "); + $tpl->set("d", "ARTICLE", i18n("No articles found")); + $tpl->set("d", "PUBLISHED", " "); + $tpl->set("d", "LASTMODIFIED", " "); + $tpl->set("d", "ARTCONF", " "); + $tpl->set("d", "TPLNAME", " "); + $tpl->set("d", "LOCKED", " "); + $tpl->set("d", "DUPLICATE", " "); + $tpl->set("d", "TPLCONF", " "); + $tpl->set("d", "ONLINE", " "); + $tpl->set("d", "DELETE", " "); + $tpl->set("d", "USETIME", " "); + $tpl->set("d", "TODO", " "); + $tpl->set("d", "SORTKEY", " "); + + $tpl->next(); + } + + # Kategorie anzeigen und Konfigurieren button + /* JL 23.06.03 Check right from "Content" instead of "Category" + if ($perm->have_perm_area_action("str_tplcfg","str_tplcfg") || + $perm->have_perm_area_action_item("str_tplcfg","str_tplcfg",$lidcat)) */ + + if (($perm->have_perm_area_action_item( "con", "con_tplcfg_edit", $idcat ) || + $perm->have_perm_area_action( "con", "con_tplcfg_edit" ))) { + + if ( 0 != $idcat ) { + + $tpl->set('s', 'CATEGORY', $cat_name); + $tpl->set('s', 'CATEGORY_CONF', $tmp_img); + $tpl->set('s', 'CATEGORY_LINK', $tmp_link); + } else { + $tpl->set('s', 'CATEGORY', $cat_name); + $tpl->set('s', 'CATEGORY_CONF', ' '); + $tpl->set('s', 'CATEGORY_LINK', ' '); + } + } else { + $tpl->set('s', 'CATEGORY', $cat_name); + $tpl->set('s', 'CATEGORY_CONF', ' '); + $tpl->set('s', 'CATEGORY_LINK', ' '); + } + + # SELF_URL (Variable f�r das javascript); + $tpl->set('s', 'SELF_URL', $sess->url("main.php?area=con&frame=4&idcat=$idcat")); + + # New Article link + if (($perm->have_perm_area_action("con_editart", "con_newart") || + $perm->have_perm_area_action_item("con_editart", "con_newart", $idcat))) + { + if ( $idcat != 0 && $cat_idtpl != 0) + { + $tpl->set('s', 'NEWARTICLE_TEXT', ''.i18n("Create new article").''); + $tpl->set('s', 'NEWARTICLE_IMG', ''.i18n('); + } + else + { + $tpl->set('s', 'NEWARTICLE_TEXT', ' '); + $tpl->set('s', 'NEWARTICLE_IMG', ' '); + } + } + else + { + $tpl->set('s', 'NEWARTICLE_TEXT', ' '); + $tpl->set('s', 'NEWARTICLE_IMG', ' '); + } + + $str = ""; + + /* Session ID */ + $tpl->set('s', 'SID', $sess->id); + + $tpl->set('s', 'NOTIFICATION', $str); + + # Generate template + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['con_art_overview']); + } else { + $notification->displayNotification("error", i18n("Permission denied")); + } +} else { + $tpl->reset(); + $tpl->set('s', 'CONTENTS', ''); + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['blank']); +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.con_edit_form.php b/conlite/includes/include.con_edit_form.php new file mode 100644 index 0000000..5d63b86 --- /dev/null +++ b/conlite/includes/include.con_edit_form.php @@ -0,0 +1,768 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-21 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-08-29, Murat Purc, add handling of urlname + * modified 2008-09-11, Andreas Lindner, added decoding of text and cat names + * with unFilter function + * + * $Id: include.con_edit_form.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.str.php"); +cInclude("includes", "functions.pathresolver.php"); + +$tpl->reset(); + +if ($action == "remove_assignments") +{ + $sql = "DELETE FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idcat != '".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); +} +if ($action == "con_newart" && $newart != true) +{ + // nothing to be done here ?! +} +else { + $disabled = ""; + + if ($perm->have_perm_area_action($area, "con_edit") || + $perm->have_perm_area_action_item($area,"con_edit", $idcat)) { + + $sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idcat = '".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + $db->next_record(); + + if ($cfg["is_start_compatible"] == true) + { + $tmp_is_start = $db->f("is_start"); + } + + $tmp_cat_art = $db->f("idcatart"); + + $sql = "SELECT * FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + + $db->query($sql); + $db->next_record(); + + if ($cfg["is_start_compatible"] == false) + { + $tmp_is_start = isStartArticle($db->f("idartlang"), $idcat, $lang); + } + + if ( $db->f("created") ) { + + //****************** this art was edited before ******************** + $tmp_firstedit = 0; + $tmp_idartlang = $db->f("idartlang"); + $tmp_page_title = Contenido_Security::unFilter(stripslashes($db->f("pagetitle"))); + $tmp_idlang = $db->f("idlang"); + $tmp_title = Contenido_Security::unFilter($db->f("title")); + $tmp_urlname = Contenido_Security::unFilter($db->f("urlname")); // plugin Advanced Mod Rewrite - edit by stese + $tmp_artspec = $db->f("artspec"); + $tmp_summary = Contenido_Security::unFilter($db->f("summary")); + $tmp_created = $db->f("created"); + $tmp_lastmodified = $db->f("lastmodified"); + $tmp_author = $db->f("author"); + $tmp_modifiedby = $db->f("modifiedby"); + $tmp_online = $db->f("online"); + $tmp_published = $db->f("published"); + $tmp_publishedby = $db->f("publishedby"); + $tmp_datestart = $db->f("datestart"); + $tmp_dateend = $db->f("dateend"); + $tmp_sort = $db->f("artsort"); + $tmp_movetocat = $db->f("time_move_cat"); + $tmp_targetcat = $db->f("time_target_cat"); + $tmp_onlineaftermove = $db->f("time_online_move"); + $tmp_usetimemgmt = $db->f("timemgmt"); + $tmp_locked = $db->f("locked"); + + $tmp_redirect_checked = ($db->f("redirect") == '1') ? 'checked' : ''; + $tmp_redirect_url = ($db->f("redirect_url") != '0') ? $db->f("redirect_url") : "http://"; + $tmp_external_redirect_checked = ($db->f("external_redirect") == '1') ? 'checked' : ''; + + $idtplinput = $db->f("idtplinput"); + + if ($tmp_modifiedby == "") + { + $tmp_modifiedby = $tmp_author; + } + + $col = new InUseCollection; + + /* Remove all own marks */ + $col->removeSessionMarks($sess->id); + + if (($obj = $col->checkMark("article", $tmp_idartlang)) === false) + { + $col->markInUse("article", $tmp_idartlang, $sess->id, $auth->auth["uid"]); + $inUse = false; + $disabled = ""; + } else { + + $vuser = new User; + $vuser->loadUserByUserID($obj->get("userid")); + $inUseUser = $vuser->getField("username"); + $inUseUserRealName = $vuser->getField("realname"); + + $message = sprintf(i18n("Article is in use by %s (%s)"), $inUseUser, $inUseUserRealName); + $notification->displayNotification("warning", $message); + $inUse = true; + $disabled = 'disabled="disabled"'; + } + + if ($tmp_locked == 1) + { + $inUse = true; + $disabled = 'disabled="disabled"'; + } + + } else { + + //***************** this art is edited the first time ************* + + if (!$idart) $tmp_firstedit = 1; //**** is needed when input is written to db (update or insert) + + $tmp_idartlang = 0; + $tmp_idlang = $lang; + $tmp_page_title = stripslashes($db->f("pagetitle")); + $tmp_title = ""; + $tmp_urlname = ""; // plugin Advanced Mod Rewrite - edit by stese + $tmp_artspec = ""; + $tmp_summary = ""; + $tmp_created = date("Y-m-d H:i:s"); + $tmp_lastmodified = date("Y-m-d H:i:s"); + $tmp_published = date("Y-m-d H:i:s"); + $tmp_publishedby = ""; + $tmp_author = ""; + $tmp_online = "0"; + $tmp_datestart = "0000-00-00 00:00:00"; + $tmp_dateend = "0000-00-00 00:00:00"; + $tmp_keyart = ""; + $tmp_keyautoart = ""; + $tmp_sort = ""; + + if (!strHasStartArticle($idcat, $lang)) + { + $tmp_is_start = 1; + } + + $tmp_redirect_checked = ''; + $tmp_redirect_url = "http://"; + $tmp_external_redirect = ''; + + } + + $dateformat = getEffectiveSetting("backend", "timeformat", "Y-m-d H:i:s"); + + $tmp2_created = date($dateformat,strtotime($tmp_created)); + $tmp2_lastmodified = date($dateformat,strtotime($tmp_lastmodified)); + $tmp2_published = date($dateformat,strtotime($tmp_published)); + + $tpl->set('s', 'ACTION', $sess->url("main.php?area=$area&frame=$frame&action=con_saveart") ); + $tpl->set('s', 'HIDDENSESSION', $sess->hidden_session(true)); + $tpl->set('s', 'TMP_FIRSTEDIT', $tmp_firstedit); + $tpl->set('s', 'IDART', $idart); + $tpl->set('s', 'SID', $sess->id); + $tpl->set('s', 'IDCAT', $idcat); + $tpl->set('s', 'IDARTLANG', $tmp_idartlang ); + + $hiddenfields = ' + + '; + + $tpl->set('s', 'HIDDENFIELDS', $hiddenfields); + + // Show path of selected category to user + $catString = ''; + prCreateURLNameLocationString($idcat, '/', $catString); + $tpl->set('s', 'CATEGORY', $catString.'/'.clHtmlSpecialChars($tmp_title)); + + /* Title */ + $tpl->set('s', 'TITEL', i18n("Title")); + + // plugin Advanced Mod Rewrite - edit by stese + $tpl->set('s', 'URLNAME', i18n("Alias")); + // end plugin Advanced Mod Rewrite + + $arrArtSpecs = getArtSpec(); + + $tmp_inputArtSort = ""; + + if ($iAvariableSpec == 0) + { + $tmp_inputArtSort = i18n("No article specifications found!"); + } + + $tpl->set('s', 'ARTIKELART', i18n("Article specification")); + $tpl->set('s', 'ARTIKELARTSELECT', $tmp_inputArtSort); + + $tpl->set('s', 'TITEL-FIELD', ''); + + // plugin Advanced Mod Rewrite - edit by stese + $tpl->set('s', 'URLNAME-FIELD', ''); + // end plugin Advanced Mod Rewrite + + $tpl->set('s', 'ARTIKELID', "idart"); + $tpl->set('s', 'ARTID', $idart); + + $tpl->set('s', 'DIRECTLINKTEXT', i18n("Articlelink")); + + $select = new cHTMLSelectElement("directlink"); + $select->setEvent("change", "document.getElementById('linkhint').value = this.form.directlink.options[this.form.directlink.options.selectedIndex].value;"); + + $baselink = $cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=$idart"; + + $option[0] = new cHTMLOptionElement( i18n("Select an entry to display link"), ""); + $option[1] = new cHTMLOptionElement( i18n("Article only"), $baselink); + $option[2] = new cHTMLOptionElement( i18n("Article with Category"), $baselink."&idcat=$idcat"); + $option[3] = new cHTMLOptionElement( i18n("Article with Category and Language"), $baselink."&idcat=$idcat&lang=$lang"); + $option[4] = new cHTMLOptionElement( i18n("Article with Language"), $baselink."&lang=$lang"); + + $select->addOptionElement(0, $option[0]); + $select->addOptionElement(1, $option[1]); + $select->addOptionElement(2, $option[2]); + $select->addOptionElement(3, $option[3]); + $select->addOptionElement(4, $option[4]); + + $tpl->set('s', 'DIRECTLINK', $select->render().'

'); + + $tpl->set('s', 'ZUORDNUNGSID', "idcatart"); + $tpl->set('s', 'ALLOCID', $tmp_cat_art); + + /* Author */ + $tpl->set('s', 'AUTHOR_CREATOR', i18n("Author (Creator)")); + $tpl->set('s', 'AUTOR-ERSTELLUNGS-NAME', $classuser->getRealnameByUserName($tmp_author).''.' '); + $tpl->set('s', 'AUTOR-AENDERUNG-NAME', $classuser->getRealnameByUserName($tmp_modifiedby).' '); + + /* Created */ + $tmp_erstellt = ($tmp_firstedit == 1) ? '' : ''; + $tpl->set('s', 'ERSTELLT', i18n("Created")); + $tpl->set('s', 'ERSTELLUNGS-DATUM', $tmp2_created.$tmp_erstellt); + + /* Last modified */ + $tpl->set('s', 'AUTHOR_MODIFIER', i18n("Author (Modifier)")); + $tpl->set('s', 'LETZTE-AENDERUNG', i18n("Last modified")); + $tpl->set('s', 'AENDERUNGS-DATUM', $tmp2_lastmodified.''); + + /* Published */ + $tpl->set('s', 'PUBLISHING_DATE_LABEL', i18n("Publishing date")); + if($tmp_online){ + $tpl->set('s', 'PUBLISHING_DATE', $tmp2_published); + }else{ + $tpl->set('s', 'PUBLISHING_DATE', i18n("not yet published")); + } + + $tpl->set('s', 'PUBLISHER', i18n("Publisher")); + if($classuser->getRealnameByUserName($tmp_publishedby)!=''){ + $tpl->set('s', 'PUBLISHER_NAME', ''.$classuser->getRealnameByUserName($tmp_publishedby)); + }else{ + $tpl->set('s', 'PUBLISHER_NAME', ''.' '); + } + + /* Redirect */ + $tpl->set('s', 'WEITERLEITUNG', i18n("Redirect")); + $tpl->set('s', 'CHECKBOX', ''); + + /* Redirect - URL */ + if ($tmp_redirect_checked != '') + { + $forceDisable = ""; + } else { + $forceDisable = "disabled"; + } + + $tpl->set('s', 'URL', ''); + + /* Redirect - New window */ + if (getEffectiveSetting("articles", "show-new-window-checkbox", "false") == "true") + { + $tpl->set('s', 'CHECKBOX-NEWWINDOW', ''); + } else { + $tpl->set('s', 'CHECKBOX-NEWWINDOW', ' '); + } + + /* Online */ + if ($perm->have_perm_area_action("con", "con_makeonline") || + $perm->have_perm_area_action_item("con","con_makeonline", $idcat)) + { + $tmp_ocheck = ($tmp_online != 1) ? '' : ''; + } else { + $tmp_ocheck = ($tmp_online != 1) ? '' : ''; + } + + $tpl->set('s', 'ONLINE', 'Online'); + $tpl->set('s', 'ONLINE-CHECKBOX', $tmp_ocheck); + + + /* Startartikel */ + if ($perm->have_perm_area_action("con", "con_makestart") || + $perm->have_perm_area_action_item("con","con_makestart", $idcat)) + { + $tmp_start = ($tmp_is_start == 0) ? '' : ''; + } else { + $tmp_start = ($tmp_is_start == 0) ? '' : ''; + } + $tpl->set('s', 'STARTARTIKEL', i18n("Start article")); + $tpl->set('s', 'STARTARTIKEL-CHECKBOX', $tmp_start); + + /* Sortierung */ + $tpl->set('s', 'SORTIERUNG', i18n("Sort key")); + $tpl->set('s', 'SORTIERUNG-FIELD', ''); + + /* Category select */ + + /* Fetch setting */ + $oClient = new cApiClient($client); + $cValue = $oClient->getProperty("system", "multiassign", true); + $sValue = getSystemProperty("system", "multiassign", true); + + $tpl2 = new Template; + $button = ""; + $moveOK = true; + + if ($cValue == false || $sValue == false) + { + $sql = "SELECT idartlang, online FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND online='1' AND idlang != '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + + if ($db->num_rows() > 0) + { + $moveOK = false; + } else { + $moveOK = true; + } + + if ($moveOK == true) + { + if (count(conGetCategoryAssignments($idart)) > 1) + { + /* Old behaviour */ + $tpl2 = new Template; + $tpl2->set('s', 'ID', 'catsel'); + $tpl2->set('s', 'NAME', 'fake[]'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'multiple="multiple" disabled="disabled" size="14" style="width: 400px;scrollbar-face-color:#C6C6D5;scrollbar-highlight-color:#FFFFFF;scrollbar-3dlight-color:#747488;scrollbar-darkshadow-color:#000000;scrollbar-shadow-color:#334F77;scrollbar-arrow-color:#334F77;scrollbar-track-color:#C7C7D6;background:lightgrey;"'); + + $rbutton = new cHTMLButton("removeassignment", i18n("Remove assignments")); + + $boxTitle = i18n("Remove multiple category assignments"); + $boxDescr = i18n("Do you really want to remove the assignments to all categories except the current one?"); + + $rbutton->setEvent("click", 'box.confirm(\''.$boxTitle.'\', \''.$boxDescr.'\', \'removeAssignments('.$idart.', '.$idcat.')\'); return false;'); + $button = "
".$rbutton->render(); + + $moveOK = false; + + } else { + $tpl2 = new Template; + $tpl2->set('s', 'ID', 'catsel'); + $tpl2->set('s', 'NAME', 'idcatnew[]'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'size="14" style="width: 400px;scrollbar-face-color:#C6C6D5;scrollbar-highlight-color:#FFFFFF;scrollbar-3dlight-color:#747488;scrollbar-darkshadow-color:#000000;scrollbar-shadow-color:#334F77;scrollbar-arrow-color:#334F77;scrollbar-track-color:#C7C7D6;"'); + } + } else { + + $note = i18n("Language parts of the articles are existing in other languages and are online. To change the category assignment, please set the other articles offline first."); + $tpl2->set('s', 'ID', 'catsel'); + $tpl2->set('s', 'NAME', 'fake[]'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'multiple="multiple" disabled="disabled" size="14" style="width: 400px;scrollbar-face-color:#C6C6D5;scrollbar-highlight-color:#FFFFFF;scrollbar-3dlight-color:#747488;scrollbar-darkshadow-color:#000000;scrollbar-shadow-color:#334F77;scrollbar-arrow-color:#334F77;scrollbar-track-color:#C7C7D6;background:lightgrey;"'); + } + + + } else { + /* Old behaviour */ + $tpl2->set('s', 'ID', 'catsel'); + $tpl2->set('s', 'NAME', 'idcatnew[]'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'multiple="multiple" '.$disabled.' size="14" style="width: 400px;scrollbar-face-color:#C6C6D5;scrollbar-highlight-color:#FFFFFF;scrollbar-3dlight-color:#747488;scrollbar-darkshadow-color:#000000;scrollbar-shadow-color:#334F77;scrollbar-arrow-color:#334F77;scrollbar-track-color:#C7C7D6;"'); + } + + + if ( isset($tplinputchanged) && $tplinputchanged == 1 ) { + $tmp_idcat_in_art = $idcatnew; + + } else { + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart='".$idart."'"; // get all idcats that contain art + $db->query($sql); + + while ( $db->next_record() ) { + $tmp_idcat_in_art[] = $db->f("idcat"); + } + + if (!is_array($tmp_idcat_in_art)) { + $tmp_idcat_in_art[0] = $idcat; + } + } + + /* Start date */ + if ($tmp_datestart == "0000-00-00 00:00:00") + { + $tpl->set('s', 'STARTDATE', ''); + } else { + $tpl->set('s', 'STARTDATE', $tmp_datestart); + } + + + /* End date */ + if ($tmp_dateend == "0000-00-00 00:00:00") + { + $tpl->set('s', 'ENDDATE',''); + } else { + $tpl->set('s', 'ENDDATE', $tmp_dateend); + } + + $sql = "SELECT + A.idcat, + A.level, + C.name + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B, + ".$cfg["tab"]["cat_lang"]." AS C + WHERE + A.idcat=B.idcat AND + B.idcat=C.idcat AND + C.idlang='".Contenido_Security::toInteger($lang)."' AND + B.idclient='".Contenido_Security::toInteger($client)."' + ORDER BY + A.idtree"; + + $db->query($sql); + + while ( $db->next_record() ) { + + $spaces = ""; + + for ($i = 0; $i < $db->f("level"); $i ++) { + $spaces .= "    "; + } + + if ( !in_array($db->f("idcat"), $tmp_idcat_in_art) ) { + $tpl2->set('d', 'VALUE', $db->f("idcat")); + $tpl2->set('d', 'SELECTED', ''); + $tpl2->set('d', 'CAPTION', $spaces.Contenido_Security::unFilter($db->f("name"))); + + $tpl2->next(); + + } else { + $tpl2->set('d', 'VALUE', $db->f("idcat")); + $tpl2->set('d', 'SELECTED', 'selected="selected"'); + $tpl2->set('d', 'CAPTION', $spaces.Contenido_Security::unFilter($db->f("name"))); + $tpl2->next(); + + if ($moveOK == false) + { + $button .= ''; + } + + } + } + + $select = $tpl2->generate($cfg["path"]["templates"] . $cfg["templates"]["generic_select"], true); + + /* Struktur */ + $tpl->set('s', 'STRUKTUR', i18n("Category")); + $tpl->set('s', 'STRUKTUR-FIELD', $select . $button); + + if (isset($tmp_notification)) { + $tpl->set('s', 'NOTIFICATION', ''.$tmp_notification.'
'); + } else { + $tpl->set('s', 'NOTIFICATION', ''); + } + + if (($perm->have_perm_area_action("con", "con_makeonline") || + $perm->have_perm_area_action_item("con","con_makeonline", $idcat)) && $inUse == false) + { + $allow_usetimemgmt = ''; + $sCalStartInit = ''; + + $sCalEndInit = ''; + + $tpl->set('s', 'CHOOSEEND', ''.i18n('.$sCalEndInit); + $tpl->set('s', 'CHOOSESTART', ''.i18n('.$sCalStartInit); + } else { + $allow_usetimemgmt = ' disabled="disabled"'; + $tpl->set('s', 'CHOOSEEND', ''); + $tpl->set('s', 'CHOOSESTART', ''); + } + + $tpl->set('s', 'SDOPTS', $allow_usetimemgmt); + $tpl->set('s', 'EDOPTS', $allow_usetimemgmt); + + if ($tmp_usetimemgmt == '1') + { + $tpl->set('s','TIMEMGMTCHECKED', 'checked'.$allow_usetimemgmt); + } else { + $tpl->set('s', 'TIMEMGMTCHECKED', $allow_usetimemgmt); + } + + unset ($tpl2); + /* Nach Kategorie Verschieben */ + $tpl2 = new Template; + $tpl2->set('s', 'ID', 'catsel'); + $tpl2->set('s', 'NAME', 'time_target_cat'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'size="1" style="width: 160px;scrollbar-face-color:#C6C6D5;scrollbar-highlight-color:#FFFFFF;scrollbar-3dlight-color:#B3B3B3;scrollbar-darkshadow-color:#000000;scrollbar-shadow-color:#334F77;scrollbar-arrow-color:#334F77;scrollbar-track-color:#C7C7D6;"'.$allow_usetimemgmt); + + $sql = "SELECT + A.idcat, + A.level, + C.name + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B, + ".$cfg["tab"]["cat_lang"]." AS C + WHERE + A.idcat=B.idcat AND + B.idcat=C.idcat AND + C.idlang='".Contenido_Security::toInteger($lang)."' AND + B.idclient='".Contenido_Security::toInteger($client)."' + ORDER BY + A.idtree"; + + $db->query($sql); + + while ( $db->next_record() ) { + + $spaces = ""; + + for ($i = 0; $i < $db->f("level"); $i ++) { + $spaces .= "  "; + } + + if ( $db->f("idcat") != $tmp_targetcat) { + $tpl2->set('d', 'VALUE', $db->f("idcat")); + $tpl2->set('d', 'SELECTED', ''); + $tpl2->set('d', 'CAPTION', $spaces.Contenido_Security::unFilter($db->f("name"))); + + $tpl2->next(); + + } else { + $tpl2->set('d', 'VALUE', $db->f("idcat")); + $tpl2->set('d', 'SELECTED', 'selected="selected"'); + $tpl2->set('d', 'CAPTION', $spaces.Contenido_Security::unFilter($db->f("name"))); + $tpl2->next(); + + } + } + + $select = $tpl2->generate($cfg["path"]["templates"] . $cfg["templates"]["generic_select"], true); + + /* Seitentitel */ + $title_input = ''; + $tpl->set("s", "TITLE-INPUT", $title_input); + + /* Meta-Tags */ + $availableTags = conGetAvailableMetaTagTypes(); + + $sMetaDate = ''; + + foreach ($availableTags as $key => $value) + { + $tpl->set('d', 'METAINPUT', 'META'.$value); + + switch ($value["fieldtype"]) + { + case "text": + if ($value["name"] == 'date') { + $element = ' + '.i18n('.$sMetaDate; + } else { + $element = ''; + } + break; + case "textarea": + $element = ''; + break; + } + + + + $tpl->set('d', 'METAFIELDTYPE', $element); + //$tpl->set('d', 'METAVALUE', conGetMetaValue($tmp_idartlang,$key)); + $tpl->set('d', 'METATITLE', $value["name"].':'); + $tpl->next(); + } + + /* Struktur */ + $tpl->set('s', 'MOVETOCATEGORYSELECT', $select); + + + if ($tmp_movetocat == "1") + { + $tpl->set('s','MOVETOCATCHECKED', 'checked'.$allow_usetimemgmt); + } else { + $tpl->set('s','MOVETOCATCHECKED', ''.$allow_usetimemgmt); + } + + if ($tmp_onlineaftermove == "1") + { + $tpl->set('s', 'ONLINEAFTERMOVECHECKED', 'checked'.$allow_usetimemgmt); + } else { + $tpl->set('s', 'ONLINEAFTERMOVECHECKED', ''.$allow_usetimemgmt); + } + + /* Summary */ + $tpl->set('s', 'SUMMARY', i18n("Summary")); + $tpl->set('s', 'SUMMARY-INPUT', ''); + + $sql = "SELECT + b.idcat + FROM + ".$cfg["tab"]["cat"]." AS a, + ".$cfg["tab"]["cat_lang"]." AS b, + ".$cfg["tab"]["cat_art"]." AS c + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idcat = b.idcat AND + c.idcat = b.idcat AND + c.idart = '".Contenido_Security::toInteger($idart)."'"; + + $db->query($sql); + $db->next_record(); + + $midcat = $db->f("idcat"); + + if ( isset($idart) ) { + + if ( !isset($idartlang) || 0 == $idartlang ) { + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + $idartlang = $db->f("idartlang"); + } + + } + + if ( isset($midcat) ) { + + if ( !isset($idcatlang) || 0 == $idcatlang ) { + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($midcat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $db->next_record(); + $idcatlang = $db->f("idcatlang"); + } + + } + + if ( isset($midcat) && isset($idart) ) { + + if ( !isset($idcatart) || 0 == $idcatart ) { + $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' AND idcat = '".Contenido_Security::toInteger($midcat)."'"; + $db->query($sql); + $db->next_record(); + $idcatart = $db->f("idcatart"); + } + + } + + if ( 0 != $idart && 0 != $midcat ) { + $script = 'artObj.setProperties("'.$idart.'", "'.$idartlang.'", "'.$midcat.'", "'.$idcatlang.'", "'.$idcatart.'", "'.$lang.'");'; + } else { + $script = 'artObj.reset();'; + } + + $tpl->set('s', 'DATAPUSH', $script); + + $tpl->set('s', 'BUTTONDISABLE', $disabled); + + if ($inUse == true) + { + $tpl->set('s', 'BUTTONIMAGE', 'but_ok_off.gif'); + } else { + $tpl->set('s', 'BUTTONIMAGE', 'but_ok.gif'); + } + + $tpl->set('s', 'CAL_LANG', substr(strtolower($belang), 0, 2)); + + /* Genereate the Template */ + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['con_edit_form']); + + } else { + + /* User hat no permission + to see this form */ + $notification->displayNotification("error", i18n("Permission denied")); + + } +} +?> diff --git a/conlite/includes/include.con_editcontent.php b/conlite/includes/include.con_editcontent.php new file mode 100644 index 0000000..1a09ab7 --- /dev/null +++ b/conlite/includes/include.con_editcontent.php @@ -0,0 +1,624 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003 + * modified 2008-06-16, Holger Librenz, Hotfix: check for illegal calls added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-10-29, Murat Purc, replaced deprecated functions (PHP 5.3 ready) and some formatting + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.con_editcontent.php 404 2015-12-15 09:41:16Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$edit = "true"; + +$db2 = new DB_ConLite; +$scripts = ""; + +if (isset($idcat)) { + if ($action == 20 || $action == 10) { + if ($data != "") { + $data = explode("||", substr($data, 0, -2)); + + foreach ($data as $value) { + $value = explode("|", $value); + + if ($value[3] == "%$%EMPTY%$%") { + $value[3] = ""; + } else { + $value[3] = str_replace("%$%SEPERATOR%$%", "|", $value[3]); + } + + conSaveContentEntry($value[0], "CMS_" . $value[1], $value[2], $value[3]); + } + + conMakeArticleIndex($idartlang, $idart); + + // restore orginal values + $data = $_REQUEST['data']; + $value = $_REQUEST['value']; + } + + conGenerateCodeForArtInAllCategories($idart); + } + + if ($action == 10) { + header("Location: " . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["includes"] . "include.backendedit.php?type=$type&typenr=$typenr&client=$client&lang=$lang&idcat=$idcat&idart=$idart&idartlang=$idartlang&contenido=$contenido&lang=$lang"); + } else { + + $markSubItem = markSubMenuItem(3, true); + + //Include tiny class + include ($cfg["path"]["contenido"] . 'external/wysiwyg/tinymce3/editorclass.php'); + $oEditor = new cTinyMCEEditor('', ''); + $oEditor->setToolbar('inline_edit'); + + //Get configuration for popup und inline tiny + $sConfigInlineEdit = $oEditor->getConfigInlineEdit(); + $sConfigFullscreen = $oEditor->getConfigFullscreen(); + + //Include tiny mce and con_tiny script for insight_editing + $scripts .= "\n" . ''; + $scripts .= "\n" . ''; + $scripts .= "\n" . ''; + $scripts .= "\n" . ''; + $scripts .= "\n" . ''; + $scripts .= "\n" . ''; + $scripts .= "\n\n" . ''; + + //Script template for insight editing + $scripts .= << + .defaultSkin table.mceLayout {position: absolute; z-index: 10000;} + .defaultSkin #mce_fullscreen_tbl {z-index: 20000;} + .defaultSkin .mcePlaceHolder {position: absolute; z-index: 10000;} + + + + + +EOD; + + //Replace vars in Script + $oScriptTpl = new Template(); + + //Set urls to file browsers + $oScriptTpl->set('s', 'IMAGE', $cfg["path"]["contenido_fullhtml"] . 'frameset.php?area=upl&contenido=' . $sess->id . '&appendparameters=imagebrowser'); + $oScriptTpl->set('s', 'FILE', $cfg["path"]["contenido_fullhtml"] . 'frameset.php?area=upl&contenido=' . $sess->id . '&appendparameters=filebrowser'); + $oScriptTpl->set('s', 'FLASH', $cfg["path"]["contenido_fullhtml"] . 'frameset.php?area=upl&contenido=' . $sess->id . '&appendparameters=imagebrowser'); + $oScriptTpl->set('s', 'MEDIA', $cfg["path"]["contenido_fullhtml"] . 'frameset.php?area=upl&contenido=' . $sess->id . '&appendparameters=imagebrowser'); + $oScriptTpl->set('s', 'FRONTEND', $cfgClient[$client]["path"]["htmlpath"]); + + //Add tiny options and fill function leave_check() + $oScriptTpl->set('s', 'TINY_OPTIONS', $sConfigInlineEdit); + $oScriptTpl->set('s', 'TINY_FULLSCREEN', $sConfigFullscreen); + $oScriptTpl->set('s', 'IDARTLANG', $idartlang); + $oScriptTpl->set('s', 'CON_PATH', $cfg["path"]["contenido_fullhtml"]); + $oScriptTpl->set('s', 'CLOSE', utf8_decode(i18n('Close editor'))); + $oScriptTpl->set('s', 'SAVE', utf8_decode(i18n('Close editor and save changes'))); + $oScriptTpl->set('s', 'QUESTION', utf8_decode(i18n('Do you want to save changes?'))); + + if (getEffectiveSetting('system', 'insight_editing_activated', 'true') == 'false') { + $oScriptTpl->set('s', 'USE_TINY', ''); + } else { + $oScriptTpl->set('s', 'USE_TINY', 'swapTiny(this);'); + } + + $scripts = $oScriptTpl->generate($scripts, 1); + + $contentform = "url($cfg['path']['contenido_fullhtml'] . "external/backendedit/front_content.php?area=con_editcontent&idart=$idart&idcat=$idcat&lang=$lang&action=20&client=$client") . "\">\n"; + $contentform .= "\n"; + $contentform .= "\n"; + $contentform .= ""; + + # + # extract IDCATART + # + $sql = "SELECT + idcatart + FROM + " . $cfg["tab"]["cat_art"] . " + WHERE + idcat = '" . $idcat . "' AND + idart = '" . $idart . "'"; + + $db->query($sql); + $db->next_record(); + + $idcatart = $db->f("idcatart"); + + # + # Article is not configured, + # if not check if the category + # is configured. It neither the + # article or the category is + # configured, no code will be + # created and an error occurs. + # + + $sql = "SELECT + a.idtplcfg AS idtplcfg + FROM + " . $cfg["tab"]["art_lang"] . " AS a, + " . $cfg["tab"]["art"] . " AS b + WHERE + a.idart = '" . Contenido_Security::toInteger($idart) . "' AND + a.idlang = '" . Contenido_Security::toInteger($lang) . "' AND + b.idart = a.idart AND + b.idclient = '" . Contenido_Security::toInteger($client) . "'"; + + $db->query($sql); + $db->next_record(); + + if ($db->f("idtplcfg") != 0) { + + # + # Article is configured + # + $idtplcfg = $db->f("idtplcfg"); + + $a_c = array(); + + $sql2 = "SELECT + * + FROM + " . $cfg["tab"]["container_conf"] . " + WHERE + idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "' + ORDER BY + number ASC"; + + $db2->query($sql2); + + while ($db2->next_record()) { + $a_c[$db2->f("number")] = $db2->f("container"); + } + } else { + + # + # Check whether category is + # configured. + # + $sql = "SELECT + a.idtplcfg AS idtplcfg + FROM + " . $cfg["tab"]["cat_lang"] . " AS a, + " . $cfg["tab"]["cat"] . " AS b + WHERE + a.idcat = '" . Contenido_Security::toInteger($idcat) . "' AND + a.idlang = '" . Contenido_Security::toInteger($lang) . "' AND + b.idcat = a.idcat AND + b.idclient = '" . Contenido_Security::toInteger($client) . "'"; + + $db->query($sql); + $db->next_record(); + + if ($db->f("idtplcfg") != 0) { + + # + # Category is configured, + # extract varstring + # + $idtplcfg = $db->f("idtplcfg"); + + $a_c = array(); + + $sql2 = "SELECT + * + FROM + " . $cfg["tab"]["container_conf"] . " + WHERE + idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "' + ORDER BY + number ASC"; + + $db2->query($sql2); + + while ($db2->next_record()) { + $a_c[$db2->f("number")] = $db2->f("container"); + } + } else { + + # + # Article nor Category + # is configured. Creation of + # Code is not possible. Write + # Errormsg to DB. + # + include_once ($cfg["path"]["contenido"] . $cfg["path"]["classes"] . "class.notification.php"); + include_once ($cfg["path"]["contenido"] . $cfg["path"]["classes"] . "class.table.php"); + + if (!is_object($notification)) { + $notification = new Contenido_Notification; + } + + $sql = "SELECT title FROM " . $cfg["tab"]["art_lang"] . " WHERE idartlang = '" . Contenido_Security::toInteger($idartlang) . "'"; + $db->query($sql); + $db->next_record(); + $art_name = $db->f("title"); + + $cat_name = ""; + conCreateLocationString($idcat, " / ", $cat_name); + + $sql = "SELECT name FROM " . $cfg["tab"]["lang"] . " WHERE idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + $db->next_record(); + $lang_name = $db->f("name"); + + $sql = "SELECT name FROM " . $cfg["tab"]["clients"] . " WHERE idclient = '" . Contenido_Security::toInteger($client) . "'"; + $db->query($sql); + $db->next_record(); + $client_name = $db->f("name"); + + $noti_html = ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ' . i18n("No template assigned to the category
and/or the article") . '


+ ' . i18n("The code for the following article
couldnt be generated:") . ' +

+
' . i18n("Article") . ':' . $art_name . '
' . i18n("Category") . ':' . $cat_name . '
' . i18n("Language") . ':' . $lang_name . '
' . i18n("Client") . ':' . $client_name . '
 
'; + + $code = ' + + + Error + + + ' . $notification->returnNotification("error", $noti_html) . ' + '; + + $sql = "SELECT * FROM " . $cfg["tab"]["code"] . " WHERE idcatart='" . Contenido_Security::toInteger($idcatart) . "' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + if ($db->next_record()) { + $sql = "UPDATE " . $cfg["tab"]["code"] . " SET code='" . Contenido_Security::escapeDB($code, $db) . "', idlang='" . Contenido_Security::toInteger($lang) . "', idclient='" . Contenido_Security::toInteger($client) . "' + WHERE idcatart='" . Contenido_Security::toInteger($idcatart) . "' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + } else { + $sql = "INSERT INTO " . $cfg["tab"]["code"] . " (idcode, idcatart, code, idlang, idclient) VALUES ('" . Contenido_Security::toInteger($db->nextid($cfg["tab"]["code"])) . "', '" . Contenido_Security::toInteger($idcatart) . "', + '" . Contenido_Security::escapeDB($code, $db) . "', '" . Contenido_Security::toInteger($lang) . "', '" . Contenido_Security::toInteger($client) . "')"; + $db->query($sql); + } + + echo $code; + } + } + + # + # Get IDLAY and IDMOD array + # + $sql = "SELECT + a.idlay AS idlay, + a.idtpl AS idtpl + FROM + " . $cfg["tab"]["tpl"] . " AS a, + " . $cfg["tab"]["tpl_conf"] . " AS b + WHERE + b.idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "' AND + b.idtpl = a.idtpl"; + + $db->query($sql); + $db->next_record(); + + $idlay = $db->f("idlay"); + $idtpl = $db->f("idtpl"); + + # + # List of used modules + # + $sql = "SELECT + number, + idmod + FROM + " . $cfg["tab"]["container"] . " + WHERE + idtpl = '" . Contenido_Security::toInteger($idtpl) . "' + ORDER BY + number ASC"; + + $db->query($sql); + + while ($db->next_record()) { + $a_d[$db->f("number")] = $db->f("idmod"); + } + + # + # Get code from Layout + # + $sql = "SELECT * FROM " . $cfg["tab"]["lay"] . " WHERE idlay = '" . Contenido_Security::toInteger($idlay) . "'"; + + $db->query($sql); + $db->next_record(); + + $code = $db->f("code"); + $code = AddSlashes($code); + + # + # Create code for all containers + # + if ($idlay) { + tplPreparseLayout($idlay); + $tmp_returnstring = tplBrowseLayoutForContainers($idlay); + + $a_container = explode("&", $tmp_returnstring); + + foreach ($a_container as $key => $value) { + + $CiCMS_VALUE = ""; + + if (is_numeric($a_d[$value])) { + $thisModule = ''; + $thisContainer = ''; + } + + $oModule = new cApiModule($a_d[$value]); + + $output = $thisModule . $thisContainer . $oModule->get("output"); + $output = AddSlashes($output); + + $template = $oModule->get("template"); + + if (array_key_exists($value, $a_c)) { + $a_c[$value] = preg_replace("/(&\$)/", "", $a_c[$value]); + $tmp1 = preg_split("/&/", $a_c[$value]); + } else { + $tmp1 = array(); + } + + $varstring = array(); + + foreach ($tmp1 as $key1 => $value1) { + $tmp2 = explode("=", $value1); + foreach ($tmp2 as $key2 => $value2) { + $varstring["$tmp2[0]"] = $tmp2[1]; + } + } + + $CiCMS_Var = '$C' . $value . 'CMS_VALUE'; + $CiCMS_VALUE = ''; + + foreach ($varstring as $key3 => $value3) { + $tmp = urldecode($value3); + $tmp = str_replace("\'", "'", $tmp); + $CiCMS_VALUE .= $CiCMS_Var . '[' . $key3 . ']="' . $tmp . '"; '; + $output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output); + $output = str_replace("CMS_VALUE[$key3]", $tmp, $output); + } + + $output = str_replace("CMS_VALUE", $CiCMS_Var, $output); + $output = str_replace("\$" . $CiCMS_Var, $CiCMS_Var, $output); + + $output = preg_replace('/(CMS_VALUE\[)([0-9]*)(\])/i', '', $output); + + /* Long syntax with closing tag */ + $code = preg_replace("/(.*)<\/container>/Uis", "CMS_CONTAINER[$value]", $code); + + /* Short syntax */ + $code = preg_replace("//i", "CMS_CONTAINER[$value]", $code); + + $code = str_ireplace("CMS_CONTAINER[$value]", "\r\n" . $output, $code); + } + } + + # + # Find out what kind of CMS_... Vars are in use + # + $sql = "SELECT + * + FROM + " . $cfg["tab"]["content"] . " AS A, + " . $cfg["tab"]["art_lang"] . " AS B, + " . $cfg["tab"]["type"] . " AS C + WHERE + A.idtype = C.idtype AND + A.idartlang = B.idartlang AND + B.idart = '" . Contenido_Security::toInteger($idart) . "' AND + B.idlang = '" . Contenido_Security::toInteger($lang) . "'"; + + $db->query($sql); + + while ($db->next_record()) { + $a_content[$db->f("type")][$db->f("typeid")] = $db->f("value"); + } + + $sql = "SELECT idartlang FROM " . $cfg["tab"]["art_lang"] . " WHERE idart='" . Contenido_Security::toInteger($idart) . "' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + + $db->query($sql); + $db->next_record(); + + $idartlang = $db->f("idartlang"); + + # + # Replace all CMS_TAGS[] + # + $sql = "SELECT idtype, type, code FROM " . $cfg["tab"]["type"]; + + $db->query($sql); + + while ($db->next_record()) { + + $tmp = preg_match_all("/(" . $db->f("type") . "\[+\d+\])/i", $code, $match); + $a_[strtolower($db->f("type"))] = $match[0]; + $success = array_walk($a_[strtolower($db->f("type"))], 'extractNumber'); + + $search = array(); + $replacements = array(); + + + foreach ($a_[strtolower($db->f("type"))] as $val) { + eval($db->f("code")); + + $search[$val] = $db->f("type") . "[$val]"; + $replacements[$val] = $tmp; + } + + $code = str_ireplace($search, $replacements, $code); + } + + unset($tmp); + + /* output the code */ + $code = stripslashes($code); + $code = str_ireplace_once("", "$markSubItem $scripts\n", $code); + $code = str_ireplace_once_reverse("", "$contentform", $code); + + if ($cfg["debug"]["codeoutput"]) { + echo ""; + } + + $code = str_ireplace_once("", "\n" . '', $code); + + chdir($cfgClient[$client]["path"]["frontend"]); + ob_start(); + eval("?>\n" . $code . "\n \ No newline at end of file diff --git a/conlite/includes/include.con_left_top.php b/conlite/includes/include.con_left_top.php new file mode 100644 index 0000000..002a271 --- /dev/null +++ b/conlite/includes/include.con_left_top.php @@ -0,0 +1,512 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * @created 2003-03-26 + * @modified 2008-06-27, Frederic Schneider, add security fix + * @modified 2008-09-08, Ingo van Peeren, improved navigation tree in left bottom frame, expanding/ + * collapsing of navigation tree without reloading (AJAX/ + * javascript solution based on jquery) + * @modified 2008-09-18, Ingo van Peeren, moved template-changing to jquery + * @modified 2010-06-16, Timo Trautmann, Fixed a bug wit the Syncselection (there was no right userright check) + * + * $Id: include.con_left_top.php 130 2012-09-13 10:34:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes","functions.str.php"); +cInclude("includes","functions.tpl.php"); +cInclude('includes', 'functions.lang.php'); + +if(!isset($oTpl) || !is_object($oTpl)) { + $oTpl = new Template(); +} +$oTpl->reset(); + +global $sess, $frame, $area; +$idcat = ( isset($_GET['idcat']) && is_numeric($_GET['idcat'])) ? $_GET['idcat'] : -1; + +//Get sync options +if (isset($syncoptions)) +{ + $syncfrom = (int) $syncoptions; + $remakeCatTable = true; +} + +if (!isset($syncfrom)) +{ + $syncfrom = -1; +} + +$syncoptions = $syncfrom; + +$oTpl->set('s', 'SYNC_LANG', $syncfrom); + + +########################################## +# Delete a saved search +########################################## +$bShowArticleSearch = false; +if( isset($_GET['delsavedsearch']) ) +{ + if( isset($_GET['itemtype']) && sizeof($_GET['itemtype'])>0 && isset($_GET['itemid']) && sizeof($_GET['itemid'])>0 ) + { + $propertyCollection = new PropertyCollection; + $propertyCollection->deleteProperties($_GET['itemtype'], $_GET['itemid']); + $bShowArticleSearch = true; + } +} + +if( isset($_GET['save_search']) && $_GET['save_search'] == 'true') { + $bShowArticleSearch = true; +} + + +########################################## +# ARTICLE SEARCH +########################################## +# modified 20/04/2007 by H. Librenz for backend search +$arrDays = array(); + +for ($i = 0; $i < 32; $i ++) { + if ($i == 0) { + $arrDays[$i] = '--'; + } else { + $arrDays[$i] = $i; + } +} + +$arrMonths = array(); + +for ($i = 0; $i < 13; $i++) { + if ($i == 0) { + $arrMonths[$i] = '--'; + } else { + $arrMonths[$i] = $i; + } +} + +$arrYears = array(); + +$arrYears[0] = '-----'; +$sActualYear = (int) date("Y"); + +for ($i = $sActualYear-10; $i < $sActualYear+30; $i++) { + $arrYears[$i] = $i; +} + +$arrUsers = array(); + +$query = "SELECT * FROM ".$cfg['tab']['phplib_auth_user_md5']." ORDER BY realname"; + +$arrUsers['n/a'] = '-'; + +$db->query($query); + +while ($db->next_record()) { + $arrUsers[$db->f('username')] = $db->f('realname'); +} + +$arrDateTypes = array(); + +$arrDateTypes['n/a'] = i18n('Ignore'); +$arrDateTypes['created'] = i18n('Date created'); +$arrDateTypes['lastmodified'] = i18n('Date modified'); +$arrDateTypes['published'] = i18n('Date published'); + +$articleLink="editarticle"; +$oListOptionRow = new cFoldingRow("3498dbba-ed4a-4618-8e49-3a3635396e22", i18n("Article Search"), $articleLink, $bShowArticleSearch); +$oTpl->set('s', 'ARTICLELINK', $articleLink); + +#Textfeld +$oTextboxArtTitle = new cHTMLTextbox("bs_search_text", (isset($_REQUEST["bs_search_text"])?$_REQUEST["bs_search_text"]:''), 10); +$oTextboxArtTitle->setStyle('width:135px;'); + +#Artikel_ID-Feld +$oTextboxArtID = new cHTMLTextbox("bs_search_id", (isset($_REQUEST["bs_search_id"])?$_REQUEST["bs_search_id"]:''), 10); +$oTextboxArtID->setStyle('width:135px;'); + +#Date type +$oSelectArtDateType = new cHTMLSelectElement("bs_search_date_type", "bs_search_date_type"); +$oSelectArtDateType->autoFill($arrDateTypes); +$oSelectArtDateType->setStyle('width:135px;'); +$oSelectArtDateType->setEvent("Change", "toggle_tr_visibility('tr_date_from');toggle_tr_visibility('tr_date_to');"); + +if (isset($_REQUEST["bs_search_date_type"]) && $_REQUEST["bs_search_date_type"] !='') { + $oSelectArtDateType->setDefault($_REQUEST["bs_search_date_type"]); +} else { + $oSelectArtDateType->setDefault('n/a'); +} + +#DateFrom +$oSelectArtDateFromDay = new cHTMLSelectElement("bs_search_date_from_day"); +$oSelectArtDateFromDay->setStyle('width:40px;'); +$oSelectArtDateFromDay->autoFill($arrDays); + +$oSelectArtDateFromMonth = new cHTMLSelectElement("bs_search_date_from_month"); +$oSelectArtDateFromMonth->setStyle('width:40px;'); +$oSelectArtDateFromMonth->autoFill($arrMonths); + +$oSelectArtDateFromYear = new cHTMLSelectElement("bs_search_date_from_year"); +$oSelectArtDateFromYear->setStyle('width:55px;'); +$oSelectArtDateFromYear->autoFill($arrYears); + +if (isset($_REQUEST["bs_search_date_from_day"]) && $_REQUEST["bs_search_date_from_day"] > 0) { + $oSelectArtDateFromDay->setDefault($_REQUEST["bs_search_date_from_day"]); +} else { + $oSelectArtDateFromDay->setDefault(0); +} + +if (isset($_REQUEST["bs_search_date_from_month"]) && $_REQUEST["bs_search_date_from_month"] > 0) { + $oSelectArtDateFromMonth->setDefault($_REQUEST["bs_search_date_from_month"]); +} else { + $oSelectArtDateFromMonth->setDefault(0); +} + +if (isset($_REQUEST["bs_search_date_from_year"]) && $_REQUEST["bs_search_date_from_year"] > 0) { + $oSelectArtDateFromYear->setDefault($_REQUEST["bs_search_date_from_year"]); +} else { + $oSelectArtDateFromYear->setDefault(0); +} + +#DateTo +$oSelectArtDateToDay = new cHTMLSelectElement("bs_search_date_to_day"); +$oSelectArtDateToDay->setStyle('width:40px;'); +$oSelectArtDateToDay->autoFill($arrDays); + +$oSelectArtDateToMonth = new cHTMLSelectElement("bs_search_date_to_month"); +$oSelectArtDateToMonth->setStyle('width:40px;'); +$oSelectArtDateToMonth->autoFill($arrMonths); + +$oSelectArtDateToYear = new cHTMLSelectElement("bs_search_date_to_year"); +$oSelectArtDateToYear->setStyle('width:55px;'); +$oSelectArtDateToYear->autoFill($arrYears); + +if (isset($_REQUEST["bs_search_date_to_day"]) && $_REQUEST["bs_search_date_to_day"] > 0) { + $oSelectArtDateToDay->setDefault($_REQUEST["bs_search_date_to_day"]); +} else { + $oSelectArtDateToDay->setDefault(0); +} + +if (isset($_REQUEST["bs_search_date_to_month"]) && $_REQUEST["bs_search_date_to_month"] > 0) { + $oSelectArtDateToMonth->setDefault($_REQUEST["bs_search_date_to_month"]); +} else { + $oSelectArtDateToMonth->setDefault(0); +} + +if (isset($_REQUEST["bs_search_date_to_year"]) && $_REQUEST["bs_search_date_to_year"] > 0) { + $oSelectArtDateToYear->setDefault($_REQUEST["bs_search_date_to_year"]); +} else { + $oSelectArtDateToYear->setDefault(0); +} + +#Author +$oSelectArtAuthor = new cHTMLSelectElement("bs_search_author"); +$oSelectArtAuthor->setStyle('width:135px;'); +$oSelectArtAuthor->autoFill($arrUsers); + +if (isset($_REQUEST["bs_search_author"]) && $_REQUEST["bs_search_author"] !='') { + $oSelectArtAuthor->setDefault($_REQUEST["bs_search_author"]); +} else { + $oSelectArtAuthor->setDefault('n/a'); +} + +$oSubmit = new cHTMLButton("submit", i18n("Search")); + +$content = '
'; +$content .= ''; + +/** + * Saved searches + */ +$content .= ''; +$content .= '
'; + +$oListOptionRow->setContentData($content); + +$sSelfLink = 'main.php?area=' . $area . '&frame=2&' . $sess->name . "=" . $sess->id; +$oTpl->set('s', 'SELFLINK', $sSelfLink); + +$oTpl->set('s', 'SEARCH', $oListOptionRow->render()); + +########################################## +# Category +########################################## +$sql = "SELECT + idtpl, + name + FROM + ".$cfg['tab']['tpl']." + WHERE + idclient = '".Contenido_Security::toInteger($client)."' + ORDER BY + name"; + +$db->query($sql); + +$oTpl->set('s', 'ID', 'oTplSel'); +$oTpl->set('s', 'CLASS', 'text_medium'); +$oTpl->set('s', 'OPTIONS', ''); +$oTpl->set('s', 'SESSID', $sess->id); +$oTpl->set('s', 'BELANG', $belang); + +$oTpl->set('d', 'VALUE', '0'); +$oTpl->set('d', 'CAPTION', i18n("Choose template")); +$oTpl->set('d', 'SELECTED', ''); +$oTpl->next(); + +$oTpl->set('d', 'VALUE', '0'); +$oTpl->set('d', 'CAPTION', '--- '. i18n("none"). ' ---'); +$oTpl->set('d', 'SELECTED', ''); +$oTpl->next(); + +$categoryLink="editcat"; +$editCategory = new cFoldingRow("3498dbbb-ed4a-4618-8e49-3a3635396e22", i18n("Edit Category"), $categoryLink); + +while ($db->next_record()) { + $oTplname = $db->f('name'); + + if (strlen($oTplname) > 18) + { + $oTplname = substr($oTplname, 0, 15) . "..."; + } + $oTpl->set('d', 'VALUE', $db->f('idtpl')); + $oTpl->set('d', 'CAPTION', $oTplname); + $oTpl->set('d', 'SELECTED', ''); + $oTpl->next(); +} +// Template Dropdown +$editCat = '
'; +$editCat .= i18n("Template:") . "
"; +$editCat .= '
'; +$editCat .= $oTpl->generate($cfg['path']['templates'] . $cfg['templates']['generic_select'], true); +$editCat .='
'; +$editCat .= '
'; +// Category +$editCat .= '
'; +$oTpl->set('s', 'CAT_HREF', $sess->url("main.php?area=con_tplcfg&action=tplcfg_edit&frame=4&mode=art").'&idcat='); +$oTpl->set('s', 'IDCAT', $idcat); +$editCat .= ''; +// Online / Offline +$editCat .= ''; +// Lock / Unlock +$editCat .= '
'.i18n('; +$editCat .= ''.i18n("Lock / Unlock").'
'; +$editCat .= '
'; +$editCat .= '
'; +$editCat .= '
'; + +$editCategory->setContentData($editCat); + +$oTpl->set('s', 'EDIT', $editCategory->render()); +$oTpl->set('s', 'CATEGORYLINK', $categoryLink); + + +##################################### +# Collapse / Expand / Config Category +##################################### +$selflink = "main.php"; +$expandlink = $sess->url($selflink . "?area=$area&frame=2&expand=all"); +$collapselink = $sess->url($selflink . "?area=$area&frame=2&collapse=all"); +$collapseimg = ' '.i18n("close all").''; +$expandimg = ' '.i18n("open all").''; +$oTpl->set('s', 'MINUS', $collapseimg); +$oTpl->set('s', 'PLUS', $expandimg); + +/**************/ +/* SYNCSTUFF */ +/**************/ +$languages = getLanguageNamesByClient($client); +if (count($languages) > 1 && $perm->have_perm_area_action($area, "con_synccat")) { + $sListId = 'sync'; + $oListOptionRow = new cFoldingRow("4808dbba-ed4a-4618-8e49-3a3635396e22", i18n("Synchronize from"), $sListId); + + if (($syncoptions > 0) && ($syncoptions != $lang)) { + $oListOptionRow->setExpanded (true); + } + + #'dir="' . langGetTextDirection($lang) . '"'); + + $selectbox = new cHTMLSelectElement("syncoptions"); + + $option = new cHTMLOptionElement("--- ".i18n("None")." ---", -1); + $selectbox->addOptionElement(-1, $option); + + foreach ($languages as $languageid => $languagename) + { + if ($lang != $languageid && $perm->have_perm_client_lang($client, $languageid)) + { + $option = new cHTMLOptionElement($languagename . " (".$languageid.")",$languageid); + $selectbox->addOptionElement($languageid, $option); + } + } + + $selectbox->setDefault($syncoptions); + $form = new UI_Form("syncfrom"); + $form->setVar("area",$area); + $form->setVar("frame", $frame); + $form->add("sel", $selectbox->render()); + $link = $sess->url("main.php?area=".$area."&frame=2").'&syncoptions='; + $sJsLink = 'conMultiLink(\'left_bottom\', \''.$link.'\'+document.getElementsByName(\'syncoptions\')[0].value+\'&refresh_syncoptions=true\');'; + $oTpl->set('s', 'UPDATE_SYNC_REFRESH_FRAMES', $sJsLink); + + $form->add("submit", ''); + + $sSyncButton = ''; + $sSyncButtonMultiple = ''; + + $content = ' + + + + + + +
'.$form->render().'
'.$sSyncButton.$sSyncButtonMultiple.'
'; + + $oListOptionRow->setContentData($content); + + $oTpl->set('s', 'SYNCRONIZATION',$oListOptionRow->render()); + $oTpl->set('s', 'SYNCLINK', $sListId); + $sSyncLink = $sess->url($selflink . "?area=$area&frame=2&action=con_synccat"); + $oTpl->set('s', 'SYNC_HREF', $sSyncLink); + +} else { + $oTpl->set('s', 'SYNCRONIZATION',''); + $oTpl->set('s', 'SYNCLINK',$sListId); + $oTpl->set('s', 'SYNC_HREF', ''); +} + +/* + * necessary for expanding/collapsing of navigation tree per javascript/AJAX (I. van Peeren) + */ +$oTpl->set('s', 'AREA', $area); +$oTpl->set('s', 'SESSION', $contenido); +$oTpl->set('s', 'AJAXURL', $cfg['path']['contenido_fullhtml'].'ajaxmain.php'); + +########################################## +# Help +########################################## +$oTpl->set('s', 'HELPSCRIPT', setHelpContext("con")); +$oTpl->generate($cfg['path']['templates'] . $cfg['templates']['con_left_top']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.con_str_overview.php b/conlite/includes/include.con_str_overview.php new file mode 100644 index 0000000..3e265e9 --- /dev/null +++ b/conlite/includes/include.con_str_overview.php @@ -0,0 +1,770 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-03-02 + * modified 2007-04-24, Holger Librenz + * modified 2008-02-13, Andreas Lindner + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-09-08, Ingo van Peeren, optimized HTML, added AJAX an javascript to prevent + * reloading of navigation tree, small sql performance + * improvement + * modified 2009-12-18, Murat Purc, fixed usage of wrong db instance, see [#CON-282] + * modified 2010-01-30, Ingo van Peeren, optimized amount of db queries, removed unused variables + * + * $Id: include.con_str_overview.php 327 2015-06-11 14:07:00Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.str.php"); +cInclude("includes", "functions.tpl.php"); +cInclude('includes', 'functions.lang.php'); + +function showTree($iIdcat, &$aWholelist) { + global $check_global_rights, $sess, $cfg, $perm, $db, $db2, $db3, $area, $client, $lang, $navigationTree; + + $tpl = new Template; + $tpl->reset(); + + $iIdcat = (int) $iIdcat; + + foreach ($navigationTree[$iIdcat] as $sKey => $aValue) { + + $cfgdata = ''; + $aCssClasses = array(); + + #Check rights per cat + if (!$check_global_rights) { + $check_rights = false; + } else { + $check_rights = true; + } + + if (!$check_rights) { + $check_rights = ($aValue['forcedisplay'] == 1) ? true : false; + } + + $idcat = (int) $aValue['idcat']; + $level = $aValue['level'] - 1; + $name = $aValue['name']; + + if ($check_rights) { + + $idtpl = ( $aValue['idtpl'] != '' ) ? $aValue['idtpl'] : 0; + + if (($aValue["idlang"] != $lang) || ($aValue['articles'] == true)) { + #$aCssClasses[] = 'con_sync'; + } + + $check_rights = $perm->have_perm_area_action_item("con", "con_changetemplate", $aValue['idcat']); + if (!$check_rights) { + $check_rights = $perm->have_perm_area_action("con", "con_changetemplate"); + } + + if ($check_rights) { + $changetemplate = 1; + } else { + $changetemplate = 0; + } + + $check_rights = $perm->have_perm_area_action_item("con", "con_makecatonline", $aValue['idcat']); + if (!$check_rights) { + $check_rights = $perm->have_perm_area_action("con", "con_makecatonline"); + } + + if ($check_rights) { + $onoffline = 1; + } else { + $onoffline = 0; + } + + + $check_rights = $perm->have_perm_area_action_item("con", "con_makepublic", $aValue['idcat']); + if (!$check_rights) { + $check_rights = $perm->have_perm_area_action("con", "con_makepublic"); + } + + if ($check_rights) { + $makepublic = 1; + } else { + $makepublic = 0; + } + + $check_rights = $perm->have_perm_area_action_item("con", "con_tplcfg_edit", $aValue['idcat']); + if (!$check_rights) { + $check_rights = $perm->have_perm_area_action("con", "con_tplcfg_edit"); + } + + if ($check_rights) { + $templateconfig = 1; + } else { + $templateconfig = 0; + } + + if ($aValue["idlang"] == $lang) { + # Build cfgdata string + $cfgdata = $idcat . "-" . $idtpl . "-" . $aValue['online'] . "-" . $aValue['public'] . "-" . + $changetemplate . "-" . + $onoffline . "-" . + $makepublic . "-" . $templateconfig; + } else { + $cfgdata = ""; + } + + # Select the appropriate folder- + # image depending on the structure + # properties + + if ($aValue['online'] == 1) { + # Category is online + + if ($aValue['public'] == 0) { + # Category is locked + if ($aValue['no_start'] || $aValue['no_online']) { + # Error found + $aAnchorClass = 'on_error_locked'; + } else { + # No error found + $aAnchorClass = 'on_locked'; + } + } else { + # Category is public + if ($aValue['no_start'] || $aValue['no_online']) { + # Error found + $aAnchorClass = 'on_error'; + } else { + # No error found + $aAnchorClass = 'on'; + } + } + } else { + # Category is offline + + if ($aValue['public'] == 0) { + # Category is locked + if ($aValue['no_start'] || $aValue['no_online']) { + # Error found + $aAnchorClass = 'off_error_locked'; + } else { + # No error found + $aAnchorClass = 'off_locked'; + } + } else { + # Category is public + if ($aValue['no_start'] || $aValue['no_online']) { + # Error found + $aAnchorClass = 'off_error'; + } else { + # No error found + $aAnchorClass = 'off'; + } + } + } + + if ($aValue['islast'] == 1) { + $aCssClasses[] = 'last'; + } + + if ($aValue['collapsed'] == 1 && isset($navigationTree[$idcat]) && is_array($navigationTree[$idcat])) { + $aCssClasses[] = 'collapsed'; + } + + if ($aValue['active']) { + $aCssClasses[] = 'active'; + } + + $bIsSyncable = false; + if ($aValue["idlang"] != $lang) { + # Fetch parent id and check if it is syncronized + $sql = "SELECT parentid FROM %s WHERE idcat = '%s'"; + $db->query(sprintf($sql, $cfg["tab"]["cat"], $idcat)); + if ($db->next_record()) { + if ($db->f("parentid") != 0) { + $parentid = $db->f("parentid"); + $sql = "SELECT idcatlang FROM %s WHERE idcat = '%s' AND idlang = '%s'"; + $db->query(sprintf($sql, $cfg["tab"]["cat_lang"], Contenido_Security::toInteger($parentid), Contenido_Security::toInteger($lang))); + + if ($db->next_record()) { + $aCssClasses[] = 'con_sync'; + $bIsSyncable = true; + } + } else { + $aCssClasses[] = 'con_sync'; + $bIsSyncable = true; + } + } + } + + //Last param defines if cat is syncable or not, all other rights are disabled at this point + if ($bIsSyncable) { + if ($cfgdata != '') { + $cfgdata .= '-1'; + } else { + $cfgdata = $idcat . "-" . $idtpl . "-" . $aValue['online'] . "-" . $aValue['public'] . + "-0-0-0-0-1"; + } + } else { + if ($cfgdata != '') { + $cfgdata .= '-0'; + } else { + $cfgdata = $idcat . "-" . $idtpl . "-" . $aValue['online'] . "-" . $aValue['public'] . + "-0-0-0-0-0"; + } + } + + if(isset($aValue['lang_fallback_name']) && !empty($aValue['lang_fallback_name'])) { + $titel = $aValue['lang_fallback_name']."\nidcat".': '. $idcat; + } else { + $title = "idcat".': '. $idcat; + } + + $mstr = '' . $name . ''; + + # Build Tree + $tpl->set('d', 'CFGDATA', $cfgdata); + if (isset($navigationTree[$idcat]) && is_array($navigationTree[$idcat])) { + $tpl->set('d', 'SUBCATS', showTree($idcat, $aWholelist)); + $tpl->set('d', 'COLLAPSE', ' '); + $aWholelist[] = $idcat; + } else { + $tpl->set('d', 'SUBCATS', ''); + $tpl->set('d', 'COLLAPSE', ' '); + } + $tpl->set('d', 'CAT', $mstr); + $tpl->set('d', 'CSS_CLASS', ' class="' . implode(' ', $aCssClasses) . '"'); + + $tpl->next(); + } // end if have_perm + else { + if (is_array($navigationTree[(int) $aValue['idcat']])) { + $sTpl = showTree((int) $aValue['idcat'], $aWholelist); + if (!preg_match('/^
    \s*<\/ul>$/', $sTpl)) { + $tpl->set('d', 'CFGDATA', '0-0-0-0-0-0-0-0-0'); + $tpl->set('d', 'SUBCATS', $sTpl); + $tpl->set('d', 'COLLAPSE', ''); + $tpl->set('d', 'CAT', '' . $name . ''); + $tpl->set('d', 'CSS_CLASS', ' class="active"'); + $tpl->next(); + } + $aWholelist[] = $aValue['idcat']; + } + } + } + return $tpl->generate($cfg['path']['templates'] . 'template.con_str_overview.list.html', 1); +} + +$db2 = new DB_ConLite; +$db3 = new DB_ConLite; + +//Refresh or reset right frames, when a synclang is changed or a category is synchronized +$tpl->reset(); + +if ($action == "con_synccat" || isset($_GET['refresh_syncoptions']) && $_GET['refresh_syncoptions'] == 'true') { + $tpl->set('s', 'RELOAD_RIGHT', 'reloadRightFrame();'); +} else { + $tpl->set('s', 'RELOAD_RIGHT', ''); +} + +if ($action == "con_synccat") { + strSyncCategory($syncidcat, $syncfromlang, $lang, $multiple); + $remakeStrTable = true; +} + +if (!is_object($db2)) + $db2 = new DB_ConLite; + +if (!isset($remakeStrTable)) { + $remakeStrTable = false; +} + +if (!isset($remakeCatTable)) { + $remakeCatTable = false; +} + +$sess->register("remakeCatTable"); +$sess->register("CatTableClient"); +$sess->register("CatTableLang"); +$sess->register("remakeStrTable"); + +if (isset($syncoptions)) { + $syncfrom = $syncoptions; + $remakeCatTable = true; +} + +if (!isset($syncfrom)) { + $syncfrom = 0; +} + +$sess->register("syncfrom"); + +$syncoptions = $syncfrom; + +if (!isset($CatTableClient)) { + $CatTableClient = 0; +} + +if ($CatTableClient != $client) { + $remakeCatTable = true; +} + +if (!isset($CatTableLang)) { + $CatTableLang = 0; +} + +if ($CatTableLang != $lang) { + $remakeCatTable = true; +} + +$CatTableClient = $client; +$CatTableLang = $lang; + +if ($syncoptions == -1) { + $sql = "SELECT + a.preid AS preid, + a.postid AS postid, + a.parentid AS parentid, + c.idcat AS idcat, + c.level AS level, + b.name AS name, + b.public AS public, + b.visible AS online, + d.idtpl AS idtpl, + b.idlang AS idlang + FROM + (" . $cfg["tab"]["cat"] . " AS a, + " . $cfg["tab"]["cat_lang"] . " AS b, + " . $cfg["tab"]["cat_tree"] . " AS c) + LEFT JOIN + " . $cfg["tab"]["tpl_conf"] . " AS d + ON d.idtplcfg = b.idtplcfg + WHERE + a.idclient = '" . Contenido_Security::toInteger($client) . "' AND + b.idlang = '" . Contenido_Security::toInteger($lang) . "' AND + c.idcat = b.idcat AND + b.idcat = a.idcat + ORDER BY + c.idtree ASC"; +} else { + $sql = "SELECT + a.preid AS preid, + a.postid AS postid, + a.parentid AS parentid, + c.idcat AS idcat, + c.level AS level, + b.name AS name, + b.public AS public, + b.visible AS online, + d.idtpl AS idtpl, + b.idlang AS idlang + FROM + (" . $cfg["tab"]["cat"] . " AS a, + " . $cfg["tab"]["cat_lang"] . " AS b, + " . $cfg["tab"]["cat_tree"] . " AS c) + LEFT JOIN + " . $cfg["tab"]["tpl_conf"] . " AS d + ON d.idtplcfg = b.idtplcfg + WHERE + a.idclient = '" . Contenido_Security::toInteger($client) . "' AND + (b.idlang = '" . Contenido_Security::toInteger($lang) . "' OR + b.idlang = '" . Contenido_Security::toInteger($syncoptions) . "') AND + c.idcat = b.idcat AND + b.idcat = a.idcat + ORDER BY + c.idtree ASC"; +} + +$db->query($sql); + +if (isset($syncoptions)) { + $remakeCatTable = true; +} + +if (isset($online)) { + $remakeCatTable = true; +} + +if (isset($public)) { + $remakeCatTable = true; +} + +if (isset($idtpl)) { + $remakeCatTable = true; +} + +if (isset($force)) { + $remakeCatTable = true; +} + +$arrIn = array(); +while ($db->next_record()) { + $arrIn[] = $db->f('idcat'); +} + +$arrArtCache = array(); + +if (count($arrIn) > 0) { + $sIn = implode(',', $arrIn); + + $sql2 = "SELECT b.idcat, a.idart, idlang FROM " . $cfg["tab"]["art_lang"] . " AS a, + " . $cfg["tab"]["cat_art"] . " AS b + WHERE b.idcat IN (" . Contenido_Security::escapeDB($sIn, $db) . ") AND (a.idlang = '" . Contenido_Security::toInteger($syncoptions) . "' OR a.idlang = '" . Contenido_Security::toInteger($lang) . "') + AND b.idart = a.idart"; + $db->query($sql2); + + while ($db->next_record()) { + $arrArtCache[$db->f('idcat')][$db->f('idart')][$db->f('idlang')] = 'x'; + } +} + +$db->query($sql); + +while ($db->next_record()) { + $entry = array(); + + $entry['articles'] = false; + + if ($db->f("idlang") == $lang) { + + $arts = Array(); + + if (isset($arrArtCache[$db->f("idcat")])) { + foreach ($arrArtCache[$db->f("idcat")] as $key => $value) { + foreach ($value as $key2 => $value2) { + $arts[$key][$key2] = 1; + } + } + } + + foreach ($arts as $idart => $entry) { + if (is_array($entry)) { + if (!array_key_exists($lang, $entry)) { + //$entry['articles'] = true; + $aIsArticles[$db->f("idcat")] = true; + break; + } + } + } + } +} + +if ($syncoptions == -1) { + if ($cfg["is_start_compatible"] == true) { + $sql2 = "SELECT + c.idcat AS idcat, + SUM(c.is_start) AS is_start, + SUM(a.online) AS online + FROM + " . $cfg["tab"]["art_lang"] . " AS a, + " . $cfg["tab"]["art"] . " AS b, + " . $cfg["tab"]["cat_art"] . " AS c + WHERE + a.idlang = " . Contenido_Security::toInteger($lang) . " AND + a.idart = b.idart AND + b.idclient = '" . Contenido_Security::toInteger($client) . "' AND + b.idart = c.idart + GROUP BY c.idcat + "; + } else { + $sql2 = "SELECT + c.idcat AS idcat, + SUM(a.online) AS online, + d.startidartlang + FROM + " . $cfg["tab"]["art_lang"] . " AS a, + " . $cfg["tab"]["art"] . " AS b, + " . $cfg["tab"]["cat_art"] . " AS c, + " . $cfg["tab"]["cat_lang"] . " AS d + WHERE + a.idlang = " . Contenido_Security::toInteger($lang) . " AND + a.idart = b.idart AND + b.idclient = '" . Contenido_Security::toInteger($client) . "' AND + b.idart = c.idart AND + c.idcat = d.idcat + GROUP BY c.idcat + "; + } +} else { + if ($cfg["is_start_compatible"] == true) { + $sql2 = "SELECT + c.idcat AS idcat, + SUM(c.is_start) AS is_start, + SUM(a.online) AS online + FROM + " . $cfg["tab"]["art_lang"] . " AS a, + " . $cfg["tab"]["art"] . " AS b, + " . $cfg["tab"]["cat_art"] . " AS c + WHERE + a.idart = b.idart AND + b.idclient = '" . Contenido_Security::toInteger($client) . "' AND + b.idart = c.idart + GROUP BY c.idcat"; + } else { + $sql2 = "SELECT + c.idcat AS idcat, + SUM(a.online) AS online, + d.startidartlang + FROM + " . $cfg["tab"]["art_lang"] . " AS a, + " . $cfg["tab"]["art"] . " AS b, + " . $cfg["tab"]["cat_art"] . " AS c, + " . $cfg["tab"]["cat_lang"] . " AS d + WHERE + a.idart = b.idart AND + b.idclient = '" . Contenido_Security::toInteger($client) . "' AND + b.idart = c.idart AND + c.idcat = d.idcat + GROUP BY c.idcat"; + } +} + +$db->query($sql2); +$aStartOnlineArticles = array(); +while ($db->next_record()) { + if ($cfg["is_start_compatible"] == true) { + if ($db->f('is_start') > 0) { + $aStartOnlineArticles[$db->f('idcat')]['is_start'] = true; + } else { + $aStartOnlineArticles[$db->f('idcat')]['is_start'] = false; + } + } else { + if ($db->f('startidartlang') > 0) { + $aStartOnlineArticles[$db->f('idcat')]['is_start'] = true; + } else { + $aStartOnlineArticles[$db->f('idcat')]['is_start'] = false; + } + } + if ($db->f('online') > 0) { + $aStartOnlineArticles[$db->f('idcat')]['is_online'] = true; + } else { + $aStartOnlineArticles[$db->f('idcat')]['is_online'] = false; + } +} + +$_cecIterator = $_cecRegistry->getIterator("Contenido.ArticleCategoryList.ListItems"); + +if ($_cecIterator->count() > 0) { + while ($chainEntry = $_cecIterator->next()) { + $listItem = $chainEntry->execute(); + + if (is_array($listItem)) { + if (!array_key_exists("expandcollapseimage", $listItem) || $listItem["expandcollapseimage"] == "") { + $collapseImage = ''; + } else { + $collapseImage = $listItem["expandcollapseimage"]; + } + + if (!array_key_exists("image", $listItem) || $listItem["image"] == "") { + $image = ''; + } else { + $image = $listItem["image"]; + } + + if (!array_key_exists("id", $listItem) || $listItem["id"] == "") { + $id = rand(); + } else { + $id = $listItem["id"]; + } + + if (array_key_exists("markable", $listItem)) { + if ($listItem["markable"] == true) { + $mmark = $markscript; + } else { + $mmark = ""; + } + } else { + $mmark = ""; + } + } + } +} + +$languages = getLanguageNamesByClient($client); + +/* * *************************** */ +/* Expand all / Collapse all */ +/* * *************************** */ +$selflink = "main.php"; +$expandlink = $sess->url($selflink . "?area=$area&frame=$frame&expand=all&syncoptions=$syncoptions"); +$collapselink = $sess->url($selflink . "?area=$area&frame=$frame&collapse=all&syncoptions=$syncoptions"); +$collapseimg = ''; +$expandimg = ''; +$allLinks = $expandimg . '' . $collapseimg; +$text_direction = langGetTextDirection($lang); + +#Check global rights +$check_global_rights = $perm->have_perm_area_action("con", "con_makestart"); +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con_editart", "con_edit"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con_editart", "con_saveart"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con_editcontent", "con_editart"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con_editart", "con_newart"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con", "con_deleteart"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con", "con_makeonline"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con", "con_tplcfg_edit"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con", "con_makecatonline"); +} +if (!$check_global_rights) { + $check_global_rights = $perm->have_perm_area_action("con", "con_changetemplate"); +} + +if ($lang > $syncoptions) { + $sOrder = 'DESC'; +} else { + $sOrder = 'ASC'; +} + +// alternate lang fallback, shows translation for cat with defined fallback lang +// wish by rethus for con49, see con forum http://forum.contenido.org/viewtopic.php?f=92&t=35247 +$fallbackLang = getEffectiveSetting('system', 'cat_fallback_language', 0); +$bUseLangFallback = FALSE; +if($fallbackLang > 0) { + $bUseLangFallback = TRUE; + $sql_fallback_lang_field = "b1.name as lang_fallback_name, "; + $sql_fallback_lang_join = "LEFT JOIN {$cfg['tab']['cat_lang']} AS b1 ON( b1.idcat=a.idcat AND b1.idlang=$fallbackLang ) "; +} else { + $sql_fallback_lang_field = ""; + $sql_fallback_lang_join = ""; +} + +$client = (int) $client; +$sql = "SELECT DISTINCT " . + "a.idcat, " . + "a.parentid, " . + "a.preid, " . + "a.postid, " . + "a.parentid, " . + "b.name, " . + "b.idlang, " . + "b.visible, " . + "b.public, " . + "c.level, " . + "d.idtpl " . + $sql_fallback_lang_field. + "FROM {$cfg['tab']['cat']} AS a " . + "LEFT JOIN {$cfg['tab']['cat_lang']} AS b ON a.idcat = b.idcat " . + $sql_fallback_lang_join. + "LEFT JOIN {$cfg['tab']['cat_tree']} AS c ON (a.idcat = c.idcat AND b.idcat = c.idcat) " . + "LEFT JOIN {$cfg["tab"]["tpl_conf"]} AS d ON b.idtplcfg = d.idtplcfg " . + "WHERE " . + " a.idclient = {$client} " . + "ORDER BY b.idlang {$sOrder}, c.idtree ASC "; +$db->query($sql); +if ($client == 0) { + $client = ''; +} + +$navigationTree = array(); +$aWholelist = array(); +$conexpandedList = array(); +$sExpandList = $currentuser->getUserProperty("system", "con_cat_expandstate"); +if ($sExpandList != '') { + $conexpandedList = unserialize($currentuser->getUserProperty("system", "con_cat_expandstate")); +} + +while ($db->next_record()) { + if (!isset($navigationTree[$db->f('parentid')][$db->f('idcat')]) && ($db->f('idlang') == $lang || $db->f('idlang') == $syncoptions)) { + if (in_array($db->f('idcat'), $conexpandedList)) { + $collapsed = false; + } else { + $collapsed = true; + } + if ($perm->have_perm_item("con", $db->f('idcat'))) { + $forcedisplay = 1; + } else { + $forcedisplay = 0; + } + if ($idcat == $db->f('idcat')) { + $active = true; + } else { + $active = false; + } + $navigationTree[$db->f('parentid')][$db->f('idcat')] = array( + 'idcat' => $db->f('idcat'), + 'preid' => $db->f('preid'), + 'postid' => $db->f('postid'), + 'visible' => $db->f('visible'), + 'online' => $db->f('visible'), + 'public' => $db->f('public'), + 'name' => $db->f('name'), + 'lang_fallback_name' => (($bUseLangFallback)?$db->f('lang_fallback_name'):''), + 'idlang' => $db->f('idlang'), + 'idtpl' => $db->f('idtpl'), + 'collapsed' => $collapsed, + 'forcedisplay' => $forcedisplay, + 'active' => $active, + 'islast' => false, + 'articles' => ((isset($aIsArticles)) ? $aIsArticles[$db->f("idcat")] : ''), + 'level' => $db->f('level') + ); + if (isset($aStartOnlineArticles[$db->f('idcat')]['is_start']) && $aStartOnlineArticles[$db->f('idcat')]['is_start'] == true) { + $navigationTree[$db->f('parentid')][$db->f('idcat')]['no_start'] = false; + } else { + $navigationTree[$db->f('parentid')][$db->f('idcat')]['no_start'] = true; + } + if (isset($aStartOnlineArticles[$db->f('idcat')]['is_online']) && $aStartOnlineArticles[$db->f('idcat')]['is_online'] == true) { + $navigationTree[$db->f('parentid')][$db->f('idcat')]['no_online'] = false; + } else { + $navigationTree[$db->f('parentid')][$db->f('idcat')]['no_online'] = true; + } + } +} + +if (isset($bDebug) && $bDebug === true) { + echo '
    ';
    +    var_dump($navigationTree);
    +    echo '
    '; +} +if (count($navigationTree[0])) { + $sCategories = showTree(0, $aWholelist); +} + +$tpl->set('s', 'SID', $sess->id); +$tpl->set('s', 'CATS', $sCategories); +$tpl->set('s', 'AREA', $area); +$tpl->set('s', 'SESSION', $contenido); +$tpl->set('s', 'DIRECTION', 'dir="' . langGetTextDirection($lang) . '"'); +$tpl->set('s', 'SYNCOPTIONS', $syncoptions); + +$tpl->set('s', 'AJAXURL', $cfg['path']['contenido_fullhtml'] . 'ajaxmain.php'); +$tpl->set('s', 'WHOLELIST', implode(', ', $aWholelist)); +$tpl->set('s', 'EXPANDEDLIST', implode(', ', $conexpandedList)); + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['con_str_overview']); +?> \ No newline at end of file diff --git a/conlite/includes/include.con_subnav.php b/conlite/includes/include.con_subnav.php new file mode 100644 index 0000000..2b9852b --- /dev/null +++ b/conlite/includes/include.con_subnav.php @@ -0,0 +1,128 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-25 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.con_subnav.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +//Get sync options +if (isset($syncoptions)) +{ + $syncfrom = $syncoptions; + $remakeCatTable = true; +} + +if (!isset($syncfrom)) +{ + $syncfrom = 0; +} + +if ( isset($_GET['idcat']) && $_GET['idcat'] != 0 ) { + $nav = new Contenido_Navigation; + + $sql = "SELECT + idarea + FROM + ".$cfg["tab"]["area"]." AS a + WHERE + a.name = '".Contenido_Security::escapeDB($area, $db)."' OR + a.parent_id = '".Contenido_Security::escapeDB($area, $db)."' + ORDER BY + idarea"; + + $db->query($sql); + + + $in_str = ""; + + while ( $db->next_record() ) { + $in_str .= $db->f('idarea') . ','; + } + + $len = strlen($in_str)-1; + $in_str = substr($in_str, 0, $len); + $in_str = '('.$in_str.')'; + + $sql = "SELECT + b.location AS location, + a.name AS name + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.idarea IN ".Contenido_Security::escapeDB($in_str, $db)." AND + b.idarea = a.idarea AND + b.level = 1 AND + b.online = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + + while ( $db->next_record() ) { + + /* Extract names from the XML document. */ + $caption = $nav->getName($db->f("location")); + + $tmp_area = $db->f("name"); + + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + if ($cfg['help'] == true) + { + $tpl->set("d", "CAPTION", ''.$caption.''); + } else { + $tpl->set("d", "CAPTION", ''.$caption.''); + } + + $tpl->next(); + + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + $tpl->set('s', 'IDCAT', $idcat); + $tpl->set('s', 'SESSID', $sess->id); + $tpl->set('s', 'CLIENT', $client); + $tpl->set('s', 'LANG', $lang); + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["con_subnav"]); + +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.debug.php b/conlite/includes/include.debug.php new file mode 100644 index 0000000..3af86f4 --- /dev/null +++ b/conlite/includes/include.debug.php @@ -0,0 +1,122 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-06-04 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.debug.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$areaList = new Area(); +$areas = $areaList = $areaList->getAvailableAreas(); + +$areaSelectTemplate= new Template; +$areaSelectTemplate->set('s', 'NAME', 'areaselect'); + +foreach ($areas as $key => $value) +{ + $areaSelectTemplate->set('d', 'VALUE', $key); + $areaSelectTemplate->set('d', 'CAPTION', $value['name']); + $areaSelectTemplate->set('d', 'SELECTED',''); + $areaSelectTemplate->next(); +} + +$areaSelector = $areaSelectTemplate->generate($cfg['path']['templates'].$cfg['templates']['generic_select'], true); + +$actionList = new Action(); +$actions = $actionList = $actionList->getAvailableActions(); + +$actionSelectTemplate= new Template; +$actionSelectTemplate->set('s', 'NAME', 'actionselect'); + +foreach ($actions as $key => $value) +{ + $actionSelectTemplate->set('d', 'VALUE', $key); + $actionSelectTemplate->set('d', 'CAPTION', $value['name']); + $actionSelectTemplate->set('d', 'SELECTED',''); + $actionSelectTemplate->next(); +} + +$actionSelector = $actionSelectTemplate->generate($cfg['path']['templates'].$cfg['templates']['generic_select'], true); + +if ($querytype == "areaactionitem") +{ + $res = $perm->have_perm_area_action_item($areaselect, $actionselect, $itemid); + + if ($res) + { + $result = "has right for have_perm_area_action_item($areaselect, $actionselect, $itemid)"; + } else { + $result = "has no right for have_perm_area_action_item($areaselect, $actionselect, $itemid)"; + } +} + +if ($querytype == "areaaction") +{ + $res = $perm->have_perm_area_action($areaselect, $actionselect); + + if ($res) + { + $result = "has right for have_perm_area_action($areaselect, $actionselect)"; + } else { + $result = "has no right for have_perm_area_action($areaselect, $actionselect)"; + } +} +if ($querytype == "area") +{ + $res = $perm->have_perm_area_action($areaselect, 0); + + if ($res) + { + $result = "has right for have_perm_area_action($areaselect, 0)"; + } else { + $result = "has no right for have_perm_area_action($areaselect, 0)"; + } +} + + +echo "

    Debug

    "; +echo "

    Check for right:

    "; +$form = '
    + '.$sess->hidden_session().' + + + + + '; +echo $form; +echo "Area:".$areaSelector."
    "; +echo "Action:".$actionSelector."
    "; +echo 'Item:'; +echo "
    Type:
    "; +echo "have_perm_area_action_item
    "; +echo "have_perm_area_action
    "; +echo "have_perm_area_action without action (i.e. area access right)
    "; +echo "

    Result:
    "; +echo "
    "; +?> \ No newline at end of file diff --git a/conlite/includes/include.default_subnav.php b/conlite/includes/include.default_subnav.php new file mode 100644 index 0000000..3e1cf24 --- /dev/null +++ b/conlite/includes/include.default_subnav.php @@ -0,0 +1,207 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.14 + * + * {@internal + * created 2010-08-23 + * + * $Id: include.default_subnav.php 75 2012-05-25 10:51:00Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) + die('Illegal call'); + + +$aExectime = array(); +$aExectime["fullstart"] = getmicrotime(); + +/* + * Debug-Modus: on / off + * and Message as String + */ +$bDebug = false; +$sDebugMsg = ''; + +/* + * Ben�tigt alle m�glichen vom Frame �bergenene GET-Parameter-Names + */ +$aBasicParams = array( 'area', 'frame', 'contenido', 'appendparameters' ); + +/* + * Flag to check is file is loading from Main-Frame + */ +$bVirgin = false; + + +$area = Contenido_Security::escapeDB($area, $db); + + +/* + * Basic-Url-Params with + * Key: like 'id%' or '%id' + * and + * Value: are integer or strlen=32 (for md5) + */ + $sUrlParams = ''; # URL-Parameter as string "&..." + "&..." + $iCountBasicVal = 0; # Count of basic Parameter in URL + + foreach( $_GET as $sTempKey => $sTempValue ) + { + if( in_array($sTempKey, $aBasicParams) ) + { + /* Basic parameters attached */ + $iCountBasicVal++; + } + else if( ( substr($sTempKey,0,2)=='id' || substr($sTempKey, -2, 2)=='id' ) + && ( (int)$sTempValue==$sTempValue // check integer + || preg_match("/^[0-9a-f]{32}$/", $sTempValue) ) // check md5 + ) + { + /* complement the selected data */ + $sUrlParams.= '&'.$sTempKey.'='.$sTempValue; + } + } + +/* + * is loading from main.php + * dann ist die Anzahl aller g�ltigen Variablen mit den in GET identisch + */ + if( $iCountBasicVal == count($_GET) ) + { + $bVirgin = true; + } + +/* + * Area-Url-Params + * + * for special params + * + switch( $area ) { + case 'style': case 'js': case 'htmltpl': + if(array_key_exists('file', $_GET)) { + $sUrlParams.= '&file='.$_GET['file']; + } + break; + default: echo ""; + } +*/ + +/* Debug */ + $sDebugMsg.= 'Url-Params: '.$sUrlParams."\n"; + + +/* + * Select NavSubItems from DB + */ + $nav = new Contenido_Navigation; + + $sql = "SELECT + navsub.location AS location, + area.name AS name, + area.menuless AS menuless + FROM + ".$cfg["tab"]["area"]." AS area, + ".$cfg["tab"]["nav_sub"]." AS navsub + WHERE + area.idarea = navsub.idarea + AND + navsub.level = 1 + AND + navsub.online = 1 + AND + area.online = 1 + AND ( + area.parent_id = '".$area."' + OR + area.name = '".$area."' + ) + ORDER BY + area.parent_id ASC, + navsub.idnavs ASC"; + +/* Debug */ + $sDebugMsg.= ''."\n"; + + + $db->query($sql); + + while($db->next_record()) { + /* Name */ + $sArea = $db->f("name"); + + /* Set translation path */ + $sCaption = $nav->getName( $db->f("location") ); + + /* for Main-Area*/ + if( $sArea == $area ) { + /* Menueless */ + $bMenuless = $db->f("menuless") ? true : false; + + if( $bVirgin && !$bMenuless && $db->f("name") == $area ) + { + // ist loading fron Main, Main-Area and Menuless -> stop this "while" + break; + } + } + + /* Link */ + $sLink = $sess->url("main.php?area=".$sArea."&frame=4".(isset($appendparameters)?'&appendparameters='.$appendparameters:'')."&contenido=".$sess->id.$sUrlParams); + + /* Class */ + if($sArea == $area) + $sClass = ' current'; + else + $sClass = ''; + + /* fill template */ + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt ); + $tpl->set("d", "CLASS", 'item '.$sArea ); + $tpl->set("d", "CAPTION", ''.$sCaption.''); + $tpl->next(); + } + + if( !$bVirgin || (isset($bMenuless) && $bMenuless)) + { + $tpl->set('s', 'CLASS', (isset($bMenuless) && $bMenuless)?'menuless' : ''); + $tpl->set('s', 'SESSID', $sess->id); + + $sTpl = $tpl->generate( $cfg["path"]["templates"] . $cfg['templates']['default_subnav'], true ); + + if($bDebug === true) { + + $aExectime["fullend"] = getmicrotime(); + $sExectime = ($aExectime["fullend"] - $aExectime["fullstart"]); + $sDebugMsg.= 'sExectime: '.substr($sExectime,0,7)." sec"."\n"; + + $sTpl = str_replace( '', '
    '.nl2br( $sDebugMsg ).'
    '.'', $sTpl ); + } + + echo $sTpl; + } else { + /* + * Is loading from main.php + */ + $tpl->reset(); + $tpl->generate( $cfg["path"]["templates"] . $cfg['templates']['right_top_blank'] ); + } + +?> diff --git a/conlite/includes/include.files_subnav.php b/conlite/includes/include.files_subnav.php new file mode 100644 index 0000000..d09d439 --- /dev/null +++ b/conlite/includes/include.files_subnav.php @@ -0,0 +1,124 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-25 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.files_subnav.php 22 2011-08-25 09:58:43Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( isset($_GET['file']) ) { + + $area = $_GET['area']; + + $nav = new Contenido_Navigation; + + $sql = "SELECT + idarea + FROM + ".$cfg["tab"]["area"]." AS a + WHERE + a.name = '".Contenido_Security::escapeDB($area, $db)."' OR + a.parent_id = '".Contenido_Security::escapeDB($area, $db)."' + ORDER BY + idarea"; + + $db->query($sql); + + $in_str = ""; + + while ( $db->next_record() ) { + $in_str .= $db->f('idarea') . ','; + } + + $len = strlen($in_str)-1; + $in_str = substr($in_str, 0, $len); + $in_str = '('.$in_str.')'; + + $sql = "SELECT + b.location AS location, + a.name AS name + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.idarea IN ".$in_str." AND + b.idarea = a.idarea AND + b.level = 1 AND + b.online = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + + while ( $db->next_record() ) { + + /* Extract names from the XML document. */ + $caption = $nav->getName($db->f("location")); + + $tmp_area = $db->f("name"); + if ($tmp_area == 'style') { + $sAction = '&action=style_edit'; + } else if ($tmp_area == 'js') { + $sAction = '&action=js_edit'; + } else if ($tmp_area == 'htmltpl') { + $sAction = '&action=htmltpl_edit'; + } else { + $sAction = ''; + } + if ($perm->have_perm_area_action($tmp_area)) + { + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + + } + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + if ($_GET['history'] == 'true') { + $tpl->set('s', 'ACTIVATE_HISTORY', 'setHistory();'); + } else { + $tpl->set('s', 'ACTIVATE_HISTORY', ''); + } + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg['templates']['file_subnav']); + +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} + +?> diff --git a/conlite/includes/include.frontend.group.subnav.php b/conlite/includes/include.frontend.group.subnav.php new file mode 100644 index 0000000..f47843b --- /dev/null +++ b/conlite/includes/include.frontend.group.subnav.php @@ -0,0 +1,87 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.frontend.group.subnav.php 22 2011-08-25 09:58:43Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( isset($_GET['idfrontendgroup']) ) +{ + + $caption = i18n("Overview"); + $tmp_area = "foo2"; + + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + + if (is_array($cfg['plugins']['frontendlogic'])) + { + foreach ($cfg['plugins']['frontendlogic'] as $plugin) + { + cInclude("plugins", "frontendlogic/$plugin/".$plugin.".php"); + + $className = "frontendlogic_".$plugin; + + if (class_exists($className)) + { + $class = new $className; + + $caption = $class->getFriendlyName(); + + $tmp_area = "foo2"; + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + } + } + } + + + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); + +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); + +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.frontend.group_edit.php b/conlite/includes/include.frontend.group_edit.php new file mode 100644 index 0000000..5d6f27a --- /dev/null +++ b/conlite/includes/include.frontend.group_edit.php @@ -0,0 +1,301 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2007-06-16, Holger Librenz, Hotfix: check for illegal calls added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.frontend.group_edit.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$page = new cPage; +$fegroups = new FrontendGroupCollection; + +if (is_array($cfg['plugins']['frontendgroups'])) +{ + foreach ($cfg['plugins']['frontendgroups'] as $plugin) + { + plugin_include("frontendgroups", $plugin."/".$plugin.".php"); + } +} + +$fegroup = new FrontendGroup; +$groupmembers = new FrontendGroupMemberCollection; +$fegroup->loadByPrimaryKey($idfrontendgroup); +$sRefreshRightTopLinkJs = ""; + +if ($action == "frontendgroup_create" && $perm->have_perm_area_action($area, $action)) +{ + $fegroup = $fegroups->create(" ".i18n("-- new group --")); + $idfrontendgroup = $fegroup->get("idfrontendgroup"); + $sRefreshRightTopLink = $sess->url('main.php?frame=3&area='.$area.'&idfrontendgroup='.$idfrontendgroup); + $sRefreshRightTopLink = "conMultiLink('right_top', '".$sRefreshRightTopLink."')"; + $sRefreshRightTopLinkJs = ""; + +} else if ($action == "frontendgroups_user_delete" && $perm->have_perm_area_action($area, $action)) { + $aDeleteMembers = array(); + if (!is_array($_POST['user_in_group'])) { + if ($_POST['user_in_group'] > 0) { + array_push($aDeleteMembers, $_POST['user_in_group']); + } + } else { + $aDeleteMembers = $_POST['user_in_group']; + } + foreach ($aDeleteMembers as $idfrontenduser) { + $groupmembers->remove($idfrontendgroup, $idfrontenduser); + } + + # also save other variables + $action = "frontendgroup_save_group"; +} else if ($action == "frontendgroup_user_add" && $perm->have_perm_area_action($area, $action)) { + if (count($newmember) > 0) + { + foreach ($newmember as $add) + { + $groupmembers->create($idfrontendgroup, $add); + } + } + + # also save other variables + $action = "frontendgroup_save_group"; +} else if ($action == "frontendgroup_delete" && $perm->have_perm_area_action($area, $action)) +{ + $fegroups->delete($idfrontendgroup); + $idfrontendgroup= 0; + $fegroup = new FrontendGroup; +} + +if ($action != '') { + $sReloadScript = ""; +} else { + $sReloadScript = ''; +} + +if ($fegroup->virgin == false && $fegroup->get("idclient") == $client) +{ + if ($action == "frontendgroup_save_group" && $perm->have_perm_area_action($area, $action)) + { + $messages = array(); + + if ($fegroup->get("groupname") != stripslashes($groupname)) + { + $fegroups->select("groupname = '$groupname' and idclient='$client'"); + if ($fegroups->next()) + { + $messages[] = i18n("Could not set new group name: Group already exists"); + } else { + $fegroup->set("groupname", stripslashes($groupname)); + } + } + + //Reset all default groups + if ($defaultgroup == 1) { + $sSql = 'UPDATE '.$cfg["tab"]["frontendgroups"].' SET defaultgroup = 0 WHERE idclient='.$client.';'; + $db->query($sSql); + } + $fegroup->set("defaultgroup", $defaultgroup); + + /* Check out if there are any plugins */ + if (is_array($cfg['plugins']['frontendgroups'])) + { + foreach ($cfg['plugins']['frontendgroups'] as $plugin) + { + if (function_exists("frontendgroups_".$plugin."_wantedVariables") && + function_exists("frontendgroups_".$plugin."_store")) + { + $wantVariables = call_user_func("frontendgroups_".$plugin."_wantedVariables"); + + if (is_array($wantVariables)) + { + $varArray = array(); + + foreach ($wantVariables as $value) + { + $varArray[$value] = stripslashes($GLOBALS[$value]); + } + } + $store = call_user_func("frontendgroups_".$plugin."_store", $varArray); + } + } + } + + $fegroup->store(); + } + + if (count($messages) > 0) + { + $notis = $notification->returnNotification("warning", implode("
    ", $messages)) . "
    "; + } + + $tpl->reset(); + + $feusers = new FrontendUserCollection; + $feusers->select("idclient='$client'"); + + $addedusers = $groupmembers->getUsersInGroup($idfrontendgroup,false); + $addeduserobjects = $groupmembers->getUsersInGroup($idfrontendgroup,true); + + $cells = array(); + foreach ($addeduserobjects as $addeduserobject) + { + if ((int)$addeduserobject->get("idfrontenduser") != 0 && $addeduserobject->get("username") != '') { + $cells[$addeduserobject->get("idfrontenduser")] = $addeduserobject->get("username"); + } + } + + asort($cells); + + $sInGroupOptions = ''; + foreach ($cells as $idfrontenduser => $name) + { + $sInGroupOptions .= ''."\n"; + } + $tpl->set('s', 'IN_GROUP_OPTIONS', $sInGroupOptions); + + $items = array(); + while ($feuser = $feusers->next()) + { + $idfrontenduser = $feuser->get("idfrontenduser"); + $sUsername = $feuser->get("username"); + + if (!in_array($idfrontenduser,$addedusers)) + { + if ((int) $idfrontenduser != 0 && $sUsername != '') { + $items[$idfrontenduser] = $sUsername; + } + } + } + + asort($items); + + $sNonGroupOptions = ''; + foreach ($items as $idfrontenduser => $name) + { + $sNonGroupOptions .= ''."\n"; + } + $tpl->set('s', 'NON_GROUP_OPTIONS', $sNonGroupOptions); + + $groupname = new cHTMLTextbox("groupname", $fegroup->get("groupname"),40); + + $defaultgroup = new cHTMLCheckbox("defaultgroup", "1"); + $defaultgroup->setChecked($fegroup->get("defaultgroup")); + + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'LABEL', i18n("Group name")); + $tpl->set('d', 'INPUT', $groupname->render()); + $tpl->next(); + + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'LABEL', i18n("Default group")); + $tpl->set('d', 'INPUT', $defaultgroup->toHTML(false)); + $tpl->next(); + + $pluginOrder = trim_array(explode(",",getSystemProperty("plugin", "frontendgroups-pluginorder"))); + + /* Check out if there are any plugins */ + if (is_array($pluginOrder)) + { + foreach ($pluginOrder as $plugin) + { + if (function_exists("frontendgroups_".$plugin."_getTitle") && + function_exists("frontendgroups_".$plugin."_display")) + { + + $plugTitle = call_user_func("frontendgroups_".$plugin."_getTitle"); + $display = call_user_func("frontendgroups_".$plugin."_display", $fegroup); + + if (is_array($plugTitle) && is_array($display)) + { + foreach ($plugTitle as $key => $value) + { + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'LABEL', $value); + $tpl->set('d', 'INPUT', $display[$key]); + $tpl->next(); + } + } else { + if (is_array($plugTitle) || is_array($display)) + { + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'LABEL', "WARNING"); + $tpl->set('d', 'INPUT', "The plugin $plugin delivered an array for the displayed titles, but did not return an array for the contents."); + $tpl->next(); + } else { + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'LABEL', $plugTitle); + $tpl->set('d', 'INPUT', $display); + $tpl->next(); + } + } + } + } + } + + $tpl->set('s', 'CATNAME', i18n("Edit group")); + $tpl->set('s', 'BGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('s', 'BGCOLOR_CONTENT', $cfg["color"]["table_dark"]); + $tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('s', 'CATFIELD', " "); + $tpl->set('s', 'FORM_ACTION', $sess->url('main.php')); + $tpl->set('s', 'AREA', $area); + $tpl->set('s', 'GROUPID', $idfrontendgroup); + $tpl->set('s', 'FRAME', $frame); + $tpl->set('s', 'IDLANG', $lang); + $tpl->set('s', 'STANDARD_ACTION', 'frontendgroup_save_group'); + $tpl->set('s', 'ADD_ACTION', 'frontendgroup_user_add'); + $tpl->set('s', 'DELETE_ACTION', 'frontendgroups_user_delete'); + $tpl->set('s', 'DISPLAY_OK', 'block'); + $tpl->set('s', 'IN_GROUP_VALUE', $_POST['filter_in']); + $tpl->set('s', 'NON_GROUP_VALUE', $_POST['filter_non']); + $tpl->set('s', 'RECORD_ID_NAME', 'idfrontendgroup'); + $tpl->set('s', 'RELOADSCRIPT', $sReloadScript.$sRefreshRightTopLinkJs); + + $tpl = $tpl->generate($cfg['path']['templates'] . $cfg['templates']['grouprights_memberselect']); +} else { + $page = new UI_Page; + $page->setContent(""); + $page->addScript('reload', $sReloadScript); + $page->render(); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.frontend.group_menu.php b/conlite/includes/include.frontend.group_menu.php new file mode 100644 index 0000000..3b384ba --- /dev/null +++ b/conlite/includes/include.frontend.group_menu.php @@ -0,0 +1,105 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.frontend.group_menu.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$page = new cPage; +$menu = new UI_Menu; + +$fegroups = new FrontendGroupCollection; +$fegroups->select("idclient = '$client'","", "groupname ASC"); + +while ($fegroup = $fegroups->next()) +{ + $groupname = $fegroup->get("groupname"); + $idfegroup = $fegroup->get("idfrontendgroup"); + + $link = new Link; + $link->setMultiLink("frontendgroups","","frontendgroups",""); + $link->setCustom("idfrontendgroup",$idfegroup); + + $delTitle = i18n("Delete frontend group"); + $delDescr = sprintf(i18n("Do you really want to delete the following frontend group:
    %s"),clHtmlSpecialChars($groupname)); + $delete = ''.$delTitle.''; + + $menu->setTitle($idfegroup, $groupname); + $menu->setLink($idfegroup, $link); + $menu->setImage($idfegroup, "", 0); + $menu->setActions($idfegroup, 'delete', $delete); + + if ($_GET['idfrontendgroup'] == $idfegroup) { + $menu->setExtra($idfegroup, 'id="marked" '); + } +} + +$sInitRowMark = ""; + +$delScript = ' + '; + +$msgboxInclude = ''; + +$page->addScript('include', $msgboxInclude); +$page->addScript('del',$delScript); +$page->setMargin(0); +$page->setMargin(0); +$page->setContent($menu->render(false).$sInitRowMark); +$page->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.frontend.group_rights.php b/conlite/includes/include.frontend.group_rights.php new file mode 100644 index 0000000..7089203 --- /dev/null +++ b/conlite/includes/include.frontend.group_rights.php @@ -0,0 +1,139 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-03-02 + * modified 2008-06-16, Holger Librenz, Hotfic: checking for illegal calls + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.frontend.group_rights.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// @TODO: check the code beneath is necessary +if ($_REQUEST['useplugin'] != "category") { + die ('Illegal call!'); +} + + +$page = new cPage; + +if (!in_array($useplugin, $cfg['plugins']['frontendlogic'])) +{ + $page->setContent(i18n("Invalid plugin")); + +} else { + + cInclude("plugins", "frontendlogic/$useplugin/".$useplugin.".php"); + + $className = "frontendlogic_".$useplugin; + $class = new $className; + $perms = new FrontendPermissionCollection; + + + $rights = new UI_Table_Form("rights"); + $rights->setVar("area", $area); + $rights->setVar("frame", $frame); + $rights->setVar("useplugin", $useplugin); + $rights->setVar("idfrontendgroup", $idfrontendgroup); + $rights->setVar("action", "fegroups_save_perm"); + + $actions = $class->listActions(); + $items = $class->listItems(); + + if ($action == "fegroups_save_perm") + { + $myitems = $items; + $myitems["__GLOBAL__"] = "__GLOBAL__"; + + foreach ($actions as $action => $text) + { + foreach ($myitems as $item => $text) + { + + if ($item === "__GLOBAL__") + { + $varname = "action_$action"; + } else { + $varname = "item_".$item."_$action"; + } + + if ($_POST[$varname] == 1) + { + $perms->setPerm($idfrontendgroup, $useplugin, $action, $item); + } else { + $perms->removePerm($idfrontendgroup, $useplugin, $action, $item); + } + } + } + + } + + $rights->addHeader(sprintf(i18n("Permissions for plugin '%s'"), $class->getFriendlyName())); + + foreach ($actions as $key => $action) + { + $check[$key] = new cHTMLCheckbox("action_$key", 1); + $check[$key]->setLabelText($action." ".i18n("(All)")); + + if ($perms->checkPerm($idfrontendgroup, $useplugin, $key, "__GLOBAL__")) + { + $check[$key]->setChecked(true); + } + } + + $rights->add(i18n("Global rights"), $check); + + foreach ($actions as $key => $action) + { + unset($check); + + if (count($items) > 0) + { + foreach ($items as $item => $value) + { + $check[$item] = new cHTMLCheckbox("item_".$item."_".$key, 1); + $check[$item]->setLabelText($value); + + if ($perms->checkPerm($idfrontendgroup, $useplugin, $key, $item)) + { + $check[$item]->setChecked(true); + } + + } + + $rights->add($action, $check); + } else { + $rights->add($action, i18n("No items found")); + } + } + + $page->setContent($rights->render()); +} + +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.frontend.left_top.php b/conlite/includes/include.frontend.left_top.php new file mode 100644 index 0000000..fabffcc --- /dev/null +++ b/conlite/includes/include.frontend.left_top.php @@ -0,0 +1,482 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.frontend.left_top.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); + +$oPage = new cPage; + +$user = new cApiUser($auth->auth["uid"]); + +$tpl->set('s', '{SESSID}', $sess->id); + +/* Set default values */ +$oUser = new cApiUser($auth->auth["uid"]); +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST['elemperpage']) || $_REQUEST['elemperpage'] <= 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); +} +if (!is_numeric($_REQUEST['elemperpage'])) { + $_REQUEST['elemperpage'] = 25; +} +$oUser->setProperty("itemsperpage", $area, $_REQUEST["elemperpage"]); +unset ($oUser); + +if (!isset($_REQUEST["page"]) || !is_numeric($_REQUEST['page']) || $_REQUEST['page'] <= 0 || $_REQUEST["elemperpage"] == 0) { + $_REQUEST["page"] = 1; +} + +$aFieldsToSearch = array("--all--" => i18n("-- All fields --"), "username" => i18n("Username")); +$aFieldsToSort = array("username" => i18n("Username")); + +$aFieldSources = array(); +$aFieldSources["username"] = "base"; + +$bUsePlugins = getEffectiveSetting("frontendusers", "pluginsearch", "true"); + +if ($bUsePlugins == "false") +{ + $bUsePlugins = false; +} else { + $bUsePlugins = true; +} + + +if (is_array($cfg['plugins']['frontendusers'])) +{ + foreach ($cfg['plugins']['frontendusers'] as $plugin) + { + plugin_include("frontendusers", $plugin."/".$plugin.".php"); + } +} + +if ($bUsePlugins == true) +{ + if (is_array($cfg['plugins']['frontendusers'])) + { + $_sValidPlugins = getEffectiveSetting("frontendusers", "pluginsearch_valid_plugins", ''); + $_aValidPlugins = array(); + if (strlen($_sValidPlugins)>0) { + $_aValidPlugins = explode(',', $_sValidPlugins); + } + $_iCountValidPlugins = sizeof($_aValidPlugins); + foreach ($cfg['plugins']['frontendusers'] as $plugin) + { + if ($_iCountValidPlugins == 0 || in_array($plugin, $_aValidPlugins)) { + if (function_exists("frontendusers_".$plugin."_wantedVariables") && function_exists("frontendusers_".$plugin."_canonicalVariables")) + { + $aVariableNames = call_user_func("frontendusers_".$plugin."_canonicalVariables"); + + if (is_array($aVariableNames)) + { + $aTmp = array_merge($aFieldsToSearch, $aVariableNames); + $aFieldsToSearch = $aTmp; + + $aTmp2 = array_merge($aFieldsToSort, $aVariableNames); + $aFieldsToSort = $aTmp2; + + foreach ($aVariableNames as $sVariableName => $name) + { + $aFieldSources[$sVariableName] = $plugin; + } + } + } + } + } + } +} + +$aSortOrderOptions = array ("asc" => i18n("Ascending"), "desc" => i18n("Descending")); + +########### +# Buttons +########### +/** + * @todo change behavior for links to use cHTML elements + */ +$userlink = new cHTMLLink; +$userlink->setCLink("frontend", 2, ""); +$userlink->attachEventDefinition('Help', "onclick", setHelpContext("frontenduser")); + +$grouplink = new cHTMLLink; +$grouplink->setCLink("frontendgroups", 2, ""); + +$userlink="javascript:execFilter(2);"; +$grouplink="javascript:conMultiLink('left_bottom','main.php?area=frontendgroups&frame=2&action=&contenido=".$sess->id."')"; + +// Init view by javascript (decide which tab is activated) +$imgUserId='img_user'; +$tpl->set('s', 'IUSER', $imgUserId); + +$buttonRow .= ''; +$buttonRow .= ''.i18n('; +$buttonRow .= ''; + +// Frontend Groups +$imgGroupId='img_group'; +$tpl->set('s', 'IGROUP', $imgGroupId); +$buttonRow .= ''; +$buttonRow .= ''.i18n('; +$buttonRow .= ''; + +$tpl->set('s', 'BUTTONROW', $buttonRow); + +if(isset($_GET['view']) && $_GET['view'] == $imgGroupId) { + $tpl->set('s', 'IINIT', $imgGroupId); +} else { + $tpl->set('s', 'IINIT', $imgUserId); +} + +################ +# Users Actions +################ +$actionLink="actionlink"; +$sActionUuid = '28cf9b31-e6d7-4657-a9a7-db31478e7a5c'; + +$oActionRow = new cFoldingRow($sActionUuid ,i18n("Actions"), $actionLink); +if(isset($_GET['actionrow']) && $_GET['actionrow'] == 'collapsed') { + $oActionRow->setExpanded(false); + $user->setProperty("expandstate", $sActionUuid, 'false'); +} else if (isset($_GET['actionrow']) && $_GET['actionrow'] == 'expanded') { + $oActionRow->setExpanded(true); + $user->setProperty("expandstate", $sActionUuid, 'true'); +} + +$tpl->set('s', 'ACTIONLINK', $actionLink); +$oLink = new cHTMLLink; +if ((int) $client > 0) { + $oLink->setMultiLink("frontend","","frontend","frontend_create"); + $oLink->setContent(i18n("Create user")); +} else { + $oLink->setLink(''); + $oLink->setContent(i18n("No Client selected")); +} +$oLink->setClass("addfunction"); +$oLink->setStyle('margin-left: 17px;margin-top:5px'); +$oActionRow->setContentData($oLink->render()); + +###################### +# Users List Options +###################### + +$sListOptionId = 'f081b6ab-370d-4fd8-984f-6b38590fe48b'; +$listOptionLink="listoptionlink"; +$oListOptionRow = new cFoldingRow($sListOptionId, i18n("List options"), $listOptionLink); +$oListOptionRow->setExpanded(true); + +if(isset($_GET['filterrow']) && $_GET['filterrow'] == 'collapsed') { + $oActionRow->setExpanded(false); + $user->setProperty("expandstate", $sListOptionId, 'false'); +} else if (isset($_GET['filterrow']) && $_GET['filterrow'] == 'expanded') { + $oActionRow->setExpanded(true); + $user->setProperty("expandstate", $sListOptionId, 'true'); +} + +$tpl->set('s', 'LISTOPTIONLINK', $listOptionLink); +$oSelectItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelectItemsPerPage->autoFill(array(25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelectItemsPerPage->setDefault($_REQUEST["elemperpage"]); + +asort($aFieldsToSort); +asort($aFieldsToSearch); + +$oSelectSortBy = new cHTMLSelectElement("sortby"); +$oSelectSortBy->autoFill($aFieldsToSort); +$oSelectSortBy->setDefault($_REQUEST["sortby"]); + +$oSelectSortOrder = new cHTMLSelectElement("sortorder"); +$oSelectSortOrder->autoFill($aSortOrderOptions); +$oSelectSortOrder->setDefault($_REQUEST["sortorder"]); + +$oSelectSearchIn = new cHTMLSelectElement("searchin"); +$oSelectSearchIn->autoFill($aFieldsToSearch); +$oSelectSearchIn->setDefault($_REQUEST["searchin"]); + +$fegroups = new FrontendGroupCollection; +$fegroups->setWhere("idclient", $client); +$fegroups->query(); + +$aFEGroups = array("--all--" => i18n("-- All Groups --")); + +while ($fegroup = $fegroups->next()) +{ + $aFEGroups[$fegroup->get("idfrontendgroup")] = $fegroup->get("groupname"); +} + +$oSelectRestrictGroup = new cHTMLSelectElement("restrictgroup"); +$oSelectRestrictGroup->autoFill($aFEGroups); +$oSelectRestrictGroup->setDefault($_REQUEST["restrictgroup"]); +$oTextboxFilter = new cHTMLTextbox("filter", $_REQUEST["filter"], 20); + + +$content = '
    '; +// Ye stuff will be done in javascript on apply button +$content .= '
    '; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= '
    '. i18n("Items / page").''.$oSelectItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelectSortBy->render().'
    '. i18n("Sort order").''.$oSelectSortOrder->render().'
    '. i18n("Show group").''.$oSelectRestrictGroup->render().'
    '. i18n("Search for").''.$oTextboxFilter->render().'
    '. i18n("Search in").''.$oSelectSearchIn->render().'
     
    '; +$content .= '
    '; +$content .= '
    '; +$oListOptionRow->setContentData($content); +$oFEUsers = new FrontendUserCollection; +$oFEUsers->setWhere("FrontendUserCollection.idclient", $client); + +############################## +# Process request parameters +############################## +if (strlen($_REQUEST["filter"]) > 0 && $bUsePlugins == false) +{ + $oFEUsers->setWhere("FrontendUsercollection.username", $_REQUEST["filter"], "diacritics"); +} + +if ($_REQUEST["restrictgroup"] != "" && $_REQUEST["restrictgroup"] != "--all--") +{ + $oFEUsers->link("FrontendGroupMemberCollection"); + $oFEUsers->setWhere("FrontendGroupMemberCollection.idfrontendgroup", $_REQUEST["restrictgroup"]); +} + +$mPage = $_REQUEST["page"]; +$elemperpage = $_REQUEST["elemperpage"]; + +if ($bUsePlugins == false) +{ + $oFEUsers->query(); + + $iFullTableCount = $oFEUsers->count(); + + $oFEUsers->setOrder(implode(" ", array($oSelectSortBy->getDefault(), $oSelectSortOrder->getDefault()))); + $oFEUsers->setLimit($elemperpage * ($mPage - 1), $elemperpage); +} + +$oFEUsers->query(); + +$aUserTable = array(); + +while ($feuser = $oFEUsers->next()) +{ + foreach ($aFieldSources as $key => $field) + { + $idfrontenduser = $feuser->get("idfrontenduser"); + + $aUserTable[$idfrontenduser]["idfrontenduser"] = $idfrontenduser; + + switch ($field) + { + case "base": + $aUserTable[$idfrontenduser][$key] = $feuser->get("username"); + break; + default: + if ($_REQUEST["filter"] != "") + { + $aUserTable[$idfrontenduser][$key] = call_user_func("frontendusers_".$field."_getvalue", $key); + } + break; + } + } + + if ($_REQUEST["filter"] != "") + { + if ($_REQUEST["searchin"] == "--all--" || $_REQUEST["searchin"] == "") + { + $found = false; + + foreach ($aUserTable[$idfrontenduser] as $key => $value) + { + if (stripos($value, $_REQUEST["filter"]) !== false) + { + $found = true; + } + } + + if ($found == false) + { + unset($aUserTable[$idfrontenduser]); + } + + } else { + if (stripos($aUserTable[$idfrontenduser][$_REQUEST["searchin"]], $_REQUEST["filter"]) === false) + { + unset($aUserTable[$idfrontenduser]); + } + } + } +} + +if ($_REQUEST["sortorder"] == "desc") +{ + $sortorder = SORT_DESC; +} else { + $sortorder = SORT_ASC; +} + +if ($_REQUEST["sortby"]) +{ + $aUserTable = array_csort($aUserTable, $_REQUEST["sortby"], $sortorder); +} else { + $aUserTable = array_csort($aUserTable, "username", $sortorder); +} + +$mlist = new UI_Menu; +$iMenu = 0; +$iItemCount = 0; + +foreach ($aUserTable as $mkey => $params) +{ + $idfrontenduser = $params["idfrontenduser"]; + $link = new cHTMLLink; + $link->setMultiLink($area, "", $area, ""); + $link->setCustom("idfrontenduser", $idfrontenduser); + + $iItemCount++; + + if (($iItemCount > ($elemperpage * ($mPage - 1)) && $iItemCount < (($elemperpage * $mPage) + 1)) || $bUsePlugins == false) + { + $iMenu++; + + $message = sprintf(i18n("Do you really want to delete the user %s?"), clHtmlSpecialChars($params["username"])); + + $delTitle = i18n("Delete user"); + $deletebutton = ''.$delTitle.''; + + $mlist->setTitle($iMenu, $params["username"]); + $mlist->setLink($iMenu, $link); + $mlist->setActions($iMenu, "delete", $deletebutton); + $mlist->setImage($iMenu, "images/users.gif"); + } +} + +if ($bUsePlugins == false) +{ + $iItemCount = $iFullTableCount; +} + +############### +# Users Paging +############### +$pagingLink="paginglink"; +$tpl->set('s', 'PAGINGLINK', $pagingLink); + +$oPagerLink = new cHTMLLink; +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setLink("main.php"); +$oPagerLink->setCustom("elemperpage", $elemperpage); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("searchin", $_REQUEST["searchin"]); +$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("frame", 2); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +$oPager = new cObjectPager("25c6a67d-a3f1-4ea4-8391-446c131952c9", $iItemCount, $_REQUEST['elemperpage'], $mPage, $oPagerLink, "page", $pagingLink); +$oPager->setExpanded(true); + +###################### +# Groups create Groups +###################### +$link = new Link; +$menu = new UI_Menu; +if ((int) $client > 0) { + $link->setLink('javascript:conMultiLink(\'right_bottom\', \''.$sess->url("main.php?area=frontendgroups&frame=4&action=frontendgroup_create").'\');'); + $menu->setTitle("-2", i18n("Create group")); +} else { + $link->setLink(''); + $menu->setTitle("-2", i18n("No Client selected")); +} +$menu->setImage("-2", $cfg["path"]["images"] . "folder_new.gif"); +$menu->setLink("-2", $link); +$menu->setLink("10", $link); +$menu->setTitle("10", ""); +$menu->setImage("10", ""); +$menu->setRowmark(false); + +####################### +# Container Users +####################### +$containerUsersId='cont_users'; +$containerUsers = '
    '; +$containerUsers .= ''; +$containerUsers .= $oActionRow->render(); +$containerUsers .= $oListOptionRow->render(); +$containerUsers .= $oPager->render(); +$containerUsers .= '
    '; +$containerUsers .= '
    '; +$tpl->set('s', 'CUSERS', $containerUsers); +$tpl->set('s', 'ID_USERS', $containerUsersId); + +####################### +# Container Groups +####################### +$containerGroupsId='cont_groups'; +$containerGroups = '
    '; +$containerGroups .= ''.$menu->render(false).''; +$containerGroups .= '
    '; +$tpl->set('s', 'CGROUPS', $containerGroups); +$tpl->set('s', 'ID_GROUPS', $containerGroupsId); + +$tpl->set('s', 'PAGE', $_REQUEST["page"]); + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['admin_frontend']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.frontend.user_edit.php b/conlite/includes/include.frontend.user_edit.php new file mode 100644 index 0000000..2da7723 --- /dev/null +++ b/conlite/includes/include.frontend.user_edit.php @@ -0,0 +1,252 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: include.frontend.user_edit.php 292 2014-01-20 09:49:37Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$oPage = new cPage(); +$oPage->setHtml5(); + +$oFeUsers = new FrontendUserCollection(); +if (is_array($cfg['plugins']['frontendusers'])) { + foreach ($cfg['plugins']['frontendusers'] as $plugin) { + plugin_include("frontendusers", $plugin."/".$plugin.".php"); + } +} + +$oFeUser = $feuser = new FrontendUser($idfrontenduser); +$oFEGroupMemberCollection = new FrontendGroupMemberCollection; +$oFEGroupMemberCollection->setWhere('idfrontenduser', $idfrontenduser); +$oFEGroupMemberCollection->addResultField('idfrontendgroup'); +$oFEGroupMemberCollection->query(); + +# Fetch all groups the user belongs to (no goup, one group, more than one group). +# The array $aFEGroup can be used in frontenduser plugins to display selfdefined user properties group dependent. +$aFEGroup = array(); + +while($oFEGroup = $oFEGroupMemberCollection->next()) { + $aFEGroup[] = $oFEGroup->get("idfrontendgroup"); +} + +if ($action == "frontend_create" && $perm->have_perm_area_action("frontend", "frontend_create")) { + $oFeUser = $oFeUsers->create(" ".i18n("-- new user --")); + $idfrontenduser = $oFeUser->get("idfrontenduser"); +} + +if ($idfrontenduser && $action != '') { + $sReloadScript = ""; +} else { + $sReloadScript = ""; +} + +$sFormCheck = ' + +'; + +$oPage->addScript("formcheck", $sFormCheck); + +// Delete FE-User +if ($action == "frontend_delete" && $perm->have_perm_area_action("frontend", "frontend_delete")) { + $oFeUsers->delete($idfrontenduser); + $iterator = $_cecRegistry->getIterator("Contenido.Permissions.FrontendUser.AfterDeletion"); + while ($chainEntry = $iterator->next()) { + $chainEntry->execute($idfrontenduser); + } + + $idfrontenduser = 0; + $oFeUser = new FrontendUser(); + $oPage->addScript('reload', $sReloadScript); +} + +if ($oFeUser->virgin == false && $oFeUser->get("idclient") == $client) { + // check and save changes + if ($action == "frontend_save_user") { + $oPage->addScript('reload', $sReloadScript); + $messages = array(); + $bStore = true; + $initname = i18n("-- new user --"); + $bNewUser = (strstr($username, $initname) === false)?false:true; + if(empty($username) || $bNewUser) { + $messages[] = i18n("Username empty or not set! Please choose one."); + $bStore = false; + } + // check for empty password + if($bStore && empty($newpd) && $oFeUser->get("password") == "d41d8cd98f00b204e9800998ecf8427e") { + $messages[] = i18n("Password not set right now!"); + $bStore = false; + } + if ($bStore && $oFeUser->get("username") != stripslashes($username)) { + $oFeUsers->select("username = '".urlencode($username)."' and idclient='$client'"); + if ($oFeUsers->next()) { + $messages[] = i18n("Could not set new username: Username already exists"); + } else { + $oFeUser->set("username", stripslashes($username)); + } + } + + if ($newpd != $newpd2) { + $messages[] = i18n("Could not set new password: Passwords don't match"); + } else { + if ($newpd != "") { + $oFeUser->set("password", $newpd); + } + } + + $oFeUser->set("active", $active); + + /* Check out if there are any plugins */ + if (is_array($cfg['plugins']['frontendusers'])) { + foreach ($cfg['plugins']['frontendusers'] as $plugin) { + if (function_exists("frontendusers_".$plugin."_wantedVariables") && + function_exists("frontendusers_".$plugin."_store")) { + # check if user belongs to a specific group + # if true store values defined in frontenduser plugin + if (function_exists("frontendusers_".$plugin."_checkUserGroup")) { + $bCheckUserGroup = call_user_func("frontendusers_".$plugin."_checkUserGroup"); + } else { + $bCheckUserGroup = true; + } + if ($bCheckUserGroup) { + $wantVariables = call_user_func("frontendusers_".$plugin."_wantedVariables"); + if (is_array($wantVariables)) { + $varArray = array(); + foreach ($wantVariables as $value) { + $varArray[$value] = stripslashes($GLOBALS[$value]); + } + } + $store = call_user_func("frontendusers_".$plugin."_store", $varArray); + } + } + } + } + if($bStore) $oFeUser->store(); + } + + if (count($messages) > 0) { + $notis = $notification->returnNotification("warning", implode("
    ", $messages)) . "
    "; + } + + + $form = new UI_Table_Form("properties"); + $form->setSubmitJS("return checkUserForm();"); + $form->setVar("frame", $frame); + $form->setVar("area", $area); + $form->setVar("action", "frontend_save_user"); + $form->setVar("idfrontenduser", $idfrontenduser); + + $form->addHeader(i18n("Edit user")); + + $username = new cHTMLTextbox("username", ((isset($_POST['username']) && $bStore === false)?$_POST['username']:$oFeUser->get("username")),40); + $newpw = new cHTMLPasswordBox("newpd","",40); + $newpw2 = new cHTMLPasswordBox("newpd2","",40); + $active = new cHTMLCheckbox("active","1"); + $active->setChecked($oFeUser->get("active")); + + $form->add(i18n("User name"), $username->render()); + $form->add(i18n("New password"), $newpw->render()); + $form->add(i18n("New password (again)"), $newpw2->render()); + $form->add(i18n("Active"), $active->toHTML(false)); + + $pluginOrder = trim_array(explode(",",getSystemProperty("plugin", "frontendusers-pluginorder"))); + + /* Check out if there are any plugins */ + if (is_array($pluginOrder)) { + foreach ($pluginOrder as $plugin) { + if (function_exists("frontendusers_".$plugin."_getTitle") && + function_exists("frontendusers_".$plugin."_display")) { + # check if user belongs to a specific group + # if true display frontenduser plugin + if (function_exists("frontendusers_".$plugin."_checkUserGroup")) { + $bCheckUserGroup = call_user_func("frontendusers_".$plugin."_checkUserGroup"); + } else { + $bCheckUserGroup = true; + } + + if ($bCheckUserGroup) { + $plugTitle = call_user_func("frontendusers_".$plugin."_getTitle"); + $display = call_user_func("frontendusers_".$plugin."_display", $oFeUser); + + if (is_array($plugTitle) && is_array($display)) { + foreach ($plugTitle as $key => $value) { + $form->add($value, $display[$key]); + } + } else { + if (is_array($plugTitle) || is_array($display)) { + $form->add(i18n("WARNING"), sprintf(i18n("The plugin %s delivered an array for the displayed titles, but did not return an array for the contents."), $plugin)); + } else { + $form->add($plugTitle, $display); + } + } + } + } + } + + $arrGroups = $oFeUser->getGroupsForUser(); + + if(count($arrGroups) > 0) { + $aMemberGroups = array(); + + foreach($arrGroups as $iGroup) { + $oMemberGroup = new FrontendGroup($iGroup); + $aMemberGroups[] = $oMemberGroup->get("groupname"); + } + asort($aMemberGroups); + + $sTemp = implode('
    ', $aMemberGroups); + } else { + $sTemp = i18n("none"); + } + + $form->add(i18n("Group membership"), $sTemp ); + $form->add(i18n("Author"), $classuser->getUserName($oFeUser->get("author")) . " (". $oFeUser->get("created").")" ); + $form->add(i18n("Last modified by"), $classuser->getUserName($oFeUser->get("modifiedby")). " (". $oFeUser->get("modified").")" ); +} +//$sDialog = '
    I\'m in a dialog
    '; +$sDialog = ""; +$oPage->setContent( $notis . $form->render(true). $sDialog); +$oPage->addScript('reload', $sReloadScript); +} else { + $oPage->setContent(""); +} +$oPage->render(); +?> diff --git a/conlite/includes/include.frontend.user_menu.php b/conlite/includes/include.frontend.user_menu.php new file mode 100644 index 0000000..23568cb --- /dev/null +++ b/conlite/includes/include.frontend.user_menu.php @@ -0,0 +1,373 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.frontend.user_menu.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oPage = new cPage; +// +///* Set default values */ +$oUser = new cApiUser($auth->auth["uid"]); +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST['elemperpage']) || $_REQUEST['elemperpage'] <= 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); +} +if (!is_numeric($_REQUEST['elemperpage'])) { + $_REQUEST['elemperpage'] = 25; +} +$oUser->setProperty("itemsperpage", $area, $_REQUEST["elemperpage"]); +unset ($oUser); + +if (!isset($_REQUEST["page"]) || !is_numeric($_REQUEST['page']) || $_REQUEST['page'] <= 0 || $_REQUEST["elemperpage"] == 0) { + $_REQUEST["page"] = 1; +} + +$aFieldsToSearch = array("--all--" => i18n("-- All fields --"), "username" => i18n("Username")); +$aFieldsToSort = array("username" => i18n("Username")); + +$aFieldSources = array(); +$aFieldSources["username"] = "base"; + +$bUsePlugins = getEffectiveSetting("frontendusers", "pluginsearch", "true"); + +if ($bUsePlugins == "false") +{ + $bUsePlugins = false; +} else { + $bUsePlugins = true; +} + +if (is_array($cfg['plugins']['frontendusers'])) +{ + foreach ($cfg['plugins']['frontendusers'] as $plugin) + { + plugin_include("frontendusers", $plugin."/".$plugin.".php"); + } +} + +if ($bUsePlugins == true) +{ + if (is_array($cfg['plugins']['frontendusers'])) + { + $_sValidPlugins = getEffectiveSetting("frontendusers", "pluginsearch_valid_plugins", ''); + $_aValidPlugins = array(); + if (strlen($_sValidPlugins)>0) { + $_aValidPlugins = explode(',', $_sValidPlugins); + } + $_iCountValidPlugins = sizeof($_aValidPlugins); + foreach ($cfg['plugins']['frontendusers'] as $plugin) + { + if ($_iCountValidPlugins == 0 || in_array($plugin, $_aValidPlugins)) { + if (function_exists("frontendusers_".$plugin."_wantedVariables") && function_exists("frontendusers_".$plugin."_canonicalVariables")) + { + $aVariableNames = call_user_func("frontendusers_".$plugin."_canonicalVariables"); + + if (is_array($aVariableNames)) + { + $aTmp = array_merge($aFieldsToSearch, $aVariableNames); + $aFieldsToSearch = $aTmp; + + $aTmp2 = array_merge($aFieldsToSort, $aVariableNames); + $aFieldsToSort = $aTmp2; + + foreach ($aVariableNames as $sVariableName => $name) + { + $aFieldSources[$sVariableName] = $plugin; + } + } + } + } + } + } +} + +$aSortOrderOptions = array ("asc" => i18n("Ascending"), "desc" => i18n("Descending")); + +$oListOptionRow = new cFoldingRow("f081b6ab-370d-4fd8-984f-6b38590fe48b", i18n("List options")); + +$oSelectItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelectItemsPerPage->autoFill(array(25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelectItemsPerPage->setDefault($_REQUEST["elemperpage"]); + +asort($aFieldsToSort); +asort($aFieldsToSearch); + +$oSelectSortBy = new cHTMLSelectElement("sortby"); +$oSelectSortBy->autoFill($aFieldsToSort); +$oSelectSortBy->setDefault($_REQUEST["sortby"]); + +$oSelectSortOrder = new cHTMLSelectElement("sortorder"); +$oSelectSortOrder->autoFill($aSortOrderOptions); +$oSelectSortOrder->setDefault($_REQUEST["sortorder"]); + +$oSelectSearchIn = new cHTMLSelectElement("searchin"); +$oSelectSearchIn->autoFill($aFieldsToSearch); +$oSelectSearchIn->setDefault($_REQUEST["searchin"]); + +$fegroups = new FrontendGroupCollection; +$fegroups->setWhere("idclient", $client); +$fegroups->query(); + +$aFEGroups = array("--all--" => i18n("-- All Groups --")); + +while ($fegroup = $fegroups->next()) +{ + $aFEGroups[$fegroup->get("idfrontendgroup")] = $fegroup->get("groupname"); +} + +$oSelectRestrictGroup = new cHTMLSelectElement("restrictgroup"); +$oSelectRestrictGroup->autoFill($aFEGroups); +$oSelectRestrictGroup->setDefault($_REQUEST["restrictgroup"]); + +$oTextboxFilter = new cHTMLTextbox("filter", $_REQUEST["filter"], 20); + +$oFEUsers = new FrontendUserCollection; +$oFEUsers->setWhere("FrontendUserCollection.idclient", $client); + +if (strlen($_REQUEST["filter"]) > 0 && $bUsePlugins == false) +{ + $oFEUsers->setWhere("FrontendUsercollection.username", $_REQUEST["filter"], "diacritics"); +} + +if ($_REQUEST["restrictgroup"] != "" && $_REQUEST["restrictgroup"] != "--all--") +{ + $oFEUsers->link("FrontendGroupMemberCollection"); + $oFEUsers->setWhere("FrontendGroupMemberCollection.idfrontendgroup", $_REQUEST["restrictgroup"]); +} + +$mPage = $_REQUEST["page"]; +$elemperpage = $_REQUEST["elemperpage"]; + +$iFullTableCount = 0; +if ($bUsePlugins == false) +{ + $oFEUsers->query(); + + $iFullTableCount = $oFEUsers->count(); + + $oFEUsers->setOrder(implode(" ", array($oSelectSortBy->getDefault(), $oSelectSortOrder->getDefault()))); + $oFEUsers->setLimit($elemperpage * ($mPage - 1), $elemperpage); +} else { + $oFEUsers->query(); + $iFullTableCount = $oFEUsers->count(); +} + +if ($_REQUEST["elemperpage"]*($_REQUEST["page"]) >= $iFullTableCount+$_REQUEST["elemperpage"] && $_REQUEST["page"] != 1) { + $_REQUEST["page"]--; + $mPage--; +} + +$oFEUsers->query(); + +$aUserTable = array(); + +while ($feuser = $oFEUsers->next()) +{ + foreach ($aFieldSources as $key => $field) + { + $idfrontenduser = $feuser->get("idfrontenduser"); + + $aUserTable[$idfrontenduser]["idfrontenduser"] = $idfrontenduser; + + switch ($field) + { + case "base": + $aUserTable[$idfrontenduser][$key] = $feuser->get("username"); + break; + default: + if ($_REQUEST["filter"] != "") + { + $aUserTable[$idfrontenduser][$key] = call_user_func("frontendusers_".$field."_getvalue", $key); + } + break; + } + } + + if ($_REQUEST["filter"] != "") + { + if ($_REQUEST["searchin"] == "--all--" || $_REQUEST["searchin"] == "") + { + $found = false; + + foreach ($aUserTable[$idfrontenduser] as $key => $value) + { + if (stripos($value, $_REQUEST["filter"]) !== false) + { + $found = true; + } + } + + if ($found == false) + { + unset($aUserTable[$idfrontenduser]); + } + + } else { + if (stripos($aUserTable[$idfrontenduser][$_REQUEST["searchin"]], $_REQUEST["filter"]) === false) + { + unset($aUserTable[$idfrontenduser]); + } + } + } +} + +if ($_REQUEST["sortorder"] == "desc") +{ + $sortorder = SORT_DESC; +} else { + $sortorder = SORT_ASC; +} + +if ($_REQUEST["sortby"]) +{ + $aUserTable = array_csort($aUserTable, $_REQUEST["sortby"], $sortorder); +} else { + $aUserTable = array_csort($aUserTable, "username", $sortorder); +} + +$mlist = new UI_Menu; +$iMenu = 0; +$iItemCount = 0; + +foreach ($aUserTable as $mkey => $params) +{ + $idfrontenduser = $params["idfrontenduser"]; + $link = new cHTMLLink; + $link->setMultiLink($area, "", $area, ""); + $link->setCustom("idfrontenduser", $idfrontenduser); + + $iItemCount++; + + if (($iItemCount > ($elemperpage * ($mPage - 1)) && $iItemCount < (($elemperpage * $mPage) + 1)) || $bUsePlugins == false) + { + $iMenu++; + + $message = sprintf(i18n("Do you really want to delete the user %s?"), clHtmlSpecialChars($params["username"])); + + $delTitle = i18n("Delete user"); + $deletebutton = ''.$delTitle.''; + + $mlist->setTitle($iMenu, $params["username"]); + $mlist->setLink($iMenu, $link); + $mlist->setActions($iMenu, "delete", $deletebutton); + $mlist->setImage($iMenu, ""); + + if ($_GET['frontenduser'] == $idfrontenduser) { + $mlist->setExtra($iMenu, 'id="marked" '); + } + } +} + +if ($bUsePlugins == false) +{ + $iItemCount = $iFullTableCount; +} + +$deleteScript = ''; + +$sInitRowMark = ""; + +$oPage->setMargin(0); +$oPage->addScript('messagebox', ''); +$oPage->addScript('delete', $deleteScript); +//$oPage->addScript('cfoldingrow.js', ''); +$oPage->addScript('parameterCollector.js', ''); + +//generate current content for Object Pager +$oPagerLink = new cHTMLLink; +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setLink("main.php"); +$oPagerLink->setCustom("elemperpage", $elemperpage); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("searchin", $_REQUEST["searchin"]); +$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("frame", $frame); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +$oPager = new cObjectPager("25c6a67d-a3f1-4ea4-8391-446c131952c9", $iItemCount, $_REQUEST['elemperpage'], $mPage, $oPagerLink, "page", $pagingLink); + +//add slashes, to insert in javascript +$sPagerContent = $oPager->render(1); +$sPagerContent = str_replace('\\', '\\\\', $sPagerContent); +$sPagerContent = str_replace('\'', '\\\'', $sPagerContent); + +//send new object pager to left_top +$sRefreshPager = ' + '; + +$oPage->addScript('refreshpager', $sRefreshPager); +$oPage->setContent($mlist->render(false).$sInitRowMark); +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_create.php b/conlite/includes/include.grouprights_create.php new file mode 100644 index 0000000..9312882 --- /dev/null +++ b/conlite/includes/include.grouprights_create.php @@ -0,0 +1,181 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2011-02-07, Murat Purc, Cleanup, optimization and formatting + * + * $Id: include.grouprights_create.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude('includes', 'functions.rights.php'); + + +if (!$perm->have_perm_area_action($area, $action)) { + // access denied + $notification->displayNotification('error', i18n('Permission denied')); + return; +} + + +// create group instance +$oGroup = new Group(); +$bError = false; +$sNotification = ''; +$aPerms = array(); + +if ($action == 'group_create') { + $aPerms = buildUserOrGroupPermsFromRequest(); + + if ($groupname == '') { + $groupname = 'grp_' . i18n("New Group"); + } + + if (substr($groupname, 0, 4) != 'grp_') { + $groupname = 'grp_' . $groupname; + } + $newgroupid = md5($groupname); + + $oGroup->setField('groupname', Contenido_Security::escapeDB($groupname, $db)); + $oGroup->setField('perms', Contenido_Security::escapeDB(implode(',', $aPerms), $db)); + $oGroup->setField('description', Contenido_Security::escapeDB($description, $db)); + $oGroup->setField('group_id', Contenido_Security::escapeDB($newgroupid, $db)); + if ($oGroup->insert()) { + // clean "old" values... + $sNotification = $notification->returnNotification("info", i18n("group created")); + $groupname = ''; + $aPerms = array(); + $description = ''; + } else { + $sNotification = $notification->returnNotification("info", i18n("Group couldn't created")); + $bError = true; + } +} + +$tpl->reset(); +$tpl->set('s','NOTIFICATION', $sNotification); + +$form = '
    + '.$sess->hidden_session(true).' + + + + '; + +$tpl->set('s', 'FORM', $form); +$tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('s', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('s', 'SUBMITTEXT', i18n("Save changes")); + +$tpl->set('d', 'CATNAME', i18n("Property")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', i18n("Value")); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Group name")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +if ($action == 'group_create' && !$bError) { + $tpl->set('d', 'CATFIELD', substr($groupname, 4)); +} else { + $tpl->set('d', 'CATFIELD', formGenerateField('text', 'groupname', stripslashes(substr($groupname, 4)), 40, 32)); +} +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Description")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'description', stripslashes($description), 40, 255)); +$tpl->next(); + +// permissions of current logged in user +$aAuthPerms = explode(',', $auth->auth['perm']); + +// sysadmin perm +if (in_array('sysadmin', $aAuthPerms)) { + $tpl->set('d', 'CATNAME', i18n("System administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateCheckbox('msysadmin', '1', in_array('sysadmin', $aPerms))); + $tpl->next(); +} + +// clients admin perms +$oClientsCollection = new cApiClientCollection(); +$aClients = $oClientsCollection->getAvailableClients(); +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if (in_array("admin[".$idclient."]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("madmin[".$idclient."]", $idclient, in_array("admin[".$idclient."]", $aPerms), $item['name'] . " (".$idclient.")")."
    "; + } +} + +if ($sClientCheckboxes !== '') { + $tpl->set('d', 'CATNAME', i18n("Administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// clients perms +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if (in_array("client[".$idclient."]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms) || in_array("admin[".$idclient."]", $aAuthPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("mclient[".$idclient."]", $idclient, in_array("client[".$idclient."]", $aPerms), $item['name'] . " (". $idclient . ")")."
    "; + } +} + +$tpl->set('d', 'CATNAME', i18n("Access clients")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', $sClientCheckboxes); +$tpl->next(); + + +// languages perms +$aClientsLanguages = getAllClientsAndLanguages(); +$sClientCheckboxes = ''; +foreach ($aClientsLanguages as $item) { + if ($perm->have_perm_client("lang[".$item['idlang']."]") || $perm->have_perm_client("admin[".$item['idclient']."]")) { + $sClientCheckboxes .= formGenerateCheckbox("mlang[".$item['idlang']."]", $item['idlang'], in_array("lang[".$item['idlang']."]", $aPerms), $item['langname']." (". $item['clientname'] .")")."
    "; + } +} + +$tpl->set('d', 'CATNAME', i18n("Access languages")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', $sClientCheckboxes); +$tpl->next(); + +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['grouprights_create']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_details.php b/conlite/includes/include.grouprights_details.php new file mode 100644 index 0000000..d090391 --- /dev/null +++ b/conlite/includes/include.grouprights_details.php @@ -0,0 +1,171 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.grouprights_details.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$idclient = 2; +$idlang = 2; +die; + +$sql = 'SELECT * FROM '.$cfg["tab"]["rights"].' WHERE idlang = 2 AND idclient = 2 AND user_id = \"'.Contenido_Security::escapeDB($userid, $db).'\"'; +echo $sql; + +$db->query($sql); + +while ($db->next_record()) +{ + echo $db->f(0)."
    "; +} + +if ( !isset($useridas) ) +{ + +} else { + + if ($action == "user_edit") + { + + if (strlen($password) > 0) + { + if (strcmp($password, $passwordagain) == 0) + { + $sql = 'UPDATE + '.$cfg["tab"]["phplib_auth_user_md5"].' + SET + password="'.md5($password).'" + WHERE + user_id = "'.Contenido_Security::escapeDB($userid, $db).'"'; + + $db->query($sql); + } else { + $error = "Passwords don't match"; + } + } + + $sql = 'UPDATE + '.$cfg["tab"]["phplib_auth_user_md5"].' + SET + realname="'.Contenido_Security::escapeDB($realname, $db).'", + email="'.Contenido_Security::escapeDB($email, $db).'", + telephone="'.Contenido_Security::escapeDB($telephone, $db).'", + address_street="'.Contenido_Security::escapeDB($address_street, $db).'", + address_city="'.Contenido_Security::escapeDB($address_city, $db).'", + address_country="'.Contenido_Security::escapeDB($address_country, $db).'", + wysi="'.Contenido_Security::toInteger($wysi).'" + WHERE + user_id = "'.Contenido_Security::escapeDB($userid, $db).'"'; + + $db->query($sql); + } + + $tpl->reset(); + + $sql = "SELECT + username, password, realname, email, telephone, + address_street, address_city, address_country, wysi + FROM + ".$cfg["tab"]["phplib_auth_user_md5"]." + WHERE + user_id = '".Contenido_Security::escapeDB($userid, $db)."'"; + + $db->query($sql); + + $form = ' + '.$sess->hidden_session().' + + + + + '; + + $db->next_record(); + + + $tpl->set('s', 'USERNAME', $db->f("username")); + $tpl->set('s', 'EDITSTRING', "Benutzer editieren:"); + $tpl->set('s', 'FORM', $form); + $tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('s', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('s', 'SUBMITTEXT', "�nderungen übernehmen"); + if ($error) + { + echo $error; + } + $tpl->set('d', 'CATNAME', "Name"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "realname", $db->f("realname"), 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "Neues Passwort"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("password", "password", "", 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "Neues Passwort (Best�tigung)"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("password", "passwordagain", "", 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "E-Mail"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "email", $db->f("email"), 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "Telefon"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "telephone", $db->f("telephone"), 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "Strasse"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "address_street", $db->f("address_street"), 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "Stadt"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "address_city", $db->f("address_city"), 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "Land"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateField ("text", "address_country", $db->f("address_country"), 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', "WYSIWYG-Editor"); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', formGenerateCheckbox("wysi", "1", $db->f("wysi"))); + $tpl->next(); + + # Generate template + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['rights_details']); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_external.php b/conlite/includes/include.grouprights_external.php new file mode 100644 index 0000000..f101dae --- /dev/null +++ b/conlite/includes/include.grouprights_external.php @@ -0,0 +1,59 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-16, Holger Librenz, Hotifc: added check for invalid calls + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.grouprights_external.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// @TODO: check the code beneath is necessary +if (isset($_REQUEST['sAreaFilename'])) { + die ('Invalid call!'); +} + +$_cecIterator = $_cecRegistry->getIterator("Contenido.Permissions.Group.GetAreaEditFilename"); + +while ($chainEntry = $_cecIterator->next()) +{ + // @TODO: This has to be refactored because this could cause SQL-Injection, Remote-File-Inclusion .... + $aInfo = $chainEntry->execute($_REQUEST["external_area"]); + if ($aInfo !== false) + { + $sAreaFilename = $aInfo; + break; + } +} + +if ($sAreaFilename !== false) +{ + include($sAreaFilename); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_left_top.php b/conlite/includes/include.grouprights_left_top.php new file mode 100644 index 0000000..6e076f5 --- /dev/null +++ b/conlite/includes/include.grouprights_left_top.php @@ -0,0 +1,94 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-29 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.grouprights_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// The following lines unset all right objects since +// I don't know (or I was unable to find out) if they +// are global and/or session variables - so if you are +// switching between groups and user management, we are +// safe. +unset($right_list); +unset($rights_list_old); +unset($rights_perms); +$right_list = ""; +$rights_list_old = ""; +$rights_perms = ""; + +$tpl->set('s', 'ID', 'oTplSel'); +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'SESSID', $sess->id); +$tpl->set('s', 'SID', $sess->id); + +$tpl2 = new Template; +$tpl2->set('s', 'NAME', 'restrict'); +$tpl2->set('s', 'CLASS', 'text_medium'); +$tpl2->set('s', 'OPTIONS', 'onchange="groupChangeRestriction()"'); + +$limit = array( + "2" => i18n("All"), + "1" => i18n("Frontend only"), + "3" => i18n("Backend only")); + +foreach ($limit as $key => $value) { + + if ($restrict == $key) + { + $selected = "selected"; + } else { + $selected = ""; + } + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value); + $tpl2->set('d', 'SELECTED', $selected); + $tpl2->next(); + +} + +$select = $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true); + + +$tpl->set('s', 'CAPTION', ''); + +$tmp_mstr = '%s'; +$area = "group"; +$mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=groups_create&frame=3"), + 'right_bottom', + $sess->url("main.php?area=groups_create&frame=4"), + i18n("Create group")); +$tpl->set('s', 'NEWGROUP', $mstr); + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['grouprights_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_menu.php b/conlite/includes/include.grouprights_menu.php new file mode 100644 index 0000000..8c8e2d4 --- /dev/null +++ b/conlite/includes/include.grouprights_menu.php @@ -0,0 +1,212 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * + * $Id: include.grouprights_menu.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); +$tpl->set('s', 'SID', $sess->id); + +if (($action == "group_delete") && ($perm->have_perm_area_action($area, $action))) { + + $sql = "DELETE FROM " + .$cfg["tab"]["groups"]. + " WHERE + group_id = \"" .Contenido_Security::escapeDB($groupid, $db)."\""; + $db->query($sql); + + $sql = "DELETE FROM ". + $cfg["tab"]["groupmembers"]. + " WHERE group_id = \"" .Contenido_Security::escapeDB($groupid, $db)."\""; + + $db->query($sql); + + + $sql = "DELETE FROM ". + $cfg["tab"]["rights"]. + " WHERE user_id = \"" .Contenido_Security::escapeDB($groupid, $db)."\""; + + $db->query($sql); +} + +$sql = "SELECT + groupname, group_id, perms + FROM + ".$cfg["tab"]["groups"]." + ORDER BY + groupname ASC"; + + +if ($restriction == 1) +{ + $sql = "SELECT + A.groupname AS groupname, A.group_id as group_id, A.perms as perms + FROM + ".$cfg["tab"]["groups"]." AS A, + ".$cfg["tab"]["rights"]." AS B, + ".$cfg["tab"]["actions"]." AS C + WHERE + C.name = 'front_allow' AND + B.user_id = A.group_id AND + C.idaction = B.idaction AND + A.perms LIKE '' + GROUP BY + group_id + ORDER BY + groupname ASC"; +} + +if ($restriction == 3) +{ + $sql = "SELECT + A.groupname AS groupname, A.group_id as group_id, A.perms as perms + FROM + ".$cfg["tab"]["groups"]." AS A, + ".$cfg["tab"]["rights"]." AS B, + ".$cfg["tab"]["actions"]." AS C + WHERE + C.name NOT LIKE 'front_allow' AND + B.user_id = A.group_id AND + C.idaction = B.idaction AND + A.perms NOT LIKE '' + GROUP BY + group_id + ORDER BY + groupname ASC"; +} +$db->query($sql); + +// Empty Row +$bgcolor = '#FFFFFF'; +$tpl->set('s', 'PADDING_LEFT', '10'); +$thisperm = explode(',', $auth->auth['perm']); + +$accessibleClients = $classclient->getAccessibleClients(); + +while ($db->next_record()) +{ + + $groupperm = explode(',', $db->f('perms')); + + $allow = false; + + // Sysadmin check + if (in_array("sysadmin", $thisperm)) + { + $allow = true; + } + + // Admin check + foreach ($accessibleClients as $key => $value) + { + if (in_array("client[".$key."]", $groupperm)) + { + $allow = true; + } + } + + // Group check + foreach ($groupperm as $localperm) + { + + if (in_array($localperm, $thisperm)) + { + $allow = true; + } + + } + + if ($allow == true) + { + + $dark = !$dark; + if ($dark) { + $bgColor = $cfg["color"]["table_dark"]; + } else { + $bgColor = $cfg["color"]["table_light"]; + } + + $groupid = $db->f("group_id"); + $groupname = $db->f("groupname"); + + $groupname = substr($groupname, 4); + + $tmp_mstr = '%s'; + $area = "groups"; + $mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&groupid=$groupid"), + 'right_bottom', + $sess->url("main.php?area=groups_overview&frame=4&groupid=$groupid"), + $groupname); + + $mstr2 = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&groupid=$groupid"), + 'right_bottom', + $sess->url("main.php?area=groups_overview&frame=4&groupid=$groupid"), + ''); + + if ($perm->have_perm_area_action('groups',"groups_delete") ) { + $message = sprintf(i18n("Do you really want to delete the group %s?"),clHtmlSpecialChars($groupname)); + $deletebutton = "\"".$lngUpl["delfolder"]."\""; + } else { + $deletebutton = ""; + } + + if ($_GET['groupid'] == $groupid) { + $bgColor = $cfg['color']['table_light_active']; + $tpl->set('d', 'ID_MARKED', 'marked'); + } else { + $tpl->set('d', 'ID_MARKED', ''); + } + + $tpl->set('d', 'BGCOLOR', $bgColor); + $tpl->set('d', 'TEXT', $mstr); + $tpl->set('d', 'ICON', $mstr2); + + if ($perm->have_perm_area_action('groups',"groups_delete") ) { + $delTitle = i18n("Delete group"); + $delDescr = sprintf(i18n("Do you really want to delete the following group:

    %s
    "),clHtmlSpecialChars($groupname)); + + + $tpl->set('d', 'DELETE', ''.$delTitle.''); + } else { + $tpl->set('d', 'DELETE', ' '); + } + + $tpl->next(); + } +} + +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['grouprights_menu']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_overview.php b/conlite/includes/include.grouprights_overview.php new file mode 100644 index 0000000..59d079d --- /dev/null +++ b/conlite/includes/include.grouprights_overview.php @@ -0,0 +1,231 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2011-02-07, Murat Purc, Cleanup, optimization and formatting + * + * $Id: include.grouprights_overview.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude('includes', 'functions.rights.php'); + + +if (!$perm->have_perm_area_action($area, $action)) { + // access denied + $notification->displayNotification('error', i18n('Permission denied')); + return; +} + +if (!isset($groupid)) { + // no group id, get out here + return; +} + +// create group instance +$oGroup = new Group(); +$oGroup->loadGroupByGroupID($groupid); +$bError = false; +$sNotification = ''; +$aPerms = array(); + +// edit group +if (($action == 'group_edit')) { + $aPerms = buildUserOrGroupPermsFromRequest(); + $oGroup->setField('description', Contenido_Security::escapeDB($description, $db)); + $oGroup->setField('perms', Contenido_Security::escapeDB(implode(',', $aPerms), $db)); + + if ($oGroup->store()) { + $sNotification = $notification->returnNotification("info", i18n("Changes saved")); + } else { + $sNotification = $notification->returnNotification("warn", i18n("Changes couldn't saved")); + $bError = true; + } +} + +// delete group property +if (is_string($del_groupprop_type) && is_string($del_groupprop_name)) { + $oGroup->deleteGroupProperty($del_groupprop_type, $del_groupprop_name); +} + +// add group property +if (is_string($groupprop_type) && is_string($groupprop_name) && is_string($groupprop_value) + && !empty($groupprop_type) && !empty($groupprop_name)) { + $oGroup->setGroupProperty($groupprop_type, $groupprop_name, $groupprop_value); +} + + +$aPerms = explode(',', $oGroup->getField('perms')); + +$tpl->reset(); +$tpl->set('s','NOTIFICATION', $sNotification); + +$form = ' + '.$sess->hidden_session(true).' + + + + + '; + +$tpl->set('s', 'FORM', $form); +$tpl->set('s', 'GET_GROUPID', $groupid); + +$tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('s', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('s', 'SUBMITTEXT', i18n("Save changes")); +$tpl->set('s', 'CANCELTEXT', i18n("Discard changes")); +$tpl->set('s', 'CANCELLINK', $sess->url("main.php?area=$area&frame=4&groupid=$groupid")); + +$tpl->set('d', 'CATNAME', i18n("Property")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', i18n("Value")); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Groupname")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', substr(stripslashes($oGroup->getField('groupname')),4)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Description")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'description', stripslashes($oGroup->getField('description')), 40, 255)); +$tpl->next(); + +// permissions of current logged in user +$aAuthPerms = explode(',', $auth->auth['perm']); + +// sysadmin perm +if (in_array('sysadmin', $aAuthPerms)) { + $tpl->set('d', 'CATNAME', i18n("System administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateCheckbox('msysadmin', '1', in_array('sysadmin', $aPerms))); + $tpl->next(); +} + +// clients admin perms +$oClientsCollection = new cApiClientCollection(); +$aClients = $oClientsCollection->getAvailableClients(); +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if (in_array("admin[".$idclient."]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("madmin[".$idclient."]", $idclient, in_array("admin[".$idclient."]", $aPerms), $item['name']." (".$idclient.")")."
    "; + } +} + +if ($sClientCheckboxes !== '' && !in_array('sysadmin', $aPerms)) { + $tpl->set('d', 'CATNAME', i18n("Administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// clients perms +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if ((in_array("client[".$idclient."]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms) || in_array("admin[".$idclient."]", $aAuthPerms)) && !in_array("admin[".$idclient."]", $aPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("mclient[".$idclient."]", $idclient, in_array("client[".$idclient."]", $aPerms), $item['name']." (". $idclient . ")")."
    "; + } +} + +if ($sClientCheckboxes != '' && !in_array('sysadmin', $aPerms)) { + $tpl->set('d', 'CATNAME', i18n("Access clients")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// languages perms +$aClientsLanguages = getAllClientsAndLanguages(); +$sClientCheckboxes = ''; +foreach ($aClientsLanguages as $item) { + if (($perm->have_perm_client("lang[".$item['idlang']."]") || $perm->have_perm_client("admin[".$item['idclient']."]")) && !in_array("admin[".$item['idclient']."]", $aPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("mlang[".$item['idlang']."]", $item['idlang'], in_array("lang[".$item['idlang']."]", $aPerms), $item['langname']." (". $item['clientname'] .")")."
    "; + } +} + +if ($sClientCheckboxes != '' && !in_array('sysadmin', $aPerms)) { + $tpl->set('d', 'CATNAME', i18n("Access languages")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// group properties +$aProperties = $oGroup->getGroupProperties(); +$sPropRows = ''; +foreach ($aProperties as $propertyId => $prop) { + $type = $prop['type']; + $name = $prop['name']; + $value = $prop['value']; + $sPropRows .= ' + + ' . $type . ' + ' . $name . ' + ' . $value . ' + + Eigenschaft l�schen + + '; +} + +$table = ' + + + + + + + + ' . $sPropRows . ' + + + + + + +
    '.i18n("Area/Type").''.i18n("Property").''.i18n("Value").' 
     
    '; + +$tpl->set('d', 'CATNAME', i18n("User-defined properties")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', $table); +$tpl->next(); + +// Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['grouprights_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.grouprights_subnav.php b/conlite/includes/include.grouprights_subnav.php new file mode 100644 index 0000000..bd53f19 --- /dev/null +++ b/conlite/includes/include.grouprights_subnav.php @@ -0,0 +1,145 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-25 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.grouprights_subnav.php 22 2011-08-25 09:58:43Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( isset($_GET['groupid']) ) { + + $area = $_GET['area']; + + $nav = new Contenido_Navigation; + + + + $sql = "SELECT + idarea + FROM + ".$cfg["tab"]["area"]." AS a + WHERE + a.name = '".Contenido_Security::escapeDB($area, $db)."' OR + a.parent_id = '".Contenido_Security::escapeDB($area, $db)."' + ORDER BY + idarea"; + + $db->query($sql); + + $in_str = ""; + + while ( $db->next_record() ) { + $in_str .= $db->f('idarea') . ','; + } + + $len = strlen($in_str)-1; + $in_str = substr($in_str, 0, $len); + $in_str = '('.$in_str.')'; + + $sql = "SELECT + b.location AS location, + a.name AS name + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.idarea IN ".Contenido_Security::escapeDB($in_str, $db)." AND + b.idarea = a.idarea AND + b.level = 1 AND + b.online = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + + while ( $db->next_record() ) { + + /* Extract names from the XML document. */ + $caption = $nav->getName($db->f("location")); + $tmp_area = $db->f("name"); + + if ($perm->have_perm_area_action($tmp_area)) + { + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + + } + } + + $_cecIterator = $_cecRegistry->getIterator("Contenido.Permissions.Group.Areas"); + + if ($_cecIterator->count() > 0) + { + while ($chainEntry = $_cecIterator->next()) + { + $aInfo = $chainEntry->execute(); + + foreach ($aInfo as $key => $sAreaID) + { + $sAreaName = false; + $_cecIterator2 = $_cecRegistry->getIterator("Contenido.Permissions.Group.GetAreaName"); + while ($chainEntry2 = $_cecIterator2->next()) + { + $aInfo2 = $chainEntry2->execute($sAreaID); + if ($aInfo2 !== false) + { + $sAreaName = $aInfo2; + break; + } + } + + if ($sAreaName !== false) + { + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$sAreaName.''); + $tpl->next(); + } + } + } + } + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); + +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.html_tpl_edit_form.php b/conlite/includes/include.html_tpl_edit_form.php new file mode 100644 index 0000000..8bf3782 --- /dev/null +++ b/conlite/includes/include.html_tpl_edit_form.php @@ -0,0 +1,228 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-07-14 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-08-14, Timo Trautmann, Bilal Arslan - Functions for versionning and storing file meta data added + * + * $Id: include.html_tpl_edit_form.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("external", "edit_area/class.edit_area.php"); +cInclude("includes", "functions.file.php"); + +$sFileType = "html"; + +$sActionCreate = 'htmltpl_create'; +$sActionEdit = 'htmltpl_edit'; + +$page = new cPage; + +$tpl->reset(); + +if (!$perm->have_perm_area_action($area, $action)) +{ + $notification->displayNotification("error", i18n("Permission denied")); +} else if (!(int) $client > 0) { + #if there is no client selected, display empty page + $page->render(); +} else { + $path = $cfgClient[$client]["tpl"]["path"]; + $sTempFilename = stripslashes($_REQUEST['tmp_file']); + $sOrigFileName = $sTempFilename; + + if (getFileType($_REQUEST['file']) != $sFileType AND strlen(stripslashes(trim($_REQUEST['file']))) > 0) + { + $sFilename .= stripslashes($_REQUEST['file']).".$sFileType"; + } else + { + $sFilename .= stripslashes($_REQUEST['file']); + } + + if (stripslashes($_REQUEST['file'])) { + $sReloadScript = ""; + } else { + $sReloadScript = ""; + } + + // Content Type is template + $sTypeContent = "templates"; + $aFileInfo = getFileInformation ($client, $sTempFilename, $sTypeContent, $db); + + # create new file + if ( $_REQUEST['action'] == $sActionCreate AND $_REQUEST['status'] == 'send') + { + $sTempFilename = $sFilename; + createFile($sFilename, $path); + $bEdit = fileEdit($sFilename, $_REQUEST['code'], $path); + $sReloadScript .= ""; + updateFileInformation($client, $sFilename, 'templates', $auth->auth['uid'], $_REQUEST['description'], $db); + } + + # edit selected file + if ( $_REQUEST['action'] == $sActionEdit AND $_REQUEST['status'] == 'send') + { + if ($sFilename != $sTempFilename) + { + $sTempFilename = renameFile($sTempFilename, $sFilename, $path); + $sReloadScript .= ""; + } else + { + $sTempFilename = $sFilename; + } + + updateFileInformation($client, $sOrigFileName, 'templates', $auth->auth['uid'], $_REQUEST['description'], $db, $sFilename); + + /** + * START TRACK VERSION + **/ + $sTypeContent = "templates"; + + if((count($aFileInfo) == 0) || ((int)$aFileInfo["idsfi"] == 0)) { + $aFileInfo = getFileInformation ($client, $sTempFilename, $sTypeContent, $db); + $aFileInfo['description'] = ''; + } + + if((count($aFileInfo) > 0) && ($aFileInfo["idsfi"] !="")) { + $oVersion = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFilename, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame, $sOrigFileName); + // Create new Layout Version in cms/version/css/ folder + $oVersion->createNewVersion(); + } + /** + * END TRACK VERSION + **/ + + $bEdit = fileEdit($sFilename, $_REQUEST['code'], $path); + + } + + # generate edit form + if (isset($_REQUEST['action'])) + { + $sAction = ($bEdit) ? $sActionEdit : $_REQUEST['action']; + + if ($_REQUEST['action'] == $sActionEdit) + { + $sCode = getFileContent($sFilename, $path); + } else + { + $sCode = stripslashes($_REQUEST['code']); # stripslashes is required here in case of creating a new file + } + + /* Try to validate html */ + if (getEffectiveSetting("layout", "htmlvalidator", "true") == "true" && $sCode !== "") + { + $v = new cHTMLValidator; + $v->validate($sCode); + $msg = ""; + + foreach ($v->missingNodes as $value) + { + $idqualifier = ""; + + $attr = array(); + + if ($value["name"] != "") + { + $attr["name"] = "name '".$value["name"]."'"; + } + + if ($value["id"] != "") + { + $attr["id"] = "id '".$value["id"]."'"; + } + + $idqualifier = implode(", ",$attr); + + if ($idqualifier != "") + { + $idqualifier = "($idqualifier)"; + } + $msg .= sprintf(i18n("Tag '%s' %s has no end tag (start tag is on line %s char %s)"), $value["tag"], $idqualifier, $value["line"],$value["char"]) . "
    "; + } + + if ($msg != "") + { + $notis = $notification->returnNotification("warning", $msg) . "
    "; + } + } + + $aFileInfo = getFileInformation($client, $sTempFilename, $sTypeContent, $db); + + $form = new UI_Table_Form("file_editor"); + $form->addHeader(i18n("Edit file")); + $form->setWidth("100%"); + $form->setVar("area", $area); + $form->setVar("action", $sAction); + $form->setVar("frame", $frame); + $form->setVar("status", 'send'); + $form->setVar("tmp_file", $sTempFilename); + + $tb_name = new cHTMLTextbox("file", $sFilename, 60); + $ta_code = new cHTMLTextarea("code", clHtmlSpecialChars($sCode), 100, 35, "code"); + $descr = new cHTMLTextarea("description", clHtmlSpecialChars($aFileInfo["description"]), 100, 5); + + $ta_code->setStyle("font-family: monospace;width: 100%;"); + $descr->setStyle("font-family: monospace;width: 100%;"); + $ta_code->updateAttributes(array("wrap" => getEffectiveSetting('html_editor', 'wrap', 'off'))); + + $form->add(i18n("Name"),$tb_name); + $form->add(i18n("Description"), $descr->render()); + $form->add(i18n("Code"),$ta_code); + + $page->setContent($notis . $form->render()); + + $oEditArea = new EditArea('code', 'html', substr(strtolower($belang), 0, 2), true, $cfg); + $page->addScript('editarea', $oEditArea->renderScript()); + + $page->addScript('reload', $sReloadScript); + $page->render(); + } + + +} +?> \ No newline at end of file diff --git a/conlite/includes/include.html_tpl_files_overview.php b/conlite/includes/include.html_tpl_files_overview.php new file mode 100644 index 0000000..a1ddca9 --- /dev/null +++ b/conlite/includes/include.html_tpl_files_overview.php @@ -0,0 +1,162 @@ + + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-07-14 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.html_tpl_files_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.file.php"); + +$tpl->reset(); + +if (!(int) $client > 0) { + #if there is no client selected, display empty page + $oPage = new cPage; + $oPage->render(); + return; +} + +$path = $cfgClient[$client]["tpl"]["path"]; +$sFileType = "html"; + +$sSession = $sess->id; + +$sArea = 'htmltpl'; +$sActionDelete = 'htmltpl_delete'; +$sActionEdit = 'htmltpl_edit'; + +$sScriptTemplate = ' + + + +'; + +$tpl->set('s', 'JAVASCRIPT', $sScriptTemplate); + +# delete file +if ($action == $sActionDelete) +{ + if (!strrchr($_REQUEST['delfile'], "/")) + { + if (file_exists($path.$_REQUEST['delfile'])) + { + unlink($path.$_REQUEST['delfile']); + removeFileInformation($client, $_REQUEST['delfile'], 'templates', $db); + } + } + +} + +if ($handle = opendir($path)) +{ + + $aFiles = array(); + + while ($file = readdir($handle)) + { + if(substr($file, (strlen($file) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType" AND is_readable($path.$file)) + { + $aFiles[] = $file; + }elseif (substr($file, (strlen($file) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType" AND !is_readable($path.$file)) + { + $notification->displayNotification("error", $file." ".i18n("is not readable!")); + } + } + closedir($handle); + + // display files + if (is_array($aFiles)) + { + + sort($aFiles); + + foreach ($aFiles as $filename) + { + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + + $tmp_mstr = '%s'; + + $html_filename = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&file=$filename"), + 'right_bottom', + $sess->url("main.php?area=$area&frame=4&action=$sActionEdit&file=$filename&tmp_file=$filename"), + $filename, $filename, clHtmlSpecialChars($filename)); + + $tpl->set('d', 'FILENAME', $html_filename); + + $delTitle = i18n("Delete File"); + $delDescr = sprintf(i18n("Do you really want to delete the following file:

    %s
    "),$filename); + + if ($perm->have_perm_area_action('style', $sActionDelete)) + { + $tpl->set('d', 'DELETE', ''); + }else + { + $tpl->set('d', 'DELETE', ''); + } + + if (stripslashes($_REQUEST['file']) == $filename) { + $tpl->set('d', 'ID', 'id="marked"'); + } else { + $tpl->set('d', 'ID', ''); + } + + $tpl->next(); + + } + } +}else +{ + if ((int) $client > 0) { + $notification->displayNotification("error", i18n("Directory is not existing or readable!")."
    $path"); + } +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['files_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.html_tpl_history.php b/conlite/includes/include.html_tpl_history.php new file mode 100644 index 0000000..52146bd --- /dev/null +++ b/conlite/includes/include.html_tpl_history.php @@ -0,0 +1,192 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release >= 5.0 + * + * {@internal + * created 2008-08-05 + * $Id: include.html_tpl_history.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// For read Fileinformation an get the id of current File +cInclude("includes", "functions.file.php"); + +// For Editor syntax highlighting +cInclude("external", "edit_area/class.edit_area.php"); + +$sFileName = ""; +$sFileName = $_REQUEST['file']; +$bDeleteFile = false; + + +if($sFileName == ""){ + $sFileName = $_REQUEST['idhtml_tpl']; +} + +$sType = "templates"; +$sTypeContent = "templates"; + +$oPage = new cPage; +$oPage->addScript('messageBox', ''); +$oPage->addScript('messageBoxInit', ''); + + +if (!$perm->have_perm_area_action($area, 'htmltpl_history_manage')) +{ + $notification->displayNotification("error", i18n("Permission denied")); + $oPage->render(); +} else if (!(int) $client > 0) { + $oPage->render(); +} else if (getEffectiveSetting('versioning', 'activated', 'false') == 'false') { + $notification->displayNotification("warning", i18n("Versioning is not activated")); + $oPage->render(); +} else { + + + + $sTypeContent = "templates"; + + // Get File Informataion from DB + $aFileInfo = getFileInformation ($client, $sFileName , $sTypeContent, $db); + + // [action] => history_truncate delete all current history + if($_POST["action"] == "history_truncate") { + $oVersionHtmlTemp = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFileName ,$sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + $bDeleteFile = $oVersionHtmlTemp->deleteFile(); + unset($oVersionHtmlTemp); + } + if ($_POST["html_tpl_send"] == true && $_POST["html_tpl_code"] !="" && $sFileName != "" && $aFileInfo["idsfi"]!="" ) { // save button + $oVersionHtmlTemp = new VersionFile($aFileInfo["idsfi"], $aFileInfo,$sFileName ,$sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Get Post variables + $sHTMLCode = $_POST["html_tpl_code"]; + $sHTMLName = $_POST["html_tpl_name"]; + $sHTMLDesc = $_POST["html_tpl_desc"]; + + $sPath = $oVersionHtmlTemp->getPathFile(); + // Edit File + + // There is a need for renaming file + if($sFileName != $sHTMLName) { + if (getFileType($sHTMLName) != 'html' AND strlen(stripslashes(trim($sHTMLName))) > 0) { + $sHTMLName = stripslashes($sHTMLName).".html"; + } + + renameFile($sFileName, $sHTMLName, $oVersionHtmlTemp->getPathFile()); + $oPage->addScript("reload", $oVersionHtmlTemp->renderReloadScript('htmltpl', $sHTMLName, $sess)); + } + + if(fileEdit($sHTMLName, $sHTMLCode, $sPath)) { + // make new revision File + $oVersionHtmlTemp->createNewVersion(); + + // Update File Information + updateFileInformation($client, $sFileName, $sType, $aFileInfo, $sHTMLDesc, $db, $sHTMLName); + $sFileName = $sHTMLName; + } + + unset($oVersionHtmlTemp); + } + + if($sFileName != "" && $aFileInfo["idsfi"]!="" && $_POST["action"] != "history_truncate" ) { + $oVersionHtmlTemp= new VersionFile($aFileInfo["idsfi"],$aFileInfo["description"] ,$sFileName, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Init Form variables of SelectBox + $sSelectBox = ""; + $oVersionHtmlTemp->setVarForm("area", $area); + $oVersionHtmlTemp->setVarForm("frame", $frame); + $oVersionHtmlTemp->setVarForm("idhtml_tpl", $sFileName); + $oVersionHtmlTemp->setVarForm("file", $sFileName); + + // create and output the select box, for params please look class.version.php + $sSelectBox = $oVersionHtmlTemp->buildSelectBox("html_tpl_history", "HTML Template History", "Show History Entry", "idhtml_tpl_history"); + + // Generate Form + $oForm = new UI_Table_Form("jscript_display"); + $oForm->addHeader(i18n("Edit JScript")); + $oForm ->setWidth("100%"); + $oForm->setVar("area", $area); + $oForm->setVar("frame", $frame); + $oForm->setVar("idhtml_tpl", $sFileName); + $oForm->setVar("html_tpl_send", 1); + + + // if send form refresh button + if ($_POST["idhtml_tpl_history"] != "") { + $sRevision = $_POST["idhtml_tpl_history"]; + } else { + $sRevision = $oVersionHtmlTemp->getLastRevision(); + } + + if ($sRevision != '') { + $sPath = $oVersionHtmlTemp->getFilePath() . $sRevision; + + // Read XML Nodes and get an array + $aNodes = array(); + $aNodes = $oVersionHtmlTemp->initXmlReader($sPath); + + // Create Textarea and fill it with xml nodes + if (count($aNodes) > 1) { + // if choose xml file read value an set it + $sName = $oVersionHtmlTemp->getTextBox("html_tpl_name", $aNodes["name"], 60); + $sDescription = $oVersionHtmlTemp->getTextarea("html_tpl_desc", $aNodes["desc"], 100, 10); + $sCode = $oVersionHtmlTemp->getTextarea("html_tpl_code", $aNodes["code"], 100, 30, "IdLaycode"); + + } + + } + + // Add new Elements of Form + $oForm->add(i18n("Name"), $sName); + $oForm->add(i18n("Description"), $sDescription); + $oForm->add(i18n("Code"), $sCode); + $oForm->setActionButton("apply", "images/but_ok.gif", i18n("Copy to current"), "c"/*, "mod_history_takeover"*/); //modified it + $oForm->unsetActionButton("submit"); + + // Render and handle History Area + $oPage->setEncoding("utf-8"); + + $oEditAreaOutput = new EditArea('IdLaycode', 'php', substr(strtolower($belang), 0, 2), true, $cfg, !$bInUse); + $oPage->addScript('IdLaycode', $oEditAreaOutput->renderScript()); + + if($sSelectBox !="") { + $oPage->setContent($sSelectBox . $oForm->render()); + + } else { + $notification->displayNotification("warning", i18n("No template history available")); + } + $oPage->render(); + + } else { + if($bDeleteFile){ + $notification->displayNotification("warning", i18n("Version history was cleared")); + } else { + $notification->displayNotification("warning", i18n("No template history available")); + } + + } +} +?> \ No newline at end of file diff --git a/conlite/includes/include.html_tpl_left_top.php b/conlite/includes/include.html_tpl_left_top.php new file mode 100644 index 0000000..26a7bb6 --- /dev/null +++ b/conlite/includes/include.html_tpl_left_top.php @@ -0,0 +1,58 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-10 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.html_tpl_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'ID', 'oTplSel'); +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'CAPTION', ''); +$tpl->set('s', 'SESSID', $sess->id); + + +$tpl->set('s', 'ACTION', $select); + +$tmp_mstr = '%s'; +$area = "htmltpl"; +$mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=htmltpl&frame=3"), + 'right_bottom', + $sess->url("main.php?area=htmltpl&frame=4&action=htmltpl_create"), + i18n("Create module template")); +if ((int) $client > 0) { + $tpl->set('s', 'NEWSTYLE', $mstr); +} else { + $tpl->set('s', 'NEWSTYLE', i18n('No Client selected')); +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['html_tpl_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.info.php b/conlite/includes/include.info.php new file mode 100644 index 0000000..80960fe --- /dev/null +++ b/conlite/includes/include.info.php @@ -0,0 +1,44 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-08 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.info.php 198 2012-12-19 14:46:01Z Mansveld $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +# Generate template +$tpl->reset(); + +$message = sprintf(i18n("You can find a lot of information and a community forum on the ConLite Portal")); + +$tpl->set('s', 'VERSION', $cfg['version']); +$tpl->set('s', 'PORTAL', $message); +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['info']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.js_edit_form.php b/conlite/includes/include.js_edit_form.php new file mode 100644 index 0000000..9572c6a --- /dev/null +++ b/conlite/includes/include.js_edit_form.php @@ -0,0 +1,190 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-07-14 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-08-14, Timo Trautmann, Bilal Arslan - Functions for versionning and storing file meta data added + * + * $Id: include.js_edit_form.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("external", "edit_area/class.edit_area.php"); + +$sFileType = "js"; + +$sActionCreate = 'js_create'; +$sActionEdit = 'js_edit'; + +$page = new cPage; + +$tpl->reset(); + +if (!$perm->have_perm_area_action($area, $action)) +{ + $notification->displayNotification("error", i18n("Permission denied")); +} else if (!(int) $client > 0) { + #if there is no client selected, display empty page + $page->render(); +} else { + $path = $cfgClient[$client]["js"]["path"]; + $sTempFilename = stripslashes($_REQUEST['tmp_file']); + $sOrigFileName = $sTempFilename; + + if (getFileType($_REQUEST['file']) != $sFileType AND strlen(stripslashes(trim($_REQUEST['file']))) > 0) + { + $sFilename .= stripslashes($_REQUEST['file']).".$sFileType"; + }else + { + $sFilename .= stripslashes($_REQUEST['file']); + } + + if (stripslashes($_REQUEST['file'])) { + $sReloadScript = ""; + } else { + $sReloadScript = ""; + } + + // Content Type is template + $sTypeContent = "js"; + $aFileInfo = getFileInformation ($client, $sTempFilename, $sTypeContent, $db); + + # create new file + if ( $_REQUEST['action'] == $sActionCreate AND $_REQUEST['status'] == 'send') + { + $sTempFilename = $sFilename; + createFile($sFilename, $path); + $bEdit = fileEdit($sFilename, $_REQUEST['code'], $path); + updateFileInformation($client, $sFilename, 'js', $auth->auth['uid'], $_REQUEST['description'], $db); + $sReloadScript .= ""; + } + + # edit selected file + if ( $_REQUEST['action'] == $sActionEdit AND $_REQUEST['status'] == 'send') + { + if ($sFilename != $sTempFilename) + { + $sTempFilename = renameFile($sTempFilename, $sFilename, $path); + $sReloadScript .= ""; + }else + { + $sTempFilename = $sFilename; + } + + updateFileInformation($client, $sOrigFileName, 'js', $auth->auth['uid'], $_REQUEST['description'], $db, $sFilename); + + /** + * START TRACK VERSION + **/ + if((count($aFileInfo) == 0) || ((int)$aFileInfo["idsfi"] == 0)) { + $aFileInfo = getFileInformation ($client, $sTempFilename, $sTypeContent, $db); + $aFileInfo['description'] = ''; + } + + if(count($aFileInfo) > 0 && $aFileInfo["idsfi"] !="") { + $oVersion = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFilename, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame, $sOrigFileName); + // Create new Jscript Version in cms/version/js/ folder + $oVersion->createNewVersion(); + } + + /** + * END TRACK VERSION + **/ + + $bEdit = fileEdit($sFilename, $_REQUEST['code'], $path); + + } + + # generate edit form + if (isset($_REQUEST['action'])) + { + $aFileInfo = getFileInformation($client, $sFilename, $sTypeContent, $db); + + $sAction = ($bEdit) ? $sActionEdit : $_REQUEST['action']; + + if ($_REQUEST['action'] == $sActionEdit) + { + $sCode = getFileContent($sFilename, $path); + }else + { + $sCode = stripslashes($_REQUEST['code']); # stripslashes is required here in case of creating a new file + } + + $form = new UI_Table_Form("file_editor"); + $form->addHeader(i18n("Edit file")); + $form->setWidth("100%"); + $form->setVar("area", $area); + $form->setVar("action", $sAction); + $form->setVar("frame", $frame); + $form->setVar("status", 'send'); + $form->setVar("tmp_file", $sTempFilename); + + $tb_name = new cHTMLTextbox("file", $sFilename, 60); + $ta_code = new cHTMLTextarea("code", clHtmlSpecialChars($sCode), 100, 35, "code"); + $descr = new cHTMLTextarea("description", clHtmlSpecialChars($aFileInfo["description"]), 100, 5); + + $ta_code->setStyle("font-family: monospace;width: 100%;"); + $descr->setStyle("font-family: monospace;width: 100%;"); + $ta_code->updateAttributes(array("wrap" => getEffectiveSetting('script_editor', 'wrap', 'off'))); + + $form->add(i18n("Name"),$tb_name); + $form->add(i18n("Description"), $descr->render()); + $form->add(i18n("Code"),$ta_code); + + $page->setContent($form->render()); + + $oEditArea = new EditArea('code', 'js', substr(strtolower($belang), 0, 2), true, $cfg); + $page->addScript('editarea', $oEditArea->renderScript()); + + $page->addScript('reload', $sReloadScript); + $page->render(); + + } +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.js_files_overview.php b/conlite/includes/include.js_files_overview.php new file mode 100644 index 0000000..48d7b37 --- /dev/null +++ b/conlite/includes/include.js_files_overview.php @@ -0,0 +1,161 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-20 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.js_files_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.file.php"); + +$tpl->reset(); + +if (!(int) $client > 0) { + #if there is no client selected, display empty page + $oPage = new cPage; + $oPage->render(); + return; +} + +$path = $cfgClient[$client]["js"]["path"]; +$sFileType = "js"; + +$sSession = $sess->id; + +$sArea = 'js'; +$sActionDelete = 'js_delete'; +$sActionEdit = 'js_edit'; + +$sScriptTemplate = ' + + + +'; + +$tpl->set('s', 'JAVASCRIPT', $sScriptTemplate); + +# delete file +if ($action == $sActionDelete) +{ + if (!strrchr($_REQUEST['delfile'], "/")) + { + if (file_exists($path.$_REQUEST['delfile'])) + { + unlink($path.$_REQUEST['delfile']); + removeFileInformation($client, $_REQUEST['delfile'], 'js', $db); + } + } + +} + +if ($handle = opendir($path)) +{ + + $aFiles = array(); + + while ($file = readdir($handle)) + { + if(substr($file, (strlen($file) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType" AND is_readable($path.$file)) + { + $aFiles[] = $file; + }elseif (substr($file, (strlen($file) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType" AND !is_readable($path.$file)) + { + $notification->displayNotification("error", $file." ".i18n("is not readable!")); + } + } + closedir($handle); + + // display files + if (is_array($aFiles)) + { + + sort($aFiles); + + foreach ($aFiles as $filename) + { + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + + $tmp_mstr = '%s'; + + $html_filename = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&file=$filename"), + 'right_bottom', + $sess->url("main.php?area=$area&frame=4&action=$sActionEdit&file=$filename&tmp_file=$filename"), + $filename, $filename, clHtmlSpecialChars($filename)); + + $tpl->set('d', 'FILENAME', $html_filename); + + $delTitle = i18n("Delete File"); + $delDescr = sprintf(i18n("Do you really want to delete the following file:

    %s
    "),$filename); + + if ($perm->have_perm_area_action('style', $sActionDelete)) + { + $tpl->set('d', 'DELETE', ''); + }else + { + $tpl->set('d', 'DELETE', ''); + } + + if (stripslashes($_REQUEST['file']) == $filename) { + $tpl->set('d', 'ID', 'id="marked"'); + } else { + $tpl->set('d', 'ID', ''); + } + + $tpl->next(); + + } + } +}else +{ + if ((int) $client > 0) { + $notification->displayNotification("error", i18n("Directory is not existing or readable!")."
    $path"); + } +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['files_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.js_history.php b/conlite/includes/include.js_history.php new file mode 100644 index 0000000..3789011 --- /dev/null +++ b/conlite/includes/include.js_history.php @@ -0,0 +1,183 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release >= 5.0 + * + * {@internal + * created 2008-08-05 + * $Id: include.js_history.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// For read Fileinformation an get the id of current File +cInclude("includes", "functions.file.php"); + +// For Editor syntax highlighting +cInclude("external", "edit_area/class.edit_area.php"); + +$sFileName = ""; +$sFileName = $_REQUEST['file']; + +$sType = "js"; + +if($sFileName == ""){ + $sFileName = $_REQUEST['idjscript']; +} + +$oPage = new cPage; +$oPage->addScript('messageBox', ''); +$oPage->addScript('messageBoxInit', ''); + +if (!$perm->have_perm_area_action($area, 'js_history_manage')) +{ + $notification->displayNotification("error", i18n("Permission denied")); + $oPage->render(); +} else if (!(int) $client > 0) { + $oPage->render(); +} else if (getEffectiveSetting('versioning', 'activated', 'false') == 'false') { + $notification->displayNotification("warning", i18n("Versioning is not activated")); + $oPage->render(); +} else { + + // Content Type is css + $sTypeContent = "js"; + + $aFileInfo = getFileInformation ($client, $sFileName , $sTypeContent, $db); + + // [action] => history_truncate delete all current history + if($_POST["action"] == "history_truncate") { + $oVersionJScript = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFileName ,$sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + $bDeleteFile = $oVersionJScript->deleteFile(); + unset($oVersionJScript); + } + + if ($_POST["jscript_send"] == true && $_POST["jscriptcode"] !="" && $sFileName != "" && $aFileInfo["idsfi"]!="") { // save button + $oVersionJScript = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFileName, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Get Post variables + $sJScriptCode = $_POST["jscriptcode"]; + $sJScriptName = $_POST["jscriptname"]; + $sJScriptDesc = $_POST["jscriptdesc"]; + + // Edit File + $sPath = $oVersionJScript->getPathFile(); + + // There is a need for renaming file + if($sFileName != $sJScriptName){ + if (getFileType($sJScriptName) != 'js' AND strlen(stripslashes(trim($sJScriptName))) > 0) { + $sJScriptName = stripslashes($sJScriptName).".js"; + } + + renameFile($sFileName, $sJScriptName, $oVersionJScript->getPathFile()); + $oPage->addScript("reload", $oVersionJScript->renderReloadScript('js', $sJScriptName, $sess)); + } + + if(fileEdit($sJScriptName, $sJScriptCode, $sPath)) { + // make new revision File + $oVersionJScript->createNewVersion(); + + // Update File Information + updateFileInformation($client, $sFileName, $sType, $aFileInfo["author"], $sJScriptDesc, $db, $sJScriptName); + $sFileName = $sJScriptName; + } + + unset($oVersionJScript); + } + + if($sFileName != "" && $aFileInfo["idsfi"]!="" && $_POST["action"] != "history_truncate") { + $oVersionJScript = new VersionFile($aFileInfo["idsfi"], $aFileInfo,$sFileName, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + + + // Init Form variables of SelectBox + $sSelectBox = ""; + $oVersionJScript->setVarForm("area", $area); + $oVersionJScript->setVarForm("frame", $frame); + $oVersionJScript->setVarForm("idjscript", $sFileName); + $oVersionJScript->setVarForm("file", $sFileName); + + // create and output the select box, for params please look class.version.php + $sSelectBox = $oVersionJScript->buildSelectBox("jscript_history", "JScript History", "Show History Entry", "idjscripthistory"); + + // Generate Form + $oForm = new UI_Table_Form("jscript_display"); + $oForm->addHeader(i18n("Edit JScript")); + $oForm ->setWidth("100%"); + $oForm->setVar("area", $area); + $oForm->setVar("frame", $frame); + $oForm->setVar("idjscript", $sFileName); + $oForm->setVar("jscript_send", 1); + + + // if send form refresh button + if ($_POST["idjscripthistory"] != "") { + $sRevision = $_POST["idjscripthistory"]; + } else { + $sRevision = $oVersionJScript->getLastRevision(); + } + + if ($sRevision != '') { + $sPath = $oVersionJScript->getFilePath() . $sRevision; + + // Read XML Nodes and get an array + $aNodes = array(); + $aNodes = $oVersionJScript->initXmlReader($sPath); + + if (count($aNodes) > 1) { + $sName = $oVersionJScript->getTextBox("jscriptname", $aNodes["name"], 60); + $sDescription = $oVersionJScript->getTextarea("jscriptdesc", $aNodes["desc"], 100, 10); + $sCode = $oVersionJScript->getTextarea("jscriptcode", $aNodes["code"], 100, 30, "IdLaycode"); + } + } + + // Add new Elements of Form + $oForm->add(i18n("Name"), $sName); + $oForm->add(i18n("Description"), $sDescription); + $oForm->add(i18n("Code"), $sCode); + $oForm->setActionButton("apply", "images/but_ok.gif", i18n("Copy to current"), "c"/*, "mod_history_takeover"*/); //modified it + $oForm->unsetActionButton("submit"); + + // Render and handle History Area + $oPage->setEncoding("utf-8"); + + $oEditAreaOutput = new EditArea('IdLaycode', 'js', substr(strtolower($belang), 0, 2), true, $cfg, !$bInUse); + $oPage->addScript('IdLaycode', $oEditAreaOutput->renderScript()); + + if($sSelectBox !="") { + $oPage->setContent($sSelectBox . $oForm->render()); + + } else { + $notification->displayNotification("warning", i18n("No jscript history available")); + } + $oPage->render(); + + } else { + if($bDeleteFile) { + $notification->displayNotification("warning", i18n("Version history was cleared")); + } else { + $notification->displayNotification("warning", i18n("No style history available")); + } + } +} +?> \ No newline at end of file diff --git a/conlite/includes/include.js_left_top.php b/conlite/includes/include.js_left_top.php new file mode 100644 index 0000000..5fb5d57 --- /dev/null +++ b/conlite/includes/include.js_left_top.php @@ -0,0 +1,57 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-09 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.js_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'ID', 'oTplSel'); +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'CAPTION', ''); +$tpl->set('s', 'SESSID', $sess->id); + + +$tpl->set('s', 'ACTION', $select); + +$tmp_mstr = '%s'; +$area = "style"; +$mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=js&frame=3"), + 'right_bottom', + $sess->url("main.php?area=js&frame=4&action=js_create"), + i18n("Create script")); +if ((int) $client > 0) { + $tpl->set('s', 'NEWSCRIPT', $mstr); +} else { + $tpl->set('s', 'NEWSCRIPT', i18n('No Client selected')); +} +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['js_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.lang_edit.php b/conlite/includes/include.lang_edit.php new file mode 100644 index 0000000..e43000e --- /dev/null +++ b/conlite/includes/include.lang_edit.php @@ -0,0 +1,274 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-05-25, Oliver Lohkemper, add iso-639-2- & iso-3166-selecter + * + * $Id: include.lang_edit.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +includePlugins("languages"); + +$clang = new cApiLanguage($idlang); + +#Script for refreshing Language Box in Header +$newOption = ''; + +$db2 = new DB_ConLite; + +$sReload = ''; + +if ($action == "lang_newlanguage" || $action == "lang_deletelanguage") +{ + $page = new UI_Page; + + if ($action == "lang_deletelanguage") + { + // finally delete from dropdown in header + $newOption = ''; + } + + if ($action == "lang_newlanguage") { + // update language dropdown in header + $new_idlang = 0; + $db->query( 'SELECT max(idlang) as newlang FROM '.$cfg["tab"]["lang"].';' ); + if ($db->next_record()) { + $new_idlang = $db->f('newlang'); + } + + $newOption = ''; + $idlang = $new_idlang; + } + + if ($targetclient == $client) { + $page->addScript('refreshHeader', $newOption); + } + $page->addScript('reload', $sReload); + $page->render(); +} else +{ + if ($action == "lang_edit") + { + callPluginStore("languages"); + + $language = new cApiLanguage($idlang); + + $language->setProperty("dateformat", "full", stripslashes($datetimeformat)); + $language->setProperty("dateformat", "date", stripslashes($dateformat)); + $language->setProperty("dateformat", "time", stripslashes($timeformat)); + + $language->setProperty("language", "code", stripslashes($languagecode) ); + $language->setProperty("country", "code", stripslashes($countrycode) ); + + // update dropdown in header + $newOption = ''; + } + + if(!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + + } else { + + if ( !isset($idlang) && $action != "lang_new") + { + $notification->displayNotification("error", "no language id given. Usually, this shouldn't happen, except if you played around with your system. if you didn't play around, please report a bug."); + + } else { + + if (($action == "lang_edit") && ($perm->have_perm_area_action($area, $action))) + { + langEditLanguage($idlang, $langname, $sencoding, $active, $direction); + $noti = $notification->returnNotification("info", i18n("Changes saved"))."
    "; + } + + + $tpl->reset(); + + $sql = "SELECT + A.idlang AS idlang, A.name AS name, A.active as active, A.encoding as encoding, A.direction as direction, + B.idclient AS idclient + FROM + ".$cfg["tab"]["lang"]." AS A, + ".$cfg["tab"]["clients_lang"]." AS B + WHERE + A.idlang = '".Contenido_Security::toInteger($idlang)."' AND + B.idlang = '".Contenido_Security::toInteger($idlang)."'"; + + $db->query($sql); + $db->next_record(); + + $form = new UI_Table_Form("lang_properties"); + $form->setVar("idlang", $idlang); + $form->setVar("targetclient", $db->f("idclient")); + $form->setVar("action", "lang_edit"); + $form->setVar("area", $area); + $form->setVar("frame", $frame); + + + $charsets = array(); + foreach ($cfg['AvailableCharsets'] as $charset) + { + $charsets[$charset] = $charset; + } + + if ($error) { + echo $error; + } + + + $iso_639_2_tags = array('aa' => 'Afar', 'ab' => 'Abkhazian', 'af' => 'Afrikaans', 'am' => 'Amharic', 'ar' => 'Arabic', 'as' => 'Assamese', 'ay' => 'Aymara', 'az' => 'Azerbaijani', 'ba' => 'Bashkir', 'be' => 'Byelorussian', 'bg' => 'Bulgarian', 'bh' => 'Bihari', 'bi' => 'Bislama', 'bn' => 'Bengali', + 'bo' => 'Tibetan', 'br' => 'Breton', 'ca' => 'Catalan', 'co' => 'Corsican', 'cs' => 'Czech', 'cy' => 'Welsh', 'da' => 'Danish', 'de' => 'German', 'dz' => 'Bhutani', 'el' => 'Greek', 'en' => 'English', 'eo' => 'Esperanto', 'es' => 'Spanish', 'et' => 'Estonian', 'eu' => 'Basque', 'fa' => 'Persian', + 'fi' => 'Finnish', 'fj' => 'Fiji', 'fo' => 'Faeroese', 'fr' => 'French', 'fy' => 'Frisian', 'ga' => 'Irish', 'gd' => 'Gaelic', 'gl' => 'Galician', 'gn' => 'Guarani', 'gu' => 'Gujarati', 'ha' => 'Hausa', 'hi' => 'Hindi', 'hr' => 'Croatian', 'hu' => 'Hungarian', 'hy' => 'Armenian', + 'ia' => 'Interlingua', 'ie' => 'Interlingue', 'ik' => 'Inupiak', 'in' => 'Indonesian', 'is' => 'Icelandic', 'it' => 'Italian', 'iw' => 'Hebrew', 'ja' => 'Japanese', 'ji' => 'Yiddish', 'jw' => 'Javanese', 'ka' => 'Georgian', 'kk' => 'Kazakh', 'kl' => 'Greenlandic', 'km' => 'Cambodian', + 'kn' => 'Kannada', 'ko' => 'Korean', 'ks' => 'Kashmiri', 'ku' => 'Kurdish', 'ky' => 'Kirghiz', 'la' => 'Latin', 'ln' => 'Lingala', 'lo' => 'Laothian', 'lt' => 'Lithuanian', 'lv' => 'Latvian', 'mg' => 'Malagasy', 'mi' => 'Maori', 'mk' => 'Macedonian', 'ml' => 'Malayalam', 'mn' => 'Mongolian', + 'mo' => 'Moldavian', 'mr' => 'Marathi', 'ms' => 'Malay', 'mt' => 'Maltese', 'my' => 'Burmese', 'na' => 'Nauru', 'ne' => 'Nepali', 'nl' => 'Dutch', 'no' => 'Norwegian', 'oc' => 'Occitan', 'om' => 'Oromo', 'or' => 'Oriya', 'pa' => 'Punjabi', 'pl' => 'Polish', 'ps' => 'Pashto', 'pt' => 'Portuguese', + 'qu' => 'Quechua', 'rm' => 'Rhaeto-Romance', 'rn' => 'Kirundi', 'ro' => 'Romanian', 'ru' => 'Russian', 'rw' => 'Kinyarwanda', 'sa' => 'Sanskrit', 'sd' => 'Sindhi', 'sg' => 'Sangro', 'sh' => 'Serbo-Croatian', 'si' => 'Singhalese', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'sm' => 'Samoan', + 'sn' => 'Shona', 'so' => 'Somali', 'sq' => 'Albanian', 'sr' => 'Serbian', 'ss' => 'Siswati', 'st' => 'Sesotho', 'su' => 'Sudanese', 'sv' => 'Swedish', 'sw' => 'Swahili', 'ta' => 'Tamil', 'te' => 'Tegulu', 'tg' => 'Tajik', 'th' => 'Thai', 'ti' => 'Tigtinya', 'tk' => 'Turkmen', 'tl' => 'Tagalog', + 'tn' => 'Setswana', 'to' => 'Tonga', 'tr' => 'Turkish', 'ts' => 'Tsonga', 'tt' => 'Tatar', 'tw' => 'Twi', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek', 'vi' => 'Vietnamese', 'vo' => 'Volapuk', 'wo' => 'Wolof', 'xh' => 'Xhosa', 'yo' => 'Yoruba', 'zh' => 'Chinese', 'zu' => 'Zulu' ); + + $iso_3166_codes = array('af' => 'Afghanistan', 'al' => 'Albania', 'dz' => 'Algeria', 'as' => 'American Samoa', 'ad' => 'Andorra', 'ao' => 'Angola', 'ai' => 'Anguilla', 'aq' => 'Antarctica', 'ag' => 'Antigua/Barbuda', 'ar' => 'Argentina', 'am' => 'Armenia', 'aw' => 'Aruba', 'au' => 'Australia', 'at' => 'Austria', + 'az' => 'Azerbaijan', 'bs' => 'Bahamas', 'bh' => 'Bahrain', 'bd' => 'Bangladesh', 'bb' => 'Barbados', 'by' => 'Belarus', 'be' => 'Belgium', 'bz' => 'Belize', 'bj' => 'Benin', 'bm' => 'Bermuda', 'bt' => 'Bhutan', 'bo' => 'Bolivia', 'ba' => 'Bosnia/Herzegowina', 'bw' => 'Botswana', + 'bv' => 'Bouvet Island', 'br' => 'Brazil', 'io' => 'British Indian Ocean Territory', 'bn' => 'Brunei Darussalam', 'bg' => 'Bulgaria', 'bf' => 'Burkina Faso', 'bi' => 'Burundi', 'kh' => 'Cambodia', 'cm' => 'Cameroon', 'ca' => 'Canada', 'cv' => 'Cape verde', 'ky' => 'Cayman Islands', + 'cf' => 'Central African Republic', 'td' => 'Chad', 'cl' => 'Chile', 'cn' => 'China', 'cx' => 'Christmas Island', 'cc' => 'Cocos -Keeling- Islands', 'co' => 'Colombia', 'km' => 'Comoros', 'cd' => 'Congo, Democratic Republic of/Zaire', 'cg' => 'Congo, Peoples Republic of', + 'ck' => 'Cook Islands', 'cr' => 'Costa Rica', 'ci' => 'Cote D\'ivoire', 'hr' => 'Croatia/Hrvatska', 'cu' => 'Cuba', 'cy' => 'Cyprus', 'cz' => 'Czech Republic', 'dk' => 'Denmark', 'dj' => 'Djibouti', 'dm' => 'Dominica', 'do' => 'Dominica Republic', 'tl' => 'East Timor', 'ec' => 'Ecuador', + 'eg' => 'Egypt', 'sv' => 'El Salvador', 'gq' => 'Equatorial Guinea', 'er' => 'Eritrea', 'ee' => 'Estonia', 'et' => 'Ethiopia', 'fk' => 'Falkland Islands/Malvinas', 'fo' => 'Faroe Islands', 'fj' => 'Fiji', 'fi' => 'Finland', 'fr' => 'France', 'fx' => 'France, Metropolitan', + 'gf' => 'French Guinea', 'pf' => 'French Polynesia', 'tf' => 'French Southern Territories', 'ga' => 'Gabon', 'gm' => 'Gambia', 'ge' => 'Georgia', 'de' => 'Germany', 'gh' => 'Ghana', 'gi' => 'Gibraltar', 'gr' => 'Greece', 'gl' => 'Greenland', 'gd' => 'Grenada', 'gp' => 'Guadeloupe', + 'gu' => 'Guam', 'gt' => 'Guatemala', 'gn' => 'Guinea', 'gw' => 'Guinea-Bissau', 'gy' => 'Guyana', 'ht' => 'Haiti', 'hm' => 'Heard and Mc Donald Islands', 'hn' => 'Honduras', 'hk' => 'Hong Kong', 'hu' => 'Hungary', 'is' => 'Iceland', 'in' => 'India', 'id' => 'Indonesia', + 'ir' => 'Iran, Islamic Republic of', 'iq' => 'Iraq', 'ie' => 'Ireland', 'il' => 'Israel', 'it' => 'Italy', 'jm' => 'Jamaica', 'jp' => 'Japan', 'jo' => 'Jordan', 'kz' => 'Kazakhstan', 'ke' => 'Kenya', 'ki' => 'Kiribati', 'kp' => 'Korea, Democratic Peoples Republic of', + 'kr' => 'Korea, Republic of', 'kw' => 'Kuwait', 'kg' => 'Kyrgyzstan', 'la' => 'Lao Peples Democratic Republic', 'lv' => 'Latvia', 'lb' => 'Lebanon', 'ls' => 'Lesotho', 'lr' => 'Liberia', 'ly' => 'Libyan Arab Jamahiriya', 'li' => 'Liechtenstein', 'lt' => 'Lithuania', 'lu' => 'Luxembourg', + 'mo' => 'Macau', 'mk' => 'Macedonia, The Former Yugoslav Republic Of', 'mg' => 'Madagascar', 'mw' => 'Malawi', 'my' => 'Malaysia', 'mv' => 'Maldives', 'ml' => 'Mali', 'mt' => 'Malta', 'mh' => 'Marshall Islands', 'mq' => 'Martinique', 'mr' => 'Mauritania', 'mu' => 'Mauritius', + 'yt' => 'Mayotte', 'mx' => 'Mexico', 'fm' => 'Micronesia, Federated States Of', 'md' => 'Moldova, Republic Of', 'mc' => 'Monaco', 'mn' => 'Mongolita', 'ms' => 'Montserrat', 'ma' => 'Morocco', 'mz' => 'Mozambique', 'mm' => 'Myanmar', 'na' => 'Nambia', 'nr' => 'Nauru', 'np' => 'Nepal', + 'nl' => 'Netherlands', 'an' => 'Netherlands Antilles', 'nc' => 'New Caledonia', 'nz' => 'New Zealand', 'ni' => 'Nicaragua', 'ne' => 'Niger', 'ng' => 'Nigeria', 'nu' => 'Niue', 'nf' => 'Norfolk Islands', 'mp' => 'Northern Mariana Islands', 'no' => 'Norway', 'om' => 'Oman', + 'pk' => 'Pakistan', 'pw' => 'Palau', 'ps' => 'Palestinian Territory, Occupied', 'pa' => 'Panama', 'pg' => 'Papua New Guinea', 'py' => 'Paraguay', 'pe' => 'Peru', 'ph' => 'Philippines', 'pn' => 'Pitcairn', 'pl' => 'Poland', 'pt' => 'Portugal', 'pr' => 'Puerto Rico', 'qa' => 'Qatar', + 're' => 'Reunion', 'ro' => 'Romania', 'ru' => 'Russian Federation', 'rw' => 'Rwanda', 'kn' => 'Saint Kitts/Nevis', 'lc' => 'Saint Lucia', 'vc' => 'Saint Vincent/Grenadines', 'ws' => 'Samoa', 'sm' => 'San Marino', 'st' => 'Sao Tome/Principe', 'sa' => 'Saudi Arabia', 'sn' => 'Senegal', + 'sc' => 'Seychelles', 'sl' => 'Sierra Leone', 'sg' => 'Singapore', 'sk' => 'Slovakia/Slovak Republic', 'si' => 'Slovenia', 'sb' => 'Solomon Islands', 'so' => 'Somalia', 'za' => 'South Africa', 'gs' => 'South Georgia/South Sandwich Islands', 'es' => 'Spain', 'lk' => 'Sri Lanka', + 'sh' => 'Santa Helena', 'pm' => 'Santa Pierre/Miquelon', 'sd' => 'Sudan', 'sr' => 'Suriname', 'sj' => 'Svalbard/Jan Mayen Islands', 'sz' => 'Swaziland', 'se' => 'Sweden', 'ch' => 'Switzerland', 'sy' => 'Syrian Arab Republic', 'tw' => 'Taiwan', 'tj' => 'Tajikistan', + 'tz' => 'Tanzania, United Republic Of', 'th' => 'Thailand', 'tg' => 'Togo', 'tk' => 'Tokelau', 'to' => 'Tonga', 'tt' => 'Trinidad/Tobago', 'tn' => 'Tunisia', 'tr' => 'Turkey', 'tm' => 'Turkmenistan', 'tc' => 'Turks/Caicos Islands', 'tv' => 'Tuvalu', 'ug' => 'Uganda', 'ua' => 'Ukraine', + 'ae' => 'United Arab Emirates', 'gb' => 'United Kingdom', 'us' => 'United States', 'um' => 'United States Minor Outlying Islands', 'uy' => 'Uruguay', 'uz' => 'Uzbekistan', 'vu' => 'Vanuatu', 'va' => 'Vatican City State -Holy See-', 've' => 'Venezuela', 'vn' => 'Viet Nam', + 'vg' => 'Virgin Islands, British', 'vi' => 'Virgin Islands, U.S.', 'wf' => 'Wallis/Futuna Islands', 'eh' => 'Western Sahara', 'ye' => 'Yemen', 'yu' => 'Yougoslavia', 'zm' => 'Zambia', 'zw' => 'Zimbabwe' ); + + + + $eselect = new cHTMLSelectElement("sencoding"); + $eselect->setStyle('width:255px'); + $eselect->autoFill($charsets); + $eselect->setDefault($db->f("encoding")); + + $languagecode = new cHTMLSelectElement("languagecode"); + $languagecode->setStyle('width:255px'); + $languagecode->autoFill($iso_639_2_tags); + $languagecode->setDefault($clang->getProperty("language", "code")); + + $countrycode = new cHTMLSelectElement("countrycode"); + $countrycode->setStyle('width:255px'); + $countrycode->autoFill($iso_3166_codes); + $countrycode->setDefault($clang->getProperty("country", "code")); + + $directionSelect = new cHTMLSelectElement("direction"); + $directionSelect->setStyle('width:255px'); + $directionSelect->autoFill(array("ltr" => i18n("Left to right"), "rtl" => i18n("Right to left"))); + $directionSelect->setDefault($db->f("direction")); + + + $fulldateformat = new cHTMLTextbox("datetimeformat", $clang->getProperty("dateformat", "full"), 40); + + $dateformat = new cHTMLTextbox("dateformat", $clang->getProperty("dateformat", "date"), 40); + + $timeformat = new cHTMLTextbox("timeformat", $clang->getProperty("dateformat", "time"), 40); + + + displayPlugin("languages", $form); + + + $form->addHeader(i18n("Edit language")); + + $form->add(i18n("Language name"), formGenerateField ("text", "langname", clHtmlSpecialChars($db->f("name")), 40, 255)); + $form->add(i18n("Active"), formGenerateCheckbox ("active", "1",$db->f("active"))); + + $form->addSubHeader(i18n("Language")); + $form->add(i18n("Encoding"), $eselect); + $form->add(i18n("Language"), $languagecode->render()); + $form->add(i18n("Country"), $countrycode->render()); + $form->add(i18n("Text direction"), $directionSelect); + + $form->addSubHeader(i18n("Time format")); + $form->add(i18n("Date/Time format"), $fulldateformat->render()); + $form->add(i18n("Date format"), $dateformat->render()); + $form->add(i18n("Time format"), $timeformat->render()); + + + $page = new UI_Page; + $page->setContent($noti.$form->render()); + + if ($targetclient == $client) { + $page->addScript('refreshHeader', $newOption); + } + + if ($_REQUEST['action'] != '') { + $page->addScript('reload', $sReload); + } + + $page->render(); + } + } +} +?> \ No newline at end of file diff --git a/conlite/includes/include.lang_left_top.php b/conlite/includes/include.lang_left_top.php new file mode 100644 index 0000000..070d6f5 --- /dev/null +++ b/conlite/includes/include.lang_left_top.php @@ -0,0 +1,89 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-08 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.lang_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'CAPTION', ''); +$tpl->set('s', 'SESSID', $sess->id); + +$tpl->set('s', 'ACTION', ''); +$tpl->set('s', 'SID', $sess->id); + +$clients = $classclient->getAccessibleClients(); + + +$tpl2 = new Template; +$tpl2->set('s', 'ID', 'editclient'); +$tpl2->set('s', 'NAME', 'editclient'); +$tpl2->set('s', 'CLASS', 'text_medium'); +$tpl2->set('s', 'OPTIONS', 'onchange="langChangeClient()"'); + +$iClientcount = count($clients); + +foreach ($clients as $key => $value) { + + if ($client == $key) + { + $selected = "selected"; + } else { + $selected = ""; + } + + if (strlen($value['name']) > 15) + { + $value['name'] = substr($value['name'],0,12). "..."; + } + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value['name']); + $tpl2->set('d', 'SELECTED', $selected); + $tpl2->next(); + +} + +$select = $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true); + +$tpl->set('s', 'CLIENTSELECT', $select); + +if ($perm->have_perm_area_action($area, "lang_newlanguage") && $iClientcount > 0) { + $tpl->set('s', 'NEWLANG', ''.i18n("Create language").''); +} else if ($iClientcount == 0) { + $tpl->set('s', 'NEWLANG', i18n('No Client selected')); +} else { + $tpl->set('s', 'NEWLANG', ''); +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['lang_left_top']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.lang_overview.php b/conlite/includes/include.lang_overview.php new file mode 100644 index 0000000..cfd76e9 --- /dev/null +++ b/conlite/includes/include.lang_overview.php @@ -0,0 +1,130 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-02 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.lang_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$area="lang"; + +if (!isset($action)) $action = ""; + +if (!is_numeric($targetclient)) +{ + $targetclient = $client; +} + +$iGetIdlang = $idlang; + +$sql = "SELECT + * + FROM + ".$cfg["tab"]["lang"]." AS A, + ".$cfg["tab"]["clients_lang"]." AS B + WHERE + A.idlang=B.idlang AND + B.idclient='".Contenido_Security::toInteger($targetclient)."' + ORDER BY A.idlang"; + +$db->query($sql); + +$tpl->set('s','TARGETCLIENT',$targetclient); + +$iLangCount = 0; +while ($db->next_record()) { + $iLangCount++; + + $idlang = $db->f("idlang"); + + if ($db->f("active") == 0) { + //activate + $message = i18n("Activate language"); + $active = "url("main.php?area=$area&action=lang_activatelanguage&frame=$frame&targetclient=$targetclient&idlang=".$db->f("idlang"))."#clickedhere\">\"$message\""; + } else { + //deactivate + $message = i18n("Deactivate language"); + $active = "url("main.php?area=$area&action=lang_deactivatelanguage&frame=$frame&targetclient=$targetclient&idlang=".$db->f("idlang"))."#clickedhere\">\"$message\""; + } + + // Delete Button + $deleteMsg = sprintf(i18n("Do you really want to delete the language %s?"),clHtmlSpecialChars($db->f("name"))); + $deleteAct = i18n("Delete language"); + $deletebutton = ''.$deleteAct.''; + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'LANGUAGE', ''.$db->f("name").' ('.$idlang.')'); + $tpl->set('d', 'ACTIVATEBUTTON', $active); + $tpl->set('d', 'DELETEBUTTON', $deletebutton); + //$tpl->set('d', 'ICON', ''); + $tpl->set('d', 'ICON', ''); + + if ($iGetIdlang == $idlang) { + $tpl->set('d', 'MARKED', ' id="marked" '); + } else { + $tpl->set('d', 'MARKED', ''); + } + + $tpl->next(); +} + +$newlanguageform = ' + '.$sess->hidden_session(true).' + + +
    '.i18n("New language").': +     + +
    '; + +$tpl->set('s', 'NEWLANGUAGEFORM', $newlanguageform); +$tpl->set('s', 'SID', $sess->id); + +if ( $tmp_notification ) { + + $noti_html = ''.$tmp_notification.''; + $tpl->set('s', 'NOTIFICATION', $noti_html); + +} else { + + $tmp_notification = $notification->returnNotification("info", i18n("Language deleted")); + + $noti_html = ''.$tmp_notification.''; + $tpl->set('s', 'NOTIFICATION', ''); + +} + +$tpl->set('s', 'LANG_COUNT', $iLangCount); + +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['lang_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.lay_edit_form.php b/conlite/includes/include.lay_edit_form.php new file mode 100644 index 0000000..83da484 --- /dev/null +++ b/conlite/includes/include.lay_edit_form.php @@ -0,0 +1,260 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: include.lay_edit_form.php 312 2014-06-18 11:01:08Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("external", "edit_area/class.edit_area.php"); + +if (!isset($idlay)) $idlay = 0; + +$page = new cPage; +$layout = new cApiLayout(); + +if ($idlay != 0) +{ + $layout->loadByPrimaryKey($idlay); +} + +if ($action == "lay_new") +{ + if (!$perm->have_perm_area_action_anyitem($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } else { + $layouts = new cApiLayoutCollection; + $layout = $layouts->create(i18n("-- New Layout --")); + } +} elseif ($action == "lay_delete") +{ + if (!$perm->have_perm_area_action_anyitem($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } else { + $errno = layDeleteLayout($idlay); + $layout->virgin = true; + $sMsg = $notification->returnNotification("info", i18n("Layout deleted")); + } +} + +if ($refreshtemplates != "") +{ + /* Update all templates for containers with mode fixed and mandatory */ + $sql = "SELECT idtpl FROM ".$cfg["tab"]["tpl"]." WHERE idlay = '".Contenido_Security::toInteger($idlay)."'"; + $db->query($sql); + + $fillTemplates = array(); + + while ($db->next_record()) + { + $fillTemplates[] = $db->f("idtpl"); + } + + foreach ($fillTemplates as $fillTemplate) + { + tplAutoFillModules($fillTemplate); + } +} + +if (!$layout->virgin) +{ + $msg = ""; + + $tpl->reset(); + + $idlay = $layout->get("idlay"); + $code = $layout->getLayout(); + $name = $layout->get("name"); + $description = $layout->get("description"); + + /* Search for duplicate containers */ + tplPreparseLayout($idlay); + $ret = tplBrowseLayoutForContainers($idlay); + + if (strlen($ret) != 0) + { + $containers = explode("&", $ret); + + $types = array(); + + foreach ($containers as $value) + { + if ($value != "") { + $container[$value] = 0; + + /* Search for old-style CMS_CONTAINER[x] */ + $container[$value] += substr_count($code,"CMS_CONTAINER[$value]"); + + /* Search for the new-style containers */ + $count = preg_match_all("/(.*)<\/container>/i", addslashes($code), $matches); + + $container[$value] += $count; + + if (is_array(tplGetContainerTypes($idlay, $value))) { + $types = array_merge($types, tplGetContainerTypes($idlay, $value)); + } + } + } + + $types = array_unique($types); + $layout->setProperty("layout", "used-types", implode($types, ";")); + + $msg = ""; + + foreach ($container as $key => $value) + { + if ($value > 1) + { + $msg .= sprintf(i18n("Container %s was defined %s times"), $key, $value)."
    "; + } + } + } + + /* Try to validate html */ + if (getEffectiveSetting("layout", "htmlvalidator", "true") == "true" && $code !== "") + { + $v = new cHTMLValidator; + $v->validate($code); + + if (!$v->tagExists("body") && !$v->tagExists("BODY")) + { + $msg .= sprintf(i18n("The body tag does not exist in the layout. This is a requirement for the in-site editing.")); + $msg .= "
    "; + } + + if (!$v->tagExists("head") && !$v->tagExists("HEAD")) + { + $msg .= sprintf(i18n("The head tag does not exist in the layout. This is a requirement for the in-site editing.")); + $msg .= "
    "; + } + + foreach ($v->missingNodes as $value) + { + $idqualifier = ""; + + $attr = array(); + + if ($value["name"] != "") + { + $attr["name"] = "name '".$value["name"]."'"; + } + + if ($value["id"] != "") + { + $attr["id"] = "id '".$value["id"]."'"; + } + + $idqualifier = implode(", ",$attr); + + if ($idqualifier != "") + { + $idqualifier = "($idqualifier)"; + } + $msg .= sprintf(i18n("Tag '%s' %s has no end tag (start tag is on line %s char %s)"), $value["tag"], $idqualifier, $value["line"],$value["char"]); + $msg .= "
    "; + + } + + } + + if ($msg != "") + { + $notification->displayNotification("warning", $msg); + } + + $form = new UI_Table_Form("module"); + $form->addHeader(i18n("Edit Layout")); + $form->setWidth("100%"); + $form->setVar("area", $area); + $form->setVar("action", "lay_edit"); + $form->setVar("frame", $frame); + $form->setVar("idlay", $idlay); + + $tb_name = new cHTMLTextbox("layname", $name, 60); + $ta_description = new cHTMLTextarea("description", $description,100, 10); + $ta_description->setStyle("font-family: monospace;width: 100%;"); + $ta_description->updateAttributes(array("wrap" => "off")); + + $ta_code = new cHTMLTextarea("code", clHtmlSpecialChars($code), 100,20, 'code'); + $ta_code->setStyle("font-family: monospace;width: 100%;"); + $ta_code->updateAttributes(array("wrap" => "off")); + + $cb_refresh = new cHTMLCheckbox("refreshtemplates", i18n("On save, apply default modules to new containers")); + + $form->add(i18n("Name"),$tb_name); + $form->add(i18n("Description"),$ta_description); + $form->add(i18n("Code"),$ta_code); + $form->add(i18n("Options"), $cb_refresh); + + # Set static pointers + $tpl->set('s', 'ACTION', $sess->url("main.php?area=$area&frame=$frame&action=lay_edit")); + $tpl->set('s', 'IDLAY', $idlay); + $tpl->set('s', 'DESCR', $description); + $tpl->set('s', 'CLASS', 'code_sfullwidth'); + $tpl->set('s', 'NAME', clHtmlSpecialChars($name)); + + # Set dynamic pointers + $tpl->set('d', 'CAPTION', i18n("Code").':'); + $tpl->set('d', 'VALUE', clHtmlSpecialChars($code)); + $tpl->set('d', 'CLASS', 'code_fullwidth'); + $tpl->set('d', 'NAME', 'code'); + $tpl->next(); + + $oEditArea = new EditArea('code', 'html', substr(strtolower($belang), 0, 2), true, $cfg); + $page->addScript('editarea', $oEditArea->renderScript()); + + $sScript = ''; + + $page->setContent($form->render().$sScript); + $page->setSubnav("idlay=$idlay", "lay"); + + +} else { + unset($idlay); + $page->setContent($sMsg); + $page->setSubnav(" ", "lay"); +} + +if (stripslashes($_REQUEST['idlay'])) { + $sReloadScript = ""; +} else { + $sReloadScript = ""; +} +$page->addScript('reload', $sReloadScript); +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.lay_history.php b/conlite/includes/include.lay_history.php new file mode 100644 index 0000000..08cffb3 --- /dev/null +++ b/conlite/includes/include.lay_history.php @@ -0,0 +1,146 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release >= 5.0 + * + * {@internal + * created 2008-08-1 + * $Id: include.lay_history.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// For update current layout with Revision +cInclude("includes", "functions.lay.php"); + +// For Editor syntax highlighting +cInclude("external", "edit_area/class.edit_area.php"); + +$oPage = new cPage; +$oPage->addScript('messageBox', ''); +$oPage->addScript('messageBoxInit', ''); + +$bDeleteFile = false; + +if (!$perm->have_perm_area_action($area, 'lay_history_manage')) { + $notification->displayNotification("error", i18n("Permission denied")); + $oPage->render(); +} else if (!(int) $client > 0) { + $oPage->render(); +} else if (getEffectiveSetting('versioning', 'activated', 'false') == 'false') { + $notification->displayNotification("warning", i18n("Versioning is not activated")); + $oPage->render(); +} else { + if ($_POST["lay_send"] == true && $_POST["layname"]!="" && $_POST["laycode"] !="" && (int) $idlay > 0) { // save button + $oVersion = new VersionLayout($idlay, $cfg, $cfgClient, $db, $client, $area, $frame); + $sLayoutName = $_POST["layname"]; + $sLayoutCode = $_POST["laycode"]; + $sLayoutDescription = $_POST["laydesc"]; + + // save and mak new revision + $oPage->addScript('refresh', $oVersion->renderReloadScript('lay', $idlay, $sess)); + layEditLayout($idlay, $sLayoutName, $sLayoutDescription, $sLayoutCode); + unset($oVersion); + } + + // [action] => history_truncate delete all current modul history + if($_POST["action"] == "history_truncate") { + $oVersion = new VersionLayout($idlay, $cfg, $cfgClient, $db, $client, $area, $frame); + $bDeleteFile = $oVersion->deleteFile(); + unset($oVersion); + } + + // Init construct with contenido variables, in class.VersionLayout + $oVersion = new VersionLayout($idlay, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Init Form variables of SelectBox + $sSelectBox = ""; + $oVersion->setVarForm("area", $area); + $oVersion->setVarForm("frame", $frame); + $oVersion->setVarForm("idlay", $idlay); + + // create and output the select box, for params please look class.version.php + $sSelectBox = $oVersion->buildSelectBox("mod_history", "Layout History", "Show History Entry", "idlayhistory"); + + // Generate Form + $oForm = new UI_Table_Form("lay_display"); + $oForm->addHeader(i18n("Edit Layout")); + $oForm ->setWidth("100%"); + $oForm->setVar("area", "lay_history"); + $oForm->setVar("frame", $frame); + $oForm->setVar("idlay", $idlay); + $oForm->setVar("lay_send", 1); + + // if send form refresh + if ($_POST["idlayhistory"] != "") { + $sRevision = $_POST["idlayhistory"]; + } else { + $sRevision = $oVersion->getLastRevision(); + } + + if ($sRevision != '' && $_POST["action"] != "history_truncate") { + // File Path + $sPath = $oVersion->getFilePath() . $sRevision; + + // Read XML Nodes and get an array + $aNodes = array(); + $aNodes = $oVersion->initXmlReader($sPath); + + // Create Textarea and fill it with xml nodes + if (count($aNodes) > 1) { + // if choose xml file read value an set it + $sName = $oVersion->getTextBox("layname", $aNodes["name"], 60); + $sDescription = $oVersion->getTextarea("laydesc", $aNodes["desc"], 100, 10); + $sCode = $oVersion->getTextarea("laycode", $aNodes["code"], 100, 30, "IdLaycode"); + + } + } + + // Add new Elements of Form + $oForm->add(i18n("Name"), $sName); + $oForm->add(i18n("Description"), $sDescription); + $oForm->add(i18n("Code"), $sCode); + $oForm->setActionButton("apply", "images/but_ok.gif", i18n("Copy to current"), "c"/*, "mod_history_takeover"*/); //modified it + $oForm->unsetActionButton("submit"); + + // Render and handle History Area + $oEditAreaOutput = new EditArea('IdLaycode', 'php', substr(strtolower($belang), 0, 2), true, $cfg, !$bInUse); + $oPage->addScript('IdLaycode', $oEditAreaOutput->renderScript()); + + if($sSelectBox !="") { + $oPage->setContent($sSelectBox . $oForm->render()); + + } else { + if($bDeleteFile){ + $notification->displayNotification("warning", i18n("Version history was cleared")); + } else { + $notification->displayNotification("warning", i18n("No layout history available")); + } + + } + $oPage->render(); + + +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.lay_new.php b/conlite/includes/include.lay_new.php new file mode 100644 index 0000000..8e35232 --- /dev/null +++ b/conlite/includes/include.lay_new.php @@ -0,0 +1,44 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-27 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.lay_new.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); + +if ((int) $client > 0) { + $tpl->set('s', 'ACTION', ''); +} else { + $tpl->set('s', 'ACTION', i18n('No Client selected')); +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.lay_overview.php b/conlite/includes/include.lay_overview.php new file mode 100644 index 0000000..5b726f3 --- /dev/null +++ b/conlite/includes/include.lay_overview.php @@ -0,0 +1,121 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-27 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-08-18, Munkh-Ulzii Balidar, add a functionality to show the used info + * + * $Id: include.lay_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oLayouts = new cApiLayoutCollection(); +$oLayouts->select("idclient = '$client'", '', 'name ASC'); + +$tpl->reset(); + +$tpl->set('s', 'SID', $sess->id); + +$darkrow = false; +while ($layout = $oLayouts->next()) { + + if (!$perm->have_perm_area_action_item('lay_edit', 'lay_edit', $layout->get('idlay'))) { + continue; + } + + $name = $layout->get('name'); + $descr = $layout->get('description'); + $idlay = $layout->get('idlay'); + + if (strlen($descr) > 64) { + $descr = substr($descr, 0, 64); + $descr .= ' ..'; + } + + $tmp_mstr = '%s'; + $area = 'lay'; + $mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&idlay=$idlay"), + 'right_bottom', + $sess->url("main.php?area=lay_edit&frame=4&idlay=$idlay"), + $descr, $descr, $name); + + $tpl->set('d', 'NAME', $mstr); + + $inUse = $classlayout->layoutInUse($idlay); + + $bgColor = ($darkrow) ? $cfg['color']['table_dark'] : $cfg['color']['table_light']; + $darkrow = !$darkrow; + $tpl->set('d', 'BGCOLOR', $bgColor); + + if ((!$perm->have_perm_area_action_item('lay', 'lay_delete', $idlay)) && + (!$perm->have_perm_area_action('lay', 'lay_delete'))) { + $delDescr = i18n("No permission"); + } + + if ($inUse) { + $delDescr = i18n("Layout is in use, cannot delete"); + $inUseDescr = i18n("Click for more information about usage"); + $inUseLink = '' + . ''.$inUseDescr.''; + $tpl->set('d', 'INUSE', $inUseLink); + } else { + $tpl->set('d', 'INUSE', ''); + } + + if ($perm->have_perm_area_action_item('lay', 'lay_delete', $idlay) && !$inUse) { + $delTitle = i18n("Delete layout"); + $delDescr = sprintf(i18n("Do you really want to delete the following layout:

    %s
    "), clHtmlSpecialChars($name)); + $delLink = '' + . ''.$delTitle.''; + $tpl->set('d', 'DELETE', $delLink); + } else { + $tpl->set('d', 'DELETE',''.$delDescr.''); + } + + $todo = new TODOLink('idlay', $idlay, i18n("Layout") . ': ' . $name, ''); + + $tpl->set('d', 'TODO', $todo->render()); + + if (stripslashes($_REQUEST['idlay']) == $idlay) { + $tpl->set('d', 'ID', 'marked'); + } else { + $tpl->set('d', 'ID', ''); + } + + $tpl->next(); +} + +//datas for show of used info per ajax +$tpl->set('s', 'AREA', $area); +$tpl->set('s', 'SESSION', $contenido); +$tpl->set('s', 'AJAXURL', $cfg['path']['contenido_fullhtml'].'ajaxmain.php'); +$tpl->set('s', 'BOX_TITLE', i18n("The layout '%s' is used for following templates") . ":"); + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['lay_overview']); +?> \ No newline at end of file diff --git a/conlite/includes/include.lay_preview.php b/conlite/includes/include.lay_preview.php new file mode 100644 index 0000000..a0a5d74 --- /dev/null +++ b/conlite/includes/include.lay_preview.php @@ -0,0 +1,39 @@ + + * @version $Rev: 312 $ + * @since 2.0 + * @link www.conlite.org ConLite Portal + * + * $Id: include.lay_preview.php 312 2014-06-18 11:01:08Z oldperl $ + */ +/** + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$oLayout = new cApiLayout(Contenido_Security::toInteger($_GET['idlay'])); +if($oLayout->virgin) { + echo i18n("No such layout"); +} else { + $code = $oLayout->getLayout(); + /* Insert base href */ + $base = ''; + + $code = str_replace("", "\n".$base, $code); + + eval("?>\n".Contenido_Security::unescapeDB($code)."\n \ No newline at end of file diff --git a/conlite/includes/include.left_top_blank.php b/conlite/includes/include.left_top_blank.php new file mode 100644 index 0000000..558c1f2 --- /dev/null +++ b/conlite/includes/include.left_top_blank.php @@ -0,0 +1,37 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-01-21 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.left_top_blank.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); +$tpl->generate($cfg["path"]["templates"] . $cfg['templates']['left_top_blank']); +?> \ No newline at end of file diff --git a/conlite/includes/include.logs.php b/conlite/includes/include.logs.php new file mode 100644 index 0000000..3f975c4 --- /dev/null +++ b/conlite/includes/include.logs.php @@ -0,0 +1,324 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-09 + * modified 2008-06-16, Holger Librenz, Hotfix: added check for invalid calls + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-10-15, Dominik Ziegler, fetching areaname from actions array to save a lot of database queries + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.logs.php 315 2014-06-26 06:13:38Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$clientclass = new Client; + +$db2 = new DB_ConLite; + +if(!$perm->have_perm_area_action($area)) +{ + $notification->displayNotification("error", i18n("Permission denied")); +} else { + + $tpl->reset(); + + $form = ' + '.$sess->hidden_session(true).' + + + '; + + + $tpl->set('s', 'FORM', $form); + $tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('s', 'SELECTBGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('s', 'SELECTBBGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('s', 'HEADERBGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('s', 'RHEADERBGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('s', 'SUBMITTEXT', i18n("Submit query")); + $tpl->set('s', 'CANCELLINK', $sess->url("main.php?area=$area&frame=4")); + + + $userclass = new Users(); + $structureclass = new Structure(); + $artclass = new Art(); + $actionclass = new Action(); + + $clients = $clientclass->getAccessibleClients(); + $users = $userclass->getAccessibleUsers(explode(',', $auth->auth['perm'])); + $userselect = ""; + $actions = $actionclass->getAvailableActions(); + $actionselect = ""; + $clientList = $clientclass->getAccessibleClients(); + + foreach ($clientList as $key=>$value) { + if (strcmp($idqclient,$key) == 0) { + $selected = "SELECTED"; + } else { + $selected = ""; + } + + $clientselect .= ""; + } + + foreach ($users as $key=>$value) { + if (strcmp($idquser,$key) == 0) { + $selected = "SELECTED"; + } else { + $selected = ""; + } + + $userselect .= ""; + } + + foreach ($actions as $key=>$value) { + if (strcmp($idqaction,$key) == 0) { + $selected = "SELECTED"; + } else { + $selected = ""; + } + + // $areaname = $classarea->getAreaName($actionclass->getAreaForAction($value["name"])); + $areaname = $value["areaname"]; + $actionDescription = $lngAct[$areaname][$value["name"]]; + + if ($actionDescription == "") + { + $actionDescription = $value["name"]; + } + + $actionselect .= ""; + } + + $days = array(); + + for ($i = 1; $i < 32; $i ++) + { + $days[$i] = $i; + } + + $months = array(); + + for ($i = 1; $i < 13; $i++) + { + $months[$i] = $i; + } + + $years = array(); + for ($i = 2000; $i < 2020; $i++) + { + $years[$i] = $i; + } + + $fromday = new cHTMLSelectElement("fromday"); + $fromday->autoFill($days); + + if ($_REQUEST["fromday"] > 0) + { + $fromday->setDefault($_REQUEST["fromday"]); + } else { + $fromday->setDefault(date("j")); + } + $today = new cHTMLSelectElement("today"); + $today->autoFill($days); + + if ($_REQUEST["today"] > 0) + { + $today->setDefault($_REQUEST["today"]); + } else { + $today->setDefault(date("j")); + } + + $frommonth = new cHTMLSelectElement("frommonth"); + $frommonth->autoFill($months); + + if ($_REQUEST["frommonth"] > 0) + { + $frommonth->setDefault($_REQUEST["frommonth"]); + } else { + $frommonth->setDefault(date("n")); + } + + $tomonth = new cHTMLSelectElement("tomonth"); + $tomonth->autoFill($months); + + if ($_REQUEST["tomonth"] > 0) + { + $tomonth->setDefault($_REQUEST["tomonth"]); + } else { + $tomonth->setDefault(date("n")); + } + + $fromyear = new cHTMLSelectElement("fromyear"); + $fromyear->autoFill($years); + + if ($_REQUEST["fromyear"] > 0) + { + $fromyear->setDefault($_REQUEST["fromyear"]); + } else { + $fromyear->setDefault(date("Y")); + } + + $toyear = new cHTMLSelectElement("toyear"); + $toyear->autoFill($years); + + if ($_REQUEST["toyear"] > 0) + { + $toyear->setDefault($_REQUEST["toyear"]); + } else { + $toyear->setDefault(date("Y")); + } + + $entries = array(); + $entries[0] = i18n("Unlimited"); + $entries[10] = "10 ". i18n("Entries"); + $entries[20] = "20 ". i18n("Entries"); + $entries[30] = "30 ". i18n("Entries"); + $entries[50] = "50 ". i18n("Entries"); + $entries[100] = "100 ". i18n("Entries"); + + $olimit = new cHTMLSelectElement("limit"); + $olimit->autoFill($entries); + + if (isset($_REQUEST["limit"])) + { + $olimit->setDefault($_REQUEST["limit"]); + } else { + $olimit->setDefault(10); + } + + $tpl->set('s', 'USERS', $userselect); + $tpl->set('s', 'CLIENTS', $clientselect); + $tpl->set('s', 'ACTION', $actionselect); + $tpl->set('s', 'FROMDAY', $fromday->render()); + $tpl->set('s', 'FROMMONTH', $frommonth->render()); + $tpl->set('s', 'FROMYEAR', $fromyear->render()); + $tpl->set('s', 'TODAY', $today->render()); + $tpl->set('s', 'TOMONTH', $tomonth->render()); + $tpl->set('s', 'TOYEAR', $toyear->render()); + $tpl->set('s', 'LIMIT', $olimit->render()); + + $fromdate = $fromyear->getDefault()."-".$frommonth->getDefault()."-".$fromday->getDefault()." 00:00:00"; + $todate = $toyear->getDefault()."-".$tomonth->getDefault()."-".$today->getDefault()." 23:59:59"; + + if ($limit == 0) + { + $limitsql = ""; + } else { + $limitsql = "LIMIT ".Contenido_Security::escapeDB($limit, $db); + } + + if ($idquser == "%") + { + $users = $userclass->getAccessibleUsers(explode(',', $auth->auth['perm'])); + + foreach ($users as $key=>$value) { + $userarray[] = $key; + } + + $uservalues = implode('", "',$userarray); + $userquery = 'IN ("'.$uservalues.'")'; + } else { + $userquery = "LIKE '".$idquser."'"; + } + + $sql = 'SELECT + idlog, + user_id, + idaction, + idlang, + idclient, + idcatart, + logtimestamp + FROM + '. $cfg["tab"]["actionlog"] . ' + WHERE + user_id '.$userquery.' AND + idaction LIKE "'.Contenido_Security::escapeDB($idqaction, $db).'" AND + logtimestamp > "'.Contenido_Security::escapeDB($fromdate, $db).'" AND + logtimestamp < "'.Contenido_Security::escapeDB($todate, $db).'" AND + idclient LIKE "'.Contenido_Security::escapeDB($idqclient, $db).'" + ORDER BY logtimestamp DESC ' + . $limitsql; + + $db->query($sql); + + if ($db->affected_rows() == 0) + { + $noresults = ''. + ''.i18n("No results").''; + + } else { + $noresults = ""; + } + + $tpl->set('s', 'NORESULTS', $noresults); + + while ($db->next_record()) + { + + $darkrow = !$darkrow; + + if ($darkrow) + { + $bgcolor = $cfg["color"]["table_dark"]; + } else { + $bgcolor = $cfg["color"]["table_light"]; + } + + $structureName = $structureclass->getStructureName($structureclass->getStructureIDForCatArt($db->f("idcatart")),$db->f("idlang")); + $artName = $artclass->getArtName($artclass->getArtIDForCatArt($db->f("idcatart")),$db->f("idlang")); + + if ($structureName == "") { $structureName = "-"; } + if ($artName == "") { $artName = "-"; } + + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'RBGCOLOR', $bgcolor); + $tpl->set('d', 'RCLIENT', $clientList[$db->f("idclient")]["name"]); + $tpl->set('d', 'RDATETIME', $db->f("logtimestamp")); + $tpl->set('d', 'RUSER' , $users[$db->f("user_id")]["username"]); + $areaname = $classarea->getAreaName($actionclass->getAreaForAction($db->f("idaction"))); + $actionDescription = $lngAct[$areaname][$actionclass->getActionName($db->f("idaction"))]; + if ($actionDescription == "") + { + $actionDescription = $actionclass->getActionName($db->f("idaction")); + } + $tpl->set('d', 'RACTION', $actionDescription ); + $tpl->set('d', 'RSTR', $structureName); + $tpl->set('d', 'RPAGE', $artName); + + $tpl->next(); + + } + + # Generate template + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['log_main']); + +} +?> diff --git a/conlite/includes/include.mod_edit_form.php b/conlite/includes/include.mod_edit_form.php new file mode 100644 index 0000000..0d46b23 --- /dev/null +++ b/conlite/includes/include.mod_edit_form.php @@ -0,0 +1,491 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-21 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2011-02-07, Dominik Ziegler, removed integration of not supported java module editor + * + * $Id: include.mod_edit_form.php 438 2016-05-17 17:31:24Z oldperl $: + * }} + * + */ +// security +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.upl.php"); +cInclude("external", "edit_area/class.edit_area.php"); + +$noti = ""; +$sOptionDebugRows = getEffectiveSetting("modules", "show-debug-rows", "never"); + +if (!isset($idmod)) + $idmod = 0; + +if ($action == "mod_delete") { + $modules = new cApiModuleCollection; + $modules->delete($idmod); + unset($modules); + $idmod = 0; +} + +if (($action == "mod_new") && (!$perm->have_perm_area_action_anyitem($area, $action))) { + $notification->displayNotification("error", i18n("No permission")); +} else { + if ($action == "mod_new") { + $modules = new cApiModuleCollection; + $module = $modules->create(i18n("- Unnamed Module -")); + $module->set("description", implode("\n", array(i18n(""), "", i18n("Author: "), i18n("Version:")))); + $module->store(); + } else { + $module = new cApiModule; + $module->loadByPrimaryKey($idmod); + } + + if ($action == "mod_importexport_module") { + if ($mode == "export") { + $name = uplCreateFriendlyName($module->get("name")); + + if ($name != "") { + $module->export($name . ".xml"); + } + } + if ($mode == "import") { + if (file_exists($_FILES["upload"]["tmp_name"])) { + if (!$module->import($_FILES["upload"]["tmp_name"])) { + $noti .= sprintf(i18n("Error while importing XML file: %s"), $module->_error) . "
    "; + } else { + // Load the item again (clearing slashes from import) + $module->loadByPrimaryKey($module->get($module->primaryKey)); + } + } + } + } + + if ($action == "mod_folder_create") { + if ($module->createModuleFolder()) { + $notification->displayNotification("info", i18n("Module folder created")); + $module->loadByPrimaryKey($module->get($module->primaryKey)); + } else { + $notification->displayNotification("error", i18n("Error while creating module folder")); + } + } + + $idmod = $module->get("idmod"); + //var_dump($module); + + if (!$perm->have_perm_area_action_item("mod_edit", "mod_edit", $idmod)) { + $link = new cHTMLLink; + $link->setCLink("mod_translate", 4, ""); + $link->setCustom("idmod", $idmod); + + header("Location: " . $link->getHREF()); + } else { + $oInUse = new InUseCollection; + list($bInUse, $message) = $oInUse->checkAndMark("idmod", $idmod, true, i18n("Module is in use by %s (%s)"), true, "main.php?area=$area&frame=$frame&idmod=$idmod"); + unset($oInUse); + + if ($bInUse == true) { + $message .= "
    "; + $disabled = 'disabled="disabled"'; + } else { + $disabled = ""; + } + + $page = new cPage; + $form = new UI_Table_Form("mod_edit"); + $form->setVar("area", "mod_edit"); + $form->setVar("frame", $frame); + $form->setVar("idmod", $idmod); + + if (!$bInUse) { + $form->setVar("action", "mod_edit"); + } + $form->setWidth("100%"); + + $form->addHeader(i18n("Edit module")); + $name = new cHTMLTextbox("name", $module->get("name"), 60); + $descr = new cHTMLTextarea("descr", clHtmlSpecialChars($module->get("description")), 100, 5); + + // Get input and output code; if specified, prepare row fields + $sInputData = clHtmlSpecialChars($module->get("input")); + $sOutputData = clHtmlSpecialChars($module->get("output")); + + if ($sOptionDebugRows !== "never") { + $iInputNewLines = substr_count($sInputData, "\n") + 2; // +2: Just sanity, to have at least two more lines than the code + $iOutputNewLines = substr_count($sOutputData, "\n") + 2; // +2: Just sanity, to have at least two more lines than the code + // Have at least 15 + 2 lines (15 = code textarea lines count) + if ($iInputNewLines < 21) { + $iInputNewLines = 21; + } + if ($iOutputNewLines < 21) { + $iOutputNewLines = 21; + } + + // Calculate how many characters are needed (e.g. 2 for lines ip to 99) + $iInputNewLineChars = strlen($iInputNewLines); + $iOutputNewLineChars = strlen($iOutputNewLines); + if ($iInputNewLineChars > $iOutputNewLineChars) { + $iChars = $iInputNewLineChars; + } else { + $iChars = $iOutputNewLineChars; + } + unset($iInputNewLineChars); + unset($iOutputNewLineChars); + + $sRows = ""; + for ($i = 1; $i <= $iInputNewLines; $i++) { + if ($sRows) { + $sRows .= "\r\n"; + } + $sRows .= sprintf("%0" . $iChars . "d", $i); + } + $oInputRows = new cHTMLTextarea("txtInputRows", $sRows, $iChars, 20); + + $sRows = ""; + for ($i = 1; $i <= $iOutputNewLines; $i++) { + if ($sRows) { + $sRows .= "\r\n"; + } + $sRows .= sprintf("%0" . $iChars . "d", $i); + } + $oOutputRows = new cHTMLTextarea("txtOutputRows", $sRows, $iChars, 20); + + $oInputRows->updateAttributes(array("wrap" => "off")); + $oOutputRows->updateAttributes(array("wrap" => "off")); + + $oInputRows->updateAttributes(array("readonly" => "true")); + $oOutputRows->updateAttributes(array("readonly" => "true")); + + $oInputRows->setStyle("font-family: monospace;"); + $oOutputRows->setStyle("font-family: monospace;"); + $oOutputRows->setStyle("font-family: monospace;"); + } + $input = new cHTMLTextarea("input", $sInputData, 100, 20, 'input'); + $output = new cHTMLTextarea("output", $sOutputData, 100, 20, 'output'); + + // Style the fields + $input->updateAttributes(array("wrap" => "off")); + $output->updateAttributes(array("wrap" => "off")); + + $name->setDisabled($disabled); + $descr->setDisabled($disabled); + if ($module->isLoadedFromFile("input")) { + $input->setDisabled('disabled="disabled"'); + } else { + $input->setDisabled($disabled); + } + if ($module->isLoadedFromFile("output")) { + $output->setDisabled('disabled="disabled"'); + } else { + $output->setDisabled($disabled); + } + + $descr->setStyle("width: 100%; font-family: monospace;"); + $input->setStyle("width: 100%; font-family: monospace;"); + $output->setStyle("width: 100%; font-family: monospace;"); + + // Check, if tabs may be inserted in text areas (instead jumping to next element) + if (getEffectiveSetting("modules", "edit-with-tabs", "false") == "true") { + $sTabScript = ''; + $page->addScript("tabScript", $sTabScript); + + $input->setEvent("onkeydown", "return insertTab(event,this);"); + $output->setEvent("onkeydown", "return insertTab(event,this);"); + } + + // Prepare type select box + $typeselect = new cHTMLSelectElement("type"); + + $db2 = new DB_ConLite; + $sql = "SELECT type FROM " . $cfg["tab"]["mod"] . " " . + "WHERE idclient = '" . $client . "' GROUP BY type"; // This query can't be designed using GenericDB... + $db2->query($sql); + + $aTypes = array(); + while ($db2->next_record()) { + if ($db2->f("type") != "") { + $aTypes[] = $db2->f("type"); + } + } + + // Read existing layouts + $oLayouts = new cApiLayoutCollection; + $oLayouts->setWhere("idclient", $client); + $oLayouts->query(); + + while ($oLayout = $oLayouts->next()) { + $aTypes = array_merge(explode(";", $oLayout->getProperty("layout", "used-types")), $aTypes); + } + $aTypes = array_unique($aTypes); + + foreach ($aTypes as $sType) { + $typearray[$sType] = $sType; + } + unset($aTypes); + + if (is_array($typearray)) { + asort($typearray); + $typeselect->autoFill(array_merge(array("" => "-- " . i18n("Custom") . " --"), $typearray)); + } else { + $typeselect->autoFill(array("" => "-- " . i18n("Custom") . " --")); + } + + $typeselect->setEvent("change", 'if (document.forms["mod_edit"].elements["type"].value == 0) { document.forms["mod_edit"].elements["customtype"].disabled=0;} else {document.forms["mod_edit"].elements["customtype"].disabled=1;}'); + $typeselect->setDisabled($disabled); + + $custom = new cHTMLTextbox("customtype", ""); + $custom->setDisabled($disabled); + + if ($module->get("type") == "" || $module->get("type") == "0") { + $typeselect->setDefault("0"); + } else { + $typeselect->setDefault($module->get("type")); + $custom->setDisabled("disabled"); + } + + $modulecheck = getSystemProperty("system", "modulecheck"); + + $inputok = true; + $outputok = true; + if ($modulecheck !== "false") { + $outputok = modTestModule($module->get("output"), $module->get("idmod") . "o", true); + if (!$outputok) { + $errorMessage = sprintf(i18n("Error in module. Error location: %s"), $modErrorMessage); + $outled = '' . $errorMessage . ''; + } else { + $okMessage = i18n("Module successfully compiled"); + $outled = '' . $okMessage . ''; + } + + $inputok = modTestModule($module->get("input"), $module->get("idmod") . "i"); + if (!$inputok) { + $errorMessage = sprintf(i18n("Error in module. Error location: %s"), $modErrorMessage); + $inled = '' . $errorMessage . ''; + } else { + $okMessage = i18n("Module successfully compiled"); + $inled = '' . $okMessage . ''; + } + + // Store error information in the database (to avoid re-eval for module overview/menu) + if ($inputok && $outputok) { + $sStatus = "none"; + } else if ($inputok) { + $sStatus = "input"; + } else if ($outputok) { + $sStatus = "output"; + } else { + $sStatus = "both"; + } + + // If status has been changed, store and show in overview + $sPrevStatus = $module->get("error"); + if ($sPrevStatus !== $sStatus) { + $module->set("error", $sStatus); + $module->store(); + + $page->setReload(); + } + } + /* dceModFileEdit (c)2009-2011 www.dceonline.de */ + if ($cfg['dceModEdit']['use']) { + // button for mod folder creation + if (!$module->hasModuleFolder() && $action != "mod_new") { + $aParam = array( + 'action' => 'mod_folder_create', + 'area' => $area, + 'idmod' => $idmod, + 'frame' => $frame + ); + $oCreateFolderButton = new cHTMLLink($sess->self_url($aParam)); + $oCreateFolderButton->setContent(i18n("Create Folder")); + $sCreateFolderButton = " " . $oCreateFolderButton->render(); + } else { + $sCreateFolderButton = ""; + } + + $form->add(i18n("Name"), $name->render() . " (id: " . $module->get("idmod") . + " | dir: " . strtolower(uplCreateFriendlyName($module->get("name"))) . ")" . + $sCreateFolderButton); + } else { + $form->add(i18n("Name"), $name->render()); + } + /* End dceModFileEdit (c)2009-2011 www.dceonline.de */ + $form->add(i18n("Type"), $typeselect->render() . $custom->render()); + $form->add(i18n("Description"), $descr->render()); + + if ($sOptionDebugRows == "always" || ($sOptionDebugRows == "onerror" && (!$inputok || !$outputok))) { + $sSyncScript = ' + '; + $page->addScript("syncScript", $sSyncScript); + + $form->add('
    ' . i18n("Input") . '' . $inled . '' . $oInputRows->render() . '
    ', $input->render()); + $form->add('
    ' . i18n("Output") . '' . $outled . '' . $oOutputRows->render() . '
    ', $output->render()); + } else { + $form->add('
    ' . i18n("Input") . '' . $inled . '
    ', $input->render()); + $form->add('
    ' . i18n("Output") . '' . $outled . '
    ', $output->render()); + } + + $noti = ""; + + if ($module->isOldModule()) { + $noti .= $notification->returnNotification("warning", i18n("This module uses variables and/or functions which are probably not available in this Contenido version. Please make sure that you use up-to-date modules.")); + $noti .= "
    "; + } + + if ($idmod != 0) { + $import = new cHTMLRadiobutton("mode", "import"); + $export = new cHTMLRadiobutton("mode", "export"); + + $import->setLabelText(i18n("Import from file")); + $export->setLabelText(i18n("Export to file")); + + $import->setEvent("click", "document.getElementById('vupload').style.display = '';"); + $export->setEvent("click", "document.getElementById('vupload').style.display = 'none';"); + + $upload = new cHTMLUpload("upload"); + + if ($module->get("input") != "" && $module->get("output") != "") { + $export->setChecked("checked"); + } else { + $import->setChecked("checked"); + } + $form2 = new UI_Table_Form("export"); + $form2->setVar("action", "mod_importexport_module"); + $form2->setVar("use_encoding", "false"); + $form2->addHeader("Import/Export"); + $form2->add(i18n("Mode"), array($export, "
    ", $import)); + if ($module->get("input") != "" && $module->get("output") != "") { + $form2->add(i18n("File"), $upload, "vupload", "display: none;"); + } else { + $form2->add(i18n("File"), $upload, "vupload"); + } + $form2->setVar("area", $area); + $form2->setVar("frame", $frame); + $form2->setVar("idmod", $idmod); + $form2->custom["submit"]["accesskey"] = ''; + + $sScript = ''; + + $page->setContent($noti . $message . $form->render() . "
    " . $form2->render() . $sScript); + } + + $page->setSubnav("idmod=$idmod", "mod"); + if ($action) { + if (stripslashes($idmod > 0)) { + $sReloadScript = ""; + } else { + $sReloadScript = ""; + } + + // Only reload overview/menu page, if something may have changed + $page->addScript('reload', $sReloadScript); + } + if (!($action == "mod_importexport_module" && $mode == "export")) { + $oEditAreaInput = new EditArea('input', 'php', substr(strtolower($belang), 0, 2), true, $cfg, (($module->isLoadedFromFile("input")) ? FALSE : !$bInUse)); + $oEditAreaOutput = new EditArea('output', 'php', substr(strtolower($belang), 0, 2), false, $cfg, (($module->isLoadedFromFile("output")) ? FALSE : !$bInUse)); + $page->addScript('editarea', $oEditAreaInput->renderScript() . $oEditAreaOutput->renderScript()); + + $page->render(); + } + } +} \ No newline at end of file diff --git a/conlite/includes/include.mod_history.php b/conlite/includes/include.mod_history.php new file mode 100644 index 0000000..db229cd --- /dev/null +++ b/conlite/includes/include.mod_history.php @@ -0,0 +1,159 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release >= 5.0 + * + * {@internal + * created 2008-08-12 + * $Id: include.mod_history.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// For Editor syntax highlighting +cInclude("external", "edit_area/class.edit_area.php"); + +// +cInclude("includes", "functions.mod.php"); + + +if($idmod =="") { + $idmod = $_REQUEST['idmod']; +} + +$bDeleteFile = false; +$oPage = new cPage; +$oPage->addScript('messageBox', ''); +$oPage->addScript('messageBoxInit', ''); + +if (!$perm->have_perm_area_action($area, 'mod_history_manage')) +{ + $notification->displayNotification("error", i18n("Permission denied")); + $oPage->render(); +} else if (!(int) $client > 0) { + $oPage->render(); +} else if (getEffectiveSetting('versioning', 'activated', 'false') == 'false') { + $notification->displayNotification("warning", i18n("Versioning is not activated")); + $oPage->render(); +} else { + + if ($_POST["mod_send"] == true && ($_POST["CodeOut"] !="" || $_POST["CodeIn"] !="") ) { // save button + $oVersion = new VersionModule($idmod, $cfg, $cfgClient, $db, $client, $area, $frame); + $sName = $_POST["modname"]; + $sCodeInput = $_POST["CodeIn"]; + $sCodeOutput = $_POST["CodeOut"]; + $sDescription = $_POST["moddesc"]; + + // save and mak new revision + $oPage->addScript('refresh', $oVersion->renderReloadScript('mod', $idmod, $sess)); + modEditModule($idmod, $sName, $sDescription, $sCodeInput, $sCodeOutput, $oVersion->sTemplate, $oVersion->sModType); + unset($oVersion); + } + + // [action] => history_truncate delete all current history + if($_POST["action"] == "history_truncate") { + $oVersion = new VersionModule($idmod, $cfg, $cfgClient, $db, $client, $area, $frame); + $bDeleteFile = $oVersion->deleteFile(); + unset($oVersion); + } + + $oVersion = new VersionModule($idmod, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Init Form variables of SelectBox + $sSelectBox = ""; + $oVersion->setVarForm("area", $area); + $oVersion->setVarForm("frame", $frame); + $oVersion->setVarForm("idmod", $idmod); + + // create and output the select box, for params please look class.version.php + $sSelectBox = $oVersion->buildSelectBox("mod_history", "Mod History", "Show History Entry", "idmodhistory"); + + // Generate Form + $oForm = new UI_Table_Form("mod_display"); + $oForm->addHeader(i18n("Edit Module")); + $oForm ->setWidth("100%"); + $oForm->setVar("area", "mod_history"); + $oForm->setVar("frame", $frame); + $oForm->setVar("idmod", $idmod); + $oForm->setVar("mod_send", 1); + + + + // if send form refresh + if ($_POST["idmodhistory"] != "") { + $sRevision = $_POST["idmodhistory"]; + } else { + $sRevision = $oVersion->getLastRevision(); + } + + if ($sRevision != '' && $_POST["action"] != "history_truncate") { + // File Path + $sPath = $oVersion->getFilePath() . $sRevision; + + // Read XML Nodes and get an array + $aNodes = array(); + $aNodes = $oVersion->initXmlReader($sPath); + + if (count($aNodes) > 1) { + + // if choose xml file read value an set it + $sName = $oVersion->getTextBox("modname", $aNodes["name"], 60); + $sDescription = $oVersion->getTextarea("moddesc", $aNodes["desc"], 100, 10); + $sCodeInput = $oVersion->getTextarea("CodeIn", $aNodes["code_input"], 100, 30, "IdCodeIn"); + $sCodeOutput = $oVersion->getTextarea("CodeOut", $aNodes["code_output"], 100, 30, "IdCodeOut"); + + + } + } + + // Add new Elements of Form + $oForm->add(i18n("Name"), $sName); + $oForm->add(i18n("Description"), $sDescription); + $oForm->add(i18n("Code Input"), $sCodeInput); + $oForm->add(i18n("Code Output"), $sCodeOutput); + $oForm->setActionButton("apply", "images/but_ok.gif", i18n("Copy to current"), "c"/*, "mod_history_takeover"*/); //modified it + $oForm->unsetActionButton("submit"); + + // Render and handle History Area + + $oEditAreaIn = new EditArea('IdCodeIn', 'php', substr(strtolower($belang), 0, 2), true, $cfg, !$bInUse); + $oEditAreaOutput = new EditArea('IdCodeOut', 'php', substr(strtolower($belang), 0, 2), true, $cfg, !$bInUse); + $oPage->addScript('IdCodeIn', $oEditAreaIn->renderScript()); + $oPage->addScript('IdCodeOut', $oEditAreaOutput->renderScript()); + + if($sSelectBox !="") { + $oPage->setContent($sSelectBox . $oForm->render()); + + } else { + if($bDeleteFile){ + $notification->displayNotification("warning", i18n("Version history was cleared")); + } else { + $notification->displayNotification("warning", i18n("No module history available")); + } + + + } + $oPage->render(); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.mod_new.php b/conlite/includes/include.mod_new.php new file mode 100644 index 0000000..c0eb58d --- /dev/null +++ b/conlite/includes/include.mod_new.php @@ -0,0 +1,216 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST['elemperpage']) || $_REQUEST['elemperpage'] < 0) { + $oUser = new cApiUser($auth->auth["uid"]); + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); + unset($oUser); +} + +$tpl->reset(); + +################# +# New Module Link +################# +$str = ''; +if ((int) $client > 0) { + ####### + # Sync Module + ####### + $oModuleCollection = new cApiModuleCollection; + $oModuleCollection->setWhere("idclient", $client); + + $oModuleCollection->query(); + $iItemCount = $oModuleCollection->count(); + + // sync all modules if wanted + if(isset($_GET['syncmod']) && (int) $_GET['syncmod'] == 1) { + + /* @var $oModule cApiModule */ + while ($oModule = $oModuleCollection->next()) { + if(!$oModule->isLoadedFromFile('output') && !$oModule->isLoadedFromFile('input')) continue; + if($oModule->isLoadedFromFile('output')) { + $oModule->set("output", addslashes(stripslashes($oModule->get('output')))); + } + if($oModule->isLoadedFromFile('input')) { + $oModule->set("input", addslashes(stripslashes($oModule->get('input')))); + } + $oModule->set("lastmodified", date("Y-m-d H:i:s")); + $oModule->store(); + unset($oModule); + } + } + unset($oModuleCollection); + + $str = '
    '; + $str .= ''.i18n("New module").''."\n"; + if($cfg['dceModEdit']['use'] == true && $iItemCount > 0) { + $str .= ''."\n"; + $str .= i18n("Sync module").''; + } + $str .= '
    '; +} else { + $str = '
    '.i18n('No Client selected').'
    '; +} + +#only show other options, if there is a active client +if ((int) $client > 0) { + + $_REQUEST['page'] = (isset($_REQUEST['page']))?(int)$_REQUEST['page']:1; + + ############### + # List Options + ############### + $aSortByOptions = array ("name" => i18n("Name"), "type" => i18n("Type")); + $aSortOrderOptions = array ("asc" => i18n("Ascending"), "desc" => i18n("Descending")); + $_REQUEST['sortby'] = (isset($_REQUEST['sortby']) && array_key_exists($_REQUEST['sortby'], $aSortByOptions))? + $_REQUEST['sortby']:''; + $_REQUEST['sortorder'] = (isset($_REQUEST['sortorder']) && array_key_exists($_REQUEST['sortorder'], $aSortOrderOptions))? + $_REQUEST['sortorder']:''; + $listoplink="listoptions"; + $oListOptionRow = new cFoldingRow("e9ddf415-4b2d-4a75-8060-c3cd88b6ff98", i18n("List options"), $listoplink); + $tpl->set('s', 'LISTOPLINK', $listoplink); + $oSelectItemsPerPage = new cHTMLSelectElement("elemperpage"); + $oSelectItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); + $oSelectItemsPerPage->setDefault($_REQUEST["elemperpage"]); + $oSelectSortBy = new cHTMLSelectElement("sortby"); + $oSelectSortBy->autoFill($aSortByOptions); + $oSelectSortBy->setDefault($_REQUEST["sortby"]); + $oSelectSortOrder = new cHTMLSelectElement("sortorder"); + $oSelectSortOrder->autoFill($aSortOrderOptions); + $oSelectSortOrder->setDefault($_REQUEST["sortorder"]); + + $oSelectSearchIn = new cHTMLSelectElement("searchin"); + $oSelectSearchIn->autoFill(array('' => i18n("-- All --"), + 'name' => i18n("Modulname"), + 'description' => i18n("Description"), + 'type' => i18n("Type"), + 'input' => i18n("Input"), + 'output' => i18n("Output"))); + + if(isset($_REQUEST["searchin"])) $oSelectSearchIn->setDefault($_REQUEST["searchin"]); + + // build list with filter types + $sql = "SELECT + type + FROM + ".$cfg["tab"]["mod"]." + WHERE + idclient = '".Contenido_Security::toInteger($client)."' + GROUP BY type"; + + $db->query($sql); + $aFilterType = array(); + $aFilterType["--all--"] = i18n("-- All --"); + $aFilterType["--wotype--"] = i18n("-- Without type --"); + + while ($db->next_record()) + { + if (trim($db->f("type")) != "") + { + $aFilterType[$db->f("type")] = $db->f("type"); + } + } + + $oSelectTypeFilter = new cHTMLSelectElement("filtertype"); + $oSelectTypeFilter->autoFill($aFilterType); + if(isset($_REQUEST["filtertype"])) $oSelectTypeFilter->setDefault($_REQUEST["filtertype"]); + $_REQUEST["filter"] = (isset($_REQUEST["filter"]))?$_REQUEST["filter"]:''; + $oTextboxFilter = new cHTMLTextbox("filter", stripslashes($_REQUEST["filter"]), 15); + $content = '
    '; + // Ye stuff will be done in javascript on apply button + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + //$content .= ''; + if(isset($_REQUEST["page"])) $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= '
    '.i18n("Items / page").''.$oSelectItemsPerPage->render().'
    '.i18n("Sort by").''.$oSelectSortBy->render().'
    '.i18n("Sort order").''.$oSelectSortOrder->render().'
    '.i18n("Type filter").''.$oSelectTypeFilter->render().'
    '.i18n("Search for").''.$oTextboxFilter->render().'
    '.i18n("Search in").''.$oSelectSearchIn->render().'
     
    '; + $content .= ''; + $content .= '
    '; + $oListOptionRow->setContentData($content); + + ####### + # Pager + ####### + $oPagerLink = new cHTMLLink; + $pagerl="pagerlink"; + $oPagerLink->setTargetFrame('left_bottom'); + $oPagerLink->setLink("main.php"); + $oPagerLink->setCustom("elemperpage", $_REQUEST["elemperpage"]); + $oPagerLink->setCustom("filter", stripslashes($_REQUEST["filter"])); + $oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); + $oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); + $oPagerLink->setCustom("frame", 2); + $oPagerLink->setCustom("area", $area); + $oPagerLink->enableAutomaticParameterAppend(); + $oPagerLink->setCustom("contenido", $sess->id); + $oPager = new cObjectPager("02420d6b-a77e-4a97-9395-7f6be480f497", $iItemCount, $_REQUEST["elemperpage"], $_REQUEST["page"], $oPagerLink, "page", $pagerl); + + $tpl->set('s', 'PAGINGLINK', $pagerl); + + + $tpl->set('s', 'ACTION', $str.''.$oListOptionRow->render().$oPager ->render().'
    '); +} else { + $tpl->set('s', 'PAGINGLINK', ''); + $tpl->set('s', 'ACTION', $str); + $tpl->set('s', 'LISTOPLINK', ''); +} + +############################ +# generate template +############################ +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['mod_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.mod_overview.php b/conlite/includes/include.mod_overview.php new file mode 100644 index 0000000..c2ebdba --- /dev/null +++ b/conlite/includes/include.mod_overview.php @@ -0,0 +1,338 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-21 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-08-18, Munkh-Ulzii Balidar, add a functionality to show the used info + * + * $Id: include.mod_overview.php 359 2015-10-01 10:55:49Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if (!(int) $client > 0) { + #if there is no client selected, display empty page + $oPage = new cPage; + $oPage->render(); + return; +} + +############################ +# Now build bottom with list +############################ +$cApiModuleCollection = new cApiModuleCollection; +$classmodule = new cApiModule; +$oPage = new cPage; + +// no value found in request for items per page -> get form db or set default +$oUser = new cApiUser($auth->auth["uid"]); +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST['elemperpage']) || $_REQUEST['elemperpage'] < 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); +} +if (!is_numeric($_REQUEST["elemperpage"])) { + $_REQUEST["elemperpage"] = 0; +} +if ($_REQUEST["elemperpage"] > 0) { + // -- All -- will not be stored, as it may be impossible to change this back to something more useful + $oUser->setProperty("itemsperpage", $area, $_REQUEST["elemperpage"]); +} +unset($oUser); + +if (!isset($_REQUEST["page"]) || !is_numeric($_REQUEST['page']) || $_REQUEST['page'] <= 0 || $_REQUEST["elemperpage"] == 0) { + $_REQUEST["page"] = 1; +} + +// Sort by requested +if (isset($_REQUEST["sortby"]) && $_REQUEST["sortby"] != "") { + $cApiModuleCollection->setOrder($_REQUEST["sortby"] . " " . $_REQUEST["sortorder"]); +} else { + $cApiModuleCollection->setOrder("name asc"); +} + + +// Search filter requested +if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "" && $_REQUEST["searchin"] == '') { + $cApiModuleCollection->setWhereGroup("default", "name", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setWhereGroup("default", "description", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setWhereGroup("default", "type", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setWhereGroup("default", "input", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setWhereGroup("default", "output", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setInnerGroupCondition("default", "OR"); +} else if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "" && $_REQUEST["searchin"] == 'name') { + $cApiModuleCollection->setWhereGroup("default", "name", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setInnerGroupCondition("default", "OR"); +} else if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "" && $_REQUEST["searchin"] == 'description') { + $cApiModuleCollection->setWhereGroup("default", "description", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setInnerGroupCondition("default", "OR"); +} else if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "" && $_REQUEST["searchin"] == 'type') { + $cApiModuleCollection->setWhereGroup("default", "type", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setInnerGroupCondition("default", "OR"); +} else if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "" && $_REQUEST["searchin"] == 'input') { + $cApiModuleCollection->setWhereGroup("default", "input", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setInnerGroupCondition("default", "OR"); +} else if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "" && $_REQUEST["searchin"] == 'output') { + $cApiModuleCollection->setWhereGroup("default", "output", "%" . $_REQUEST["filter"] . "%", "LIKE"); + $cApiModuleCollection->setInnerGroupCondition("default", "OR"); +} + +// Type filter requested +if (isset($_REQUEST["filtertype"])) { + switch ($_REQUEST["filtertype"]) { + case "--all--": + break; + case "--wotype--": + $cApiModuleCollection->setWhere("type", ""); + break; + default: + $cApiModuleCollection->setWhere("type", $_REQUEST["filtertype"]); + break; + } +} + +// Items per page requested +$cApiModuleCollection->setWhere("idclient", $client); + + +if ($_REQUEST["elemperpage"] > 0) { + $cApiModuleCollection->query(); + $iItemCount = $cApiModuleCollection->count(); + + if ($iItemCount < (($_REQUEST["page"] - 1) * $_REQUEST["elemperpage"])) { + $_REQUEST["page"] = 1; + } + + if ($_REQUEST["elemperpage"] * ($_REQUEST["page"]) >= $iItemCount + $_REQUEST["elemperpage"] && $_REQUEST["page"] != 1) { + $_REQUEST["page"] --; + } + + $cApiModuleCollection->setLimit(($_REQUEST["elemperpage"] * ($_REQUEST["page"] - 1)), $_REQUEST["elemperpage"]); +} else { + $iItemCount = 0; +} + + +// Build list for left_bottom considering filter values +$mlist = new UI_Menu; +$sOptionModuleCheck = getSystemProperty("system", "modulecheck"); +$sOptionForceCheck = getEffectiveSetting("modules", "force-menu-check", "false"); +$iMenu = 0; + +$cApiModuleCollection->query(); +while ($cApiModule = $cApiModuleCollection->next()) { + if ($perm->have_perm_item($area, $db->f("idmod")) || $perm->have_perm_area_action("mod_translate", "mod_translation_save") || $perm->have_perm_area_action_item("mod_translate", "mod_translation_save", $cApiModule->get("idmod"))) { + $idmod = $cApiModule->get("idmod"); + + $link = new cHTMLLink; + $link->setMultiLink("mod", "", "mod_edit", ""); + $link->setCustom("idmod", $cApiModule->get("idmod")); + $link->updateAttributes(array("alt" => $cApiModule->get("description"))); + $link->updateAttributes(array("title" => $cApiModule->get("description"))); + $link->updateAttributes(array("style" => "margin-left:5px")); + + $sName = $cApiModule->get("name"); + + if ($sOptionModuleCheck !== "false" && $sOptionForceCheck !== "false") { + // Check module and force check has been enabled - check module (surprisingly...) + $inputok = modTestModule($cApiModule->get("input"), $cApiModule->get("idmod") . "i", false); + $outputok = modTestModule($cApiModule->get("output"), $cApiModule->get("idmod") . "o", true); + + if ($inputok && $outputok) { // Everything ok + $colName = $sName; // The set default color: none :) + } else if ($inputok || $outputok) { // Input or output has a problem + $colName = '' . $sName . ''; + } else { // Input >and< output has a problem + $colName = '' . $sName . ''; + } + } else { + // Do not check modules (or don't force it) - so, let's take a look into the database + $sModuleError = $cApiModule->get("error"); + + if ($sModuleError == "none") { + $colName = $sName; + } else if ($sModuleError == "input" || $sModuleError == "output") { + $colName = '' . $sName . ''; + } else { + $colName = '' . $sName . ''; + } + } + + $iMenu ++; + + $mlist->setTitle($iMenu, $colName); + if ($perm->have_perm_area_action_item("mod_edit", "mod_edit", $db->f("idmod")) || $perm->have_perm_area_action_item("mod_translate", "mod_translation_save", $cApiModule->get("idmod"))) { + $mlist->setLink($iMenu, $link); + } + + $inUse = $classmodule->moduleInUse($idmod); + $bFromFile = $cApiModule->isLoadedFromFile(); + + $deletebutton = ""; + + if ($inUse) { + $inUseString = i18n("Click for more information about usage"); + $mlist->setActions($iMenu, 'inuse', '' . $inUseString . ''); + $delDescription = i18n("Module in use, cannot delete"); + } else if($bFromFile) { + $delDescription = i18n("Module in filesystem, cannot delete"); + } else { + $mlist->setActions($iMenu, 'inuse', ''); + if ($perm->have_perm_area_action_item("mod", "mod_delete", $cApiModule->get("idmod"))) { + $delTitle = i18n("Delete module"); + $delDescr = sprintf(i18n("Do you really want to delete the following module:

    %s
    "), $sName); + + $deletebutton = '' . $delTitle . ''; + } else { + $delDescription = i18n("No permission"); + } + } + + if ($deletebutton == "") { + //$deletebutton = ''; + $deletebutton = '' . $delDescription . ''; + } + + $todo = new TODOLink("idmod", $db->f("idmod"), "Module: $sName", ""); + + $mlist->setActions($iMenu, "todo", $todo->render()); + $mlist->setActions($iMenu, "delete", $deletebutton); + + if (isset($_GET['idmod']) && $_GET['idmod'] == $idmod) { + $mlist->setExtra($iMenu, 'id="marked" '); + } + //$mlist->setImage($iMenu, "images/but_module.gif"); + //$mlist->setImage($iMenu, 'images/spacer.gif', 5); + } +} + +$deleteScript = ' '; + +$sShowUsedInfo = ' + + '; + +$sMarkRow = ''; + +$oPage->setMargin(0); +$oPage->addScript('messagebox', ''); +$oPage->addScript('jquery', ''); +$oPage->addScript('delete', $deleteScript); +$oPage->addScript('showUsedInfo', $sShowUsedInfo); +$oPage->addScript('cfoldingrow.js', ''); +$oPage->addScript('parameterCollector.js', ''); +$oPage->setContent($mlist->render(false) . $sMarkRow); + +//generate current content for Object Pager +$oPagerLink = new cHTMLLink; +$pagerl = "pagerlink"; +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setLink("main.php"); +$oPagerLink->setCustom("elemperpage", $_REQUEST["elemperpage"]); +if (isset($_REQUEST["filter"])) + $oPagerLink->setCustom("filter", stripslashes($_REQUEST["filter"])); +if (isset($_REQUEST["sortby"])) + $oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +if (isset($_REQUEST["sortorder"])) + $oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("frame", $frame); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); +$oPager = new cObjectPager("02420d6b-a77e-4a97-9395-7f6be480f497", $iItemCount, $_REQUEST["elemperpage"], $_REQUEST["page"], $oPagerLink, "page", $pagerl); + +//add slashes, to insert in javascript +$sPagerContent = $oPager->render(1); +$sPagerContent = str_replace('\\', '\\\\', $sPagerContent); +$sPagerContent = str_replace('\'', '\\\'', $sPagerContent); + +//send new object pager to left_top +$sRefreshPager = ' + '; + +$oPage->addScript('refreshpager', $sRefreshPager); + +$oPage->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.mod_package.php b/conlite/includes/include.mod_package.php new file mode 100644 index 0000000..7fd7e51 --- /dev/null +++ b/conlite/includes/include.mod_package.php @@ -0,0 +1,492 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-06-27, OliverL fix import module translation bug, checkin timo.trautmann (http://forum.contenido.org/viewtopic.php?t=19064) + * modified 2010-11-22, Dominik Ziegler, fixed check of directory existance [CON-354] + * + * $Id: include.mod_package.php 417 2016-01-20 11:08:39Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.upl.php"); + +$sNoti = ""; +$idmod = (int)$idmod; + +function getFiles ($sPath, $sFileType, &$sNoti) +{ + global $notification, $client; + + $bError = false; + $aFiles = array(); + switch ($sPath) + { + case "layouts": + $oLayouts = new cApiLayoutCollection; + $oLayouts->setWhere("idclient", $client); + $oLayouts->setOrder("name"); + $oLayouts->query(); + + if ($oLayouts->count() > 0) + { + while ($oLayout = $oLayouts->next()) + { + $aFiles[$oLayout->get($oLayout->primaryKey)] = $oLayout->get("name"); + } + } + + break; + case "languages": + $oClientLangs = new cApiClientLanguageCollection; + $oClientLangs->setWhere("idclient", $client); + $oClientLangs->query(); + + $aLangs = array(); + while ($oClientLang = $oClientLangs->next()) + { + $aLangs[] = $oClientLang->get("idlang"); + } + + $oLangs = new cApiLanguageCollection; + $oLangs->setOrder("name"); + $oLangs->query(); + + if ($oLangs->count() > 0) + { + while ($oLang = $oLangs->next()) + { + $iID = $oLang->get($oLang->primaryKey); + + if (in_array($iID, $aLangs)) + { + $aFiles[] = array($iID, strtolower($oLang->get("name")).' ('.$iID.')' ); // Edit: 2008-06-27 By: OliverL + } + } + } + + break; + default: + // Real file + if (is_dir($sPath)) + { + $iHandle = opendir($sPath); + $aFiles = array(); + + while ($sFile = readdir($iHandle)) + { + if ($sFile != "." && $sFile != ".." && substr($sFile, (strlen($sFile) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType") + { + if (is_readable($sPath.$sFile)) + { + $aFiles[$sFile] = $sFile; + } else { + $bError = true; + $sNoti .= $notification->returnNotification("error", $sFile." ".i18n("is not readable!")) . "
    0) + { + asort($aFiles); + } + } else { + $bError = true; + $sNoti .= $notification->returnNotification("error", i18n("Directory is not existing or readable!")."
    $sPath") . "
    add($sCaption, i18n("No elements available")); + } else { + $oSelFiles = new cHTMLSelectElement($sField."[]"); // []: Make sure, we are getting an array... + $oSelFiles->setSize(15); + $oSelFiles->setStyle("width: 100%;"); + $oSelFiles->setMultiselect(); + + if (count($aSelected) == 0) + { + $oCkbNone = new cHTMLCheckbox($sField . "None", "none", "", true); + $oSelFiles->setDisabled("disabled"); + } else { + $oCkbNone = new cHTMLCheckbox($sField . "None", "none"); + $oSelFiles->setDisabled($sDisabled); + } + $oCkbNone->setDisabled($sDisabled); + $oCkbNone->setEvent("click", "if (this.checked) { document.frmPackage.elements['" . $sField . "[]'].disabled = true; } else { document.frmPackage.elements['" . $sField . "[]'].disabled = false; }"); + + $iCounter = 1; + foreach ($aFiles as $sID => $sFile) + { + if (is_array($sFile)) // Edit: 2008-06-27 By: OliverL + { + if (in_array($sFile[0], $aSelected)) + { + $oOption = new cHTMLOptionElement(clHtmlSpecialChars($sFile[1]), $sFile[0], true); + } else { + $oOption = new cHTMLOptionElement(clHtmlSpecialChars($sFile[1]), $sFile[0]); + } + } else { + if (in_array($sID, $aSelected)) + { + $oOption = new cHTMLOptionElement(clHtmlSpecialChars($sFile), $sID, true); + } else { + $oOption = new cHTMLOptionElement(clHtmlSpecialChars($sFile), $sID); + } + } // End-Edit + $oSelFiles->addOptionElement($iCounter, $oOption); + $iCounter++; + } + + $oForm->add($sCaption, $oCkbNone->toHTML(false) . " " . i18n("None") . "
    " . $oSelFiles->render()); + } +} + +if ($idmod > 0 && $perm->have_perm_area_action_item("mod_edit", "mod_edit", $idmod)) +{ + // Specify available detail areas. Note, that everything is treated as "file", including layouts and + // translation languages. + $aFileTypes = array("jsfiles" => array("suffix" => "js", "path" => $cfgClient[$client]["js"]["path"], "caption" => i18n("Javascript files"), "field" => "selJSFiles"), + "tplfiles" => array("suffix" => "html", "path" => $cfgClient[$client]["tpl"]["path"], "caption" => i18n("Module template files"), "field" => "selTplFiles"), + "cssfiles" => array("suffix" => "css", "path" => $cfgClient[$client]["css"]["path"], "caption" => i18n("Style files"), "field" => "selCSSFiles"), + "layouts" => array("suffix" => "", "path" => "layouts", "caption" => i18n("Layouts"), "field" => "selLayouts"), + "translations" => array("suffix" => "", "path" => "languages", "caption" => i18n("Translations"), "field" => "selLanguages")); + + $oModule = new cApiModule; + $oModule->loadByPrimaryKey($idmod); + + if ($action == "mod_importexport_package") + { + $sTmpPackageFile = $cfg['path']['conlite_temp'] . "package_" . md5($auth->auth["uid"]) . ".xml"; + + switch ($mode) + { + case "export": + $sFileName = uplCreateFriendlyName($oModule->get("name") . "_package"); + + if ($sFileName != "") + { + $oModule->exportPackage($sFileName . ".xml"); + } + break; + case "import1": + if ($_FILES["upload"]["tmp_name"] != "") // file_exists() doesn't work with safe_mode/basedir + { + move_uploaded_file($_FILES["upload"]["tmp_name"], $sTmpPackageFile); + + $oPage = new cPage; + if (!$aResult = $oModule->getPackageOverview($sTmpPackageFile)) + { + $sNoti .= sprintf(i18n("Error while importing XML file: %s"), $oModule->_error). "
    "; + + $oPage->setContent($sNoti); + $oPage->render(); + } else { + $oForm = new UI_Table_Form("frmImportExport"); + $oForm->setVar("area", "mod_package"); + $oForm->setVar("frame", $frame); + $oForm->setVar("idmod", $idmod); + $oForm->setVar("action", ""); + $oForm->setVar("mode", "import2"); + $oForm->setVar("use_encoding", "false"); + + $oForm->addHeader("Import/Export"); + $oForm->setWidth("100%"); + + $oForm->add(i18n("Name"), $aResult["name"]); + + $sMsg = array(); + $sMsg["Action"] = "%s " . i18n("Skip") . " %s " . i18n("Append") . " %s " . i18n("Overwrite"); + $sMsg["OK"] = i18n("OK"); + $sMsg["Assign"] = i18n("Assign"); + $sMsg["Conflict"] = i18n("Conflict"); + $sMsg["Ignored"] = i18n("Ignored"); + $sMsg["- Select -"] = i18n("- Select -"); + + // Files + foreach ($aFileTypes as $sFileType => $aFileType) + { + $oLstFiles = new UI_List; + $oLstFiles->setWidth("100%"); + $oLstFiles->setBorder(1); + + $oLstFiles->setCell(0, 1, "" . i18n("Status") . ""); + $oLstFiles->setCell(0, 2, "" . i18n("Name") . ""); + $oLstFiles->setCell(0, 3, "" . i18n("Action") . ""); + $oLstFiles->setCellAlignment(0, 3, "right"); + + $aDataFiles = getFiles($aFileType["path"], $aFileType["suffix"], $sNoti); + + $iCounter = 1; + if (is_array($aResult[$sFileType])) + { + foreach ($aResult[$sFileType] as $sFile) + { + $oLstFiles->setCell($iCounter, 1, clHtmlSpecialChars($sFile)); + + switch ($aFileType["path"]) + { + case "languages": + // Languages have to be assigned, they won't be added or something + if (is_array($aDataFiles)) + { + $oSelLang = new cHTMLSelectElement("selAssignTrans[".clHtmlSpecialChars($sFile)."]"); + // $oSelLang->autoFill(array_merge(array(0 => $sMsg["- Select -"]), $aDataFiles)); // Old Version + $oSelLang->autoFill(array_merge(array(array(0 , $sMsg["- Select -"])), $aDataFiles)); // Edit: 2008-06-27 By: OliverL + + // Try to assign existing language + if (in_array($sFile, $aDataFiles)) + { + $oSelLang->setDefault(array_search(strtolower($sFile), $aDataFiles)); + } + + $oLstFiles->setCell($iCounter, 2, $sMsg["Assign"]); + $oLstFiles->setCell($iCounter, 3, $oSelLang->render()); + } else { + $oLstFiles->setCell($iCounter, 2, $sMsg["Ignored"]); + $oLstFiles->setCell($iCounter, 3, "-"); + } + break; + default: + if (is_array($aDataFiles) && in_array($sFile, $aDataFiles)) + { + $oRadSkip = new cHTMLRadiobutton("radItem[".$sFileType."][".clHtmlSpecialChars($sFile)."]", "skip", "", true); + $oRadAppend = new cHTMLRadiobutton("radItem[".$sFileType."][".clHtmlSpecialChars($sFile)."]", "append"); + $oRadOverwrite = new cHTMLRadiobutton("radItem[".$sFileType."][".clHtmlSpecialChars($sFile)."]", "overwrite"); + + $oLstFiles->setCell($iCounter, 2, $sMsg["Conflict"]); + $oLstFiles->setCell($iCounter, 3, sprintf($sMsg["Action"], $oRadSkip->toHTML(false), $oRadAppend->toHTML(false), $oRadOverwrite->toHTML(false))); + } else { + $oLstFiles->setCell($iCounter, 2, $sMsg["OK"]); + $oLstFiles->setCell($iCounter, 3, "-"); + } + } + + $oLstFiles->setCellAlignment($iCounter, 3, "right"); + $iCounter++; + } + + $oForm->add($aFileType["caption"], $oLstFiles->render()); + } + + $oForm->setActionButton("cancel", $cfg['path']['contenido_fullhtml']."images/but_cancel.gif", i18n("Cancel"), "c"); + $oForm->setActionButton("submit", $cfg['path']['contenido_fullhtml']."images/but_ok.gif", i18n("Import"), "s", "mod_importexport_package"); + } + $oPage->setContent($sNoti.$oForm->render()); + $oPage->render(); + } + } + break; + case "import2": + if (file_exists($sTmpPackageFile)) + { + $aOptions = array(); + + if (is_array($_REQUEST["radItem"])) + { + $aOptions["items"] = $_REQUEST["radItem"]; + } else { + $aOptions["items"] = array(); + } + + if (is_array($_REQUEST["selAssignTrans"])) + { + foreach ($_REQUEST["selAssignTrans"] as $sPackageLang => $iAssignLang) + { + if ($iAssignLang > 0) + { + $aOptions["translations"][$sPackageLang] = $iAssignLang; + } + } + } else { + $aOptions["translations"] = array(); + } + + $oPage = new cPage; + + $oForm = new UI_Table_Form("frmImportExport"); + // See below for area + $oForm->setVar("frame", $frame); + $oForm->setVar("idmod", $idmod); + $oForm->setVar("action", ""); + + $oForm->addHeader("Import/Export"); + $oForm->setWidth("100%"); + + if (!$oModule->importPackage($sTmpPackageFile, $aOptions)) + { + $sNoti .= sprintf(i18n("Error while importing XML file: %s"), $oModule->_error). "
    "; + + $oForm->setVar("area", "mod_package"); + + $oForm->add(i18n("Status"), i18n("Import was not succesful, please check data and try again")); + $oForm->setActionButton("submit", $cfg['path']['contenido_fullhtml']."images/but_ok.gif", i18n("Retry"), "s"); + } else { + $oForm->setVar("area", "mod_edit"); + + $oForm->add(i18n("Status"), i18n("Import succesfully finished")); + $oForm->setActionButton("submit", $cfg['path']['contenido_fullhtml']."images/but_ok.gif", i18n("Finish"), "s"); + } + + unlink($sTmpPackageFile); + + $oPage->setContent($sNoti.$oForm->render()); + $oPage->setReload(); + $oPage->render(); + } + break; + } + } else { + if ($action == "mod_edit") + { + $oModule->set("package_guid", stripslashes($_REQUEST["txtGUID"])); + + $aData = array(); + foreach ($aFileTypes as $sFileType => $aFileType) + { + if (!isset($_REQUEST[$aFileType["field"]]) || isset($_REQUEST[$aFileType["field"] . "None"])) { + $aData[$sFileType] = array(); + } else { + $aData[$sFileType] = $_REQUEST[$aFileType["field"]]; + } + } + + $oModule->set("package_data", serialize($aData)); + $oModule->store(true); // Store changes - without history or updating mod code in articles + } + + $oInUse = new InUseCollection; + list($bInUse, $sMessage) = $oInUse->checkAndMark("idmod", $idmod, true, i18n("Module is in use by %s (%s)"), true, "main.php?area=$area&frame=$frame&idmod=$idmod"); + unset ($oInUse); + + if ($bInUse == true) + { + $sMessage .= "
    "; + $sDisabled = 'disabled="disabled"'; + } else { + $sDisabled = ""; + } + + $oPage = new cPage; + $oForm = new UI_Table_Form("frmPackage"); + $oForm->setVar("area", "mod_package"); + $oForm->setVar("frame", $frame); + $oForm->setVar("idmod", $idmod); + + if (!$bInUse) + { + $oForm->setVar("action", "mod_edit"); + } + $oForm->setWidth("100%"); + + $oForm->addHeader(i18n("Edit package")); + $oForm->add(i18n("Name"), $oModule->get("name")); + + // Get serialized data; ensure, that detail fields are arrays + $aData = unserialize($oModule->get("package_data")); + if (!is_array($aData)) + { + $aData = array(); + } + foreach ($aFileTypes as $sFileType => $aFileType) + { + if (!is_array($aData[$sFileType])) + { + $aData[$sFileType] = array(); + } + } + + // Module package GUID + $oTxtGUID = new cHTMLTextbox("txtGUID", $oModule->get("package_guid"), 64); + $oTxtGUID->setDisabled($sDisabled); + + $oForm->add(i18n("Package GUID"), $oTxtGUID->render()); + + // Files + foreach ($aFileTypes as $sFileType => $aFileType) + { + $aFiles = getFiles($aFileType["path"], $aFileType["suffix"], $sNoti); + displayFiles($aFiles, $aData[$sFileType], $oForm, $aFileType["caption"], $aFileType["field"], $sDisabled); + } + + $oRadImport = new cHTMLRadiobutton("mode", "import1"); + $oRadExport = new cHTMLRadiobutton("mode", "export"); + + $oRadImport->setLabelText(i18n("Import from file")); + $oRadExport->setLabelText(i18n("Export to file")); + + $oRadImport->setEvent("click", "document.getElementById('vupload').style.display = '';"); + $oRadExport->setEvent("click", "document.getElementById('vupload').style.display = 'none';"); + + $oUpl = new cHTMLUpload("upload"); + + if ($oModule->get("input") != "" && $oModule->get("output") != "") + { + $oRadExport->setChecked("checked"); + } else { + $oRadImport->setChecked("checked"); + } + $oForm2 = new UI_Table_Form("frmImportExport"); + $oForm2->setVar("action", "mod_importexport_package"); + $oForm2->setVar("use_encoding", "false"); + $oForm2->addHeader("Import/Export"); + $oForm2->add(i18n("Mode"), array($oRadExport, "
    ", $oRadImport)); + + if ($oModule->get("input") != "" && $oModule->get("output") != "") + { + $oForm2->add(i18n("File"), $oUpl, "vupload", "display: none;"); + } else { + $oForm2->add(i18n("File"), $oUpl, "vupload"); + } + $oForm2->setVar("area", $area); + $oForm2->setVar("frame", $frame); + $oForm2->setVar("idmod", $idmod); + $oForm2->custom["submit"]["accesskey"] = ''; + + $oPage->setContent($sNoti.$sMessage.$oForm->render()."
    ".$oForm2->render()); + + //$oPage->setSubnav("idmod=$idmod", "mod"); + $oPage->render(); + } +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.mod_sync.php b/conlite/includes/include.mod_sync.php new file mode 100644 index 0000000..7f620b4 --- /dev/null +++ b/conlite/includes/include.mod_sync.php @@ -0,0 +1,69 @@ + + * @copyright (c) 2012-2015, conlite.org + * + * $Id: include.mod_sync.php 330 2015-06-22 11:59:04Z oldperl $ + */ + +/* @var $sess Contenido_Session */ +/* @var $perm Contenido_Perm */ +/* @var $auth Contenido_Challenge_Crypt_Auth */ +/* @var $notification Contenido_Notification */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$oPage = new cPage(); +$oPage->setHtml5(); + +if ((int) $client > 0) { + $aContent = array(); + ####### + # Sync Module + ####### + $oModuleCollection = new cApiModuleCollection; + $oModuleCollection->setWhere("idclient", $client); + + $oModuleCollection->query(); + $iItemCount = $oModuleCollection->count(); + + // sync all modules if wanted + if(isset($_GET['syncmod']) && (int) $_GET['syncmod'] == 1) { + $iSyncMods = 0; + $aContent[] = "

    ".i18n("Syncing Modules!")."

    "; + $oTextDiv = new cHTMLDiv(); + /* @var $oModule cApiModule */ + while ($oModule = $oModuleCollection->next()) { + if(!$oModule->isLoadedFromFile('output') && !$oModule->isLoadedFromFile('input')) { + $oTextDiv->setContent(i18n("Module ").$oModule->get("name").": ".i18n("nothing to do")); + $aContent[] = $oTextDiv->render(); + continue; + } + if($oModule->isLoadedFromFile('output')) { + $oModule->set("output", addslashes(stripslashes($oModule->get('output')))); + } + if($oModule->isLoadedFromFile('input')) { + $oModule->set("input", addslashes(stripslashes($oModule->get('input')))); + } + $oModule->set("lastmodified", date("Y-m-d H:i:s")); + $oModule->store(); + $oTextDiv->setContent(i18n("Module ").$oModule->get("name").": ".i18n("synchronized")); + $aContent[] = $oTextDiv->render(); + unset($oModule); + } + } else { + $aContent[] = $notification->returnNotification(Contenido_Notification::LEVEL_WARNING, i18n("No modules to sync!")); + } + unset($oModuleCollection); + $oPage->setContent($aContent); +} else { + $oPage->setContent($notification->returnNotification(Contenido_Notification::LEVEL_WARNING, i18n("Nothing to do!"))); +} +$oPage->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.mod_translate.php b/conlite/includes/include.mod_translate.php new file mode 100644 index 0000000..fc7fa5a --- /dev/null +++ b/conlite/includes/include.mod_translate.php @@ -0,0 +1,203 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-09-22, Murat Purc, Fixed setting of wrong initial translation id [#CON-347] + * + * $Id: include.mod_translate.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$langobj = new cApiLanguage($lang); + +$langstring = $langobj->get("name") . ' ('.$lang.')'; + +$moduletranslations = new cApiModuleTranslationCollection; +$module = new cApiModule($idmod); + +if ($action == "mod_translation_save") +{ + $strans = new cApiModuleTranslation; + $strans->loadByPrimaryKey($idmodtranslation); + + if ($strans->get("idmod") == $idmod) + { + $module->setTranslatedName($translatedname); + + $strans->set("translation", stripslashes($t_trans)); + $strans->store(); + + /* Increase idmodtranslation */ + $moduletranslations->select("idmod = '$idmod' AND idlang = '$lang'"); + + while ($mitem = $moduletranslations->next()) + { + if ($mitem->get("idmodtranslation") == $idmodtranslation) + { + $mitem2 = $moduletranslations->next(); + + if (is_object($mitem2)) + { + $idmodtranslation = $mitem2->get("idmodtranslation"); + break; + } + } + } + } +} + +if ($action == "mod_importexport_translation") +{ + if ($mode == "export") + { + $sFileName = uplCreateFriendlyName(strtolower($module->get("name") . "_" . $langobj->get("name"))); + + if ($sFileName != "") + { + $moduletranslations->export($idmod, $lang, $sFileName . ".xml"); + } + } + if ($mode == "import") + { + if (file_exists($_FILES["upload"]["tmp_name"])) + { + $moduletranslations->import($idmod, $lang, $_FILES["upload"]["tmp_name"]); + } + } +} + + +if (!isset($idmodtranslation)) +{ + $idmodtranslation = 0; +} + +$mtrans = new cApiModuleTranslation; +$mtrans->loadByPrimaryKey($idmodtranslation); + +if ($mtrans->get("idmod") != $idmod) +{ + $moduletranslations->select("idmod = '$idmod' AND idlang = '$lang'", '', 'idmodtranslation DESC', '1'); + $mtrans = $moduletranslations->next(); + + if (is_object($mtrans)) + { + $idmodtranslation = $mtrans->get("idmodtranslation"); + } else { + $mtrans = new cApiModuleTranslation; + } +} + +$strings = $module->parseModuleForStrings(); + +/* Insert new strings */ +foreach ($strings as $string) +{ + $moduletranslations->create($idmod, $lang, $string); +} + +$moduletranslations->select("idmod = '$idmod' AND idlang = '$lang'"); + +while ($d_modtrans = $moduletranslations->next()) +{ + if (!in_array($d_modtrans->get("original"), $strings)) + { + $moduletranslations->delete($d_modtrans->get("idmodtranslation")); + } +} + +$page = new cPage; + +$form = new UI_Table_Form("translation"); +$form->addHeader(sprintf(i18n("Translate module '%s'"), $module->get("name"))); +$form->setVar("area", $area); +$form->setVar("frame", $frame); +$form->setVar("idmod", $idmod); +$form->setVar("idmodtranslation", $idmodtranslation); +$form->setVar("action", "mod_translation_save"); + +$transmodname = new cHTMLTextbox("translatedname", $module->getTranslatedName(),60); + +$form->add(i18n("Translated Name"), $transmodname); + +$ilink = new cHTMLLink; +$ilink->setCLink("mod_translate", 5, ""); +$ilink->setCustom("idmod", $idmod); +$ilink->setCustom("idmodtranslation", $mtrans->get("idmodtranslation")); +$ilink->setAnchor($mtrans->get("idmodtranslation")); + +$iframe = ''; + +$table = ''; + +$original = new cHTMLTextarea("t_orig",clHtmlSpecialChars($mtrans->get("original"))); +$original->setStyle("width: 300px;"); +$translated = new cHTMLTextarea("t_trans",clHtmlSpecialChars($mtrans->get("translation"))); +$translated->setStyle("width: 300px;"); + +$table .= '
    '.i18n("Original module string").''.sprintf(i18n("Translation for %s"), $langstring).' 
    '.$iframe.'
    '.$original->render().''.$translated->render().' 
    '; +$table .= i18n("Hint: Hit ALT+SHIFT+S to save the translated entry and advance to the next string."); +$form->add(i18n("String list"), $table); + +$mark = ''; + + +$import = new cHTMLRadiobutton("mode", "import"); +$export = new cHTMLRadiobutton("mode", "export"); +$export->setLabelText(i18n("Export to file")); +$import->setLabelText(i18n("Import from file")); + +$import->setEvent("click", "document.getElementById('vupload').style.display = '';"); +$export->setEvent("click", "document.getElementById('vupload').style.display = 'none';"); +$upload = new cHTMLUpload("upload"); + +$import->setChecked("checked"); +$form2 = new UI_Table_Form("export"); +$form2->setVar("action", "mod_importexport_translation"); +$form2->addHeader("Import/Export"); +$form2->add(i18n("Mode"), array($export, "
    ", $import)); +$form2->add(i18n("File"), $upload, "vupload"); +$form2->setVar("area", $area); +$form2->setVar("frame", $frame); +$form2->setVar("idmod", $idmod); +$form2->setVar("idmodtranslation", $idmodtranslation); +$form2->custom["submit"]["accesskey"] = ''; + +$page->setContent($form->render(). $mark ."
    ". $form2->render()); +$page->setMarkScript(2); + +$clang = new cApiLanguage($lang); + +$page->setEncoding($clang->get("encoding")); + +if (!($action == "mod_importexport_translation" && $mode == "export")) +{ + $page->render(); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.mod_translate_stringlist.php b/conlite/includes/include.mod_translate_stringlist.php new file mode 100644 index 0000000..e386398 --- /dev/null +++ b/conlite/includes/include.mod_translate_stringlist.php @@ -0,0 +1,86 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.mod_translate_stringlist.php 123 2012-08-30 11:11:09Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$translations = new cApiModuleTranslationCollection; +$translations->select("idmod = '$idmod' AND idlang='$lang'"); + +$page = new cPage; +$page->setMargin(0); + +$v = ''; + +$link = new cHTMLLink; +$link->setCLink("mod_translate", 4, ""); + +$mylink = new cHTMLLink; + +while ($translation = $translations->next()) +{ + $string = $translation->get("original"); + $tstring = $translation->get("translation"); + + $link->setCustom("idmod", $idmod); + $link->setCustom("idmodtranslation", $translation->get("idmodtranslation")); + $href = $link->getHREF(); + + $mylink->setLink('javascript:parent.location="'.$href.'"'); + $mylink->setContent($string); + + $dark = !$dark; + + if ($dark) + { + $bgcol = $cfg["color"]["table_dark"]; + } else { + $bgcol = $cfg["color"]["table_light"]; + } + + if ($idmodtranslation == $translation->get("idmodtranslation")) + { + $bgcol = $cfg["color"]["table_active"]; + } + $v .= ''; +} + +$v .= '
    '.$mylink->render().''.$tstring.'
    '; + +$page->setContent($v); + +$clang = new cApiLanguage($lang); +$page->setEncoding($clang->get("encoding")); + +$page->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.mycontenido.tasks.edit.php b/conlite/includes/include.mycontenido.tasks.edit.php new file mode 100644 index 0000000..04ec4c6 --- /dev/null +++ b/conlite/includes/include.mycontenido.tasks.edit.php @@ -0,0 +1,150 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * + * $Id: include.mycontenido.tasks.edit.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$cpage = new cPage; + +$todoitem = new TODOItem; +$todoitem->loadByPrimaryKey($idcommunication); + +$ui = new UI_Table_Form("reminder"); +$ui->addHeader(i18n("Edit Reminder item")); + +$ui->addCancel($sess->url("main.php?area=mycontenido_tasks&frame=$frame")); + +$ui->setVar("area","mycontenido_tasks"); +$ui->setVar("frame", $frame); +$ui->setVar("action", "todo_save_item"); +$ui->setVar("idcommunication", $idcommunication); + +$userselect = new cHTMLSelectElement("userassignment"); + +$userclass = new User; +foreach ($userclass->getAvailableUsers(explode(',', $auth->auth['perm'])) as $key => $value) +{ + $acusers[$key] = $value["username"]." (".$value["realname"].")"; +} + +asort($acusers); + +$userselect->autoFill($acusers); +$userselect->setDefault($auth->auth["uid"]); + +$ui->add(i18n("Assigned to"), $userselect->render()); + +$subject = new cHTMLTextbox("subject", $todoitem->get("subject"),60); +$ui->add(i18n("Subject"), $subject->render()); + +$message = new cHTMLTextarea("message", $todoitem->get("message")); +$ui->add(i18n("Description"), $message->render()); + +$reminderdue = new cHTMLTextbox("enddate", $todoitem->getProperty("todo", "enddate"), '', '', "enddate"); +$duepopup = 'Endzeitpunkt w�hlen'; +$ui->add(i18n("End date"),'
    '.$reminderdue->render().''.$duepopup.'
    '); + +$notiemail = new cHTMLCheckbox("notiemail", i18n("E-Mail notification")); +$notiemail->setChecked($todoitem->getProperty("todo", "emailnoti")); +$notiemail->setEvent("click","if(this.checked){ document.forms['reminder'].reminderdate.disabled=false; } else { document.forms['reminder'].reminderdate.disabled=true; }"); + +$ui->add(i18n("Reminder options"), $notiemail->toHTML()); + +$remindertimestamp = $todoitem->getProperty("todo", "reminderdate"); + +if ($remindertimestamp != 0) +{ + $mydate = date("Y-m-d H:i:s", $remindertimestamp); +} else { + $mydate = ""; +} + +$reminderdate = new cHTMLTextbox("reminderdate", $mydate, '', '', "reminderdate"); + +if (!$todoitem->getProperty("todo", "emailnoti")) +{ + $reminderdate->setDisabled(true); +} + +$datepopup = 'Endzeitpunkt w�hlen'; +$ui->add(i18n("Reminder date"),'
    '.$reminderdate->render().''.$datepopup.'
    '); + +$calscript = '"; + +$todos = new TODOCollection; + +$priorityselect = new cHTMLSelectElement("priority"); +$priorityselect->autoFill($todos->getPriorityTypes()); +$priorityselect->setDefault($todoitem->getProperty("todo", "priority")); +$ui->add(i18n("Priority"), $priorityselect->render()); + +$statusselect = new cHTMLSelectElement("status"); +$statusselect->autoFill($todos->getStatusTypes()); +$statusselect->setDefault($todoitem->getProperty("todo", "status")); +$ui->add(i18n("Status"), $statusselect->render()); + +$progress = new cHTMLTextbox("progress", (int)$todoitem->getProperty("todo", "progress"),5); +$ui->add(i18n("Progress"), $progress->render()."%"); + +$cpage->setcontent($ui->render().$calscript); + +$cpage->addScript("cal", ' + + + '); + +$cpage->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.mycontenido.tasks.php b/conlite/includes/include.mycontenido.tasks.php new file mode 100644 index 0000000..099a470 --- /dev/null +++ b/conlite/includes/include.mycontenido.tasks.php @@ -0,0 +1,428 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.mycontenido.tasks.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if (!isset($sortmode)) +{ + $sortmode = $currentuser->getUserProperty("system","tasks_sortmode"); + $sortby = $currentuser->getUserProperty("system","tasks_sortby"); +} + +$dateformat = getEffectiveSetting("backend", "timeformat", "Y-m-d H:i:s"); + +if (isset($_REQUEST["listsubmit"])) +{ + if (isset($c_restrict)) + { + $c_restrict = true; + $currentuser->setUserProperty("mycontenido", "hidedonetasks", "true"); + } else { + $c_restrict = false; + $currentuser->setUserProperty("mycontenido", "hidedonetasks", "false"); + } +} else { + if ($currentuser->getUserProperty("mycontenido", "hidedonetasks") == "true") + { + $c_restrict = true; + } else { + $c_restrict = false; + } +} + +class TODOBackendList extends cScrollList +{ + var $statustypes; + function TODOBackendList () + { + global $todoitems; + + parent::cScrollList(); + + $this->statustypes = $todoitems->getStatusTypes(); + $this->prioritytypes = $todoitems->getPriorityTypes(); + } + + function onRenderColumn ($column) + { + if ($column == 6 || $column == 5) + { + $this->objItem->updateAttributes(array("align" => "center")); + } else { + $this->objItem->updateAttributes(array("align" => "left")); + } + } + + function convert ($key, $value, $hidden) + { + global $link, $dateformat, $cfg; + + if ($key == 2) + { + $link->setCustom("idcommunication", $hidden[1]); + $link->setContent($value); + return $link->render(); + } + + if ($key == 3) + { + return date($dateformat,strtotime($value)); + } + + if ($key == 5) + { + + switch ($value) + { + case "new": + $img = "status_new.gif"; + break; + case "progress": + $img = "status_inprogress.gif"; + break; + case "done": + $img = "status_done.gif"; + break; + case "deferred": + $img = "status_deferred.gif"; + break; + case "waiting": + $img = "status_waiting.gif"; + break; + + default: break; + } + + if (!array_key_exists($value, $this->statustypes)) + { + return i18n("No status type set"); + } + $image = new cHTMLImage($cfg["path"]["contenido_fullhtml"].$cfg["path"]["images"]."reminder/".$img); + $image->setAlt($this->statustypes[$value]); + + //Do not display statuicon, only show statustext + //return $image->render(); + return $this->statustypes[$value]; + } + + if ($key == 7) + { + $amount = $value / 20; + + if ($amount < 0) + { + $amount = 0; + } + + if ($amount > 5) + { + $amount = 5; + } + + $amount = round($amount); + + $image = new cHTMLImage($cfg["path"]["contenido_fullhtml"].$cfg["path"]["images"]."reminder/progress.gif"); + $image->setAlt(sprintf(i18n("%d %% complete"), $value)); + $ret = ""; + + for ($i=0;$i<$amount;$i++) + { + $ret .= $image->render(); + } + + return $ret; + } + + if ($key == 6) + { + switch ($value) + { + case 0: $img = "prio_low.gif"; + $p = "low"; + break; + case 1: $img = "prio_medium.gif"; + $p = "medium"; + break; + case 2: $img = "prio_high.gif"; + $p = "high"; + break; + case 3: $img = "prio_veryhigh.gif"; + $p = "immediately"; + break; + default: break; + } + + $image = new cHTMLImage($cfg["path"]["contenido_fullhtml"].$cfg["path"]["images"]."reminder/".$img); + $image->setAlt($this->prioritytypes[$p]); + return $image->render(); + } + if ($key == 8) + { + if ($value !== "") + { + + if (round($value,2) == 0) + { + return i18n("Today"); + } else { + + if ($value < 0) + { + return number_format(0-$value, 2, ',', '') . " ".i18n("Day(s)"); + } else { + return ''. number_format(0-$value, 2, ',', '') . " ".i18n("Day(s)").''; + } + } + } + } + return $value; + } +} + +if ($action == "todo_save_item") +{ + + $subject = stripslashes($subject); + $message = stripslashes($message); + + $todoitem = new TODOItem; + $todoitem->loadByPrimaryKey($idcommunication); + + $todoitem->set("subject", $subject); + $todoitem->set("message", $message); + $todoitem->set("recipient", $userassignment); + + if (isset($reminderdate)) + { + $todoitem->setProperty("todo", "reminderdate", strtotime($reminderdate)); + } + + if (isset($notibackend)) + { + $todoitem->setProperty("todo", "backendnoti", $notibackend); + } + + if (isset($notiemail)) + { + $todoitem->setProperty("todo", "emailnoti", $notiemail); + } + + $todoitem->setProperty("todo", "status", $status); + + if ($priority < 0) + { + $priority = 0; + } + + if ($priority > 100) + { + $priority = 100; + } + + $todoitem->setProperty("todo", "priority", $priority); + $todoitem->setProperty("todo", "progress", $progress); + + $todoitem->setProperty("todo", "enddate", $enddate); + + $todoitem->store(); + + +} +$cpage = new cPage; + +$todoitems = new TODOCollection; + +if ($action == "mycontenido_tasks_delete") +{ + $todoitems->delete($idcommunication); +} + +$recipient = $auth->auth["uid"]; + +$todoitems->select("recipient = '$recipient' AND idclient='$client'"); + +$list = new TODOBackendList; + +$list->setHeader("",i18n("Subject"),i18n("Created"),i18n("End Date"),i18n("Status"), i18n("Priority"), sprintf(i18n("%% complete")), i18n("Due in"), i18n("Actions")); + + +$lcount = 0; + + +$link = new cHTMLLink; +$link->setCLink("mycontenido_tasks_edit", 4, ""); +$link->setCustom("sortmode", $sortmode); +$link->setCustom("sortby", $sortby); + +while ($todo = $todoitems->next()) +{ + if ((($todo->getProperty("todo", "status") != "done") && ($c_restrict == true))||($c_restrict == '')){ + { + $subject = $todo->get("subject"); + $created = $todo->get("created"); + + + $reminder = $todo->getProperty("todo", "enddate"); + $status = $todo->getProperty("todo", "status"); + $priority = $todo->getProperty("todo", "priority"); + $complete = $todo->getProperty("todo", "progress"); + + if (trim($subject) == "") + { + $subject = i18n("Unnamed item"); + } + + if (trim($reminder) == "") + { + $reminder = i18n("No end date set"); + } else { + $reminder = date($dateformat,strtotime($reminder)); + } + + if (trim($status) == "") + { + $status = i18n("No status set"); + } + + $link->setCustom("idcommunication", $todo->get("idcommunication")); + + + $link->setContent(''); + + $mimg = $link->render(); + + $link->setContent($subject); + + $msubject = $link->render(); + + $idcommunication = $todo->get("idcommunication"); + + $delete = new cHTMLLink; + + $delete->setCLink("mycontenido_tasks", 4, "mycontenido_tasks_delete"); + $delete->setCustom("idcommunication", $idcommunication); + $delete->setCustom("sortby", $sortby); + $delete->setCustom("sortmode", $sortmode); + + $img = new cHTMLImage("images/delete.gif"); + $img->setAlt(i18n("Delete item")); + + $delete->setContent($img->render()); + + $properties = $link; + + $img = new cHTMLImage("images/but_art_conf2.gif"); + $img->setAlt(i18n("Edit item")); + $img->setStyle("padding-right: 4px;"); + $properties->setContent($img); + + $actions = $properties->render() . $delete->render(); + + if ($todo->getProperty("todo", "enddate") != "") + { + $duein = round((time() - strtotime($todo->getProperty("todo", "enddate"))) / 86400,2); + } else { + $duein = ""; + } + + switch ($priority) + { + case "low": $p = 0;break; + case "medium": $p = 1;break; + case "high": $p = 2;break; + case "immediately": $p = 3;break; + default: break; + } + + $list->setData($lcount, $mimg, $subject, $created, $reminder, $status, $p, $complete, $duein, $actions); + $list->setHiddenData($lcount, $idcommunication, $idcommunication); + + $lcount++; + } + } +} + +$form = new UI_Table_Form("restrict"); +$form->addHeader(i18n("Restrict display")); +$form->setVar("listsubmit", "true"); + +$form->unsetActionButton("submit"); +$form->setActionButton("submit", "images/but_refresh.gif", i18n("Refresh"), "s"); + +$form->setVar("area", $area); +$form->setVar("frame", $frame); + +$restrict = new cHTMLCheckbox("c_restrict", "true"); +$restrict->setLabelText(i18n("Hide done tasks")); + +if ($c_restrict == true) +{ + $restrict->setChecked(true); +} + +$submit = new cHTMLButton("submit"); +$submit->setMode("image"); +$submit->setImageSource("images/submit.gif"); + +$form->add(i18n("Options"), $restrict->render()); + +if ($lcount == 0) +{ + $cpage->setContent($form->render()."
    ".i18n("No tasks found")."
    ".markSubMenuItem(1, true)); +} else { + if (!isset($sortby)) + { + $sortby = 1; + } + + if (!isset($sortmode)) + { + $sortmode = "ASC"; + } + + $list->setSortable(1,true); + $list->setSortable(2,true); + $list->setSortable(3,true); + $list->setSortable(4,true); + $list->setSortable(5,true); + $list->setSortable(6,true); + $list->setSortable(7,true); + $list->sort($sortby, $sortmode); + + $cpage->setContent($form->render()."
    ".$list->render(). markSubMenuItem(1, true)); +} +$cpage->render(); + +$currentuser->setUserProperty("system","tasks_sortby", $sortby); +$currentuser->setUserProperty("system","tasks_sortmode", $sortmode); +?> \ No newline at end of file diff --git a/conlite/includes/include.mycontenido_lastarticles.php b/conlite/includes/include.mycontenido_lastarticles.php new file mode 100644 index 0000000..0c091a1 --- /dev/null +++ b/conlite/includes/include.mycontenido_lastarticles.php @@ -0,0 +1,320 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-08-05 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.mycontenido_lastarticles.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.con.php"); + +$debug = false; + + $sql = "SELECT + logtimestamp + FROM + ".$cfg["tab"]["actionlog"]." + WHERE + user_id = '".Contenido_Security::escapeDB($auth->auth["uid"], $db). "' + ORDER BY + logtimestamp DESC + LIMIT 2"; + + $db->query($sql); + $db->next_record(); + + $lastlogin = $db->f("logtimestamp"); + + $idaction = $perm->getIDForAction("con_editart"); + + if ($cfg["is_start_compatible"] == true) + { + $sql = "SELECT + a.idart AS idart, + a.idartlang AS idartlang, + a.title AS title, + c.idcat AS idcat, + a.idlang AS idlang, + c.is_start AS is_start, + c.idcatart AS idcatart, + a.idtplcfg AS idtplcfg, + a.online AS online, + a.created AS created, + a.lastmodified AS lastmodified + FROM + ".$cfg["tab"]["art_lang"]." AS a, + ".$cfg["tab"]["art"]." AS b, + ".$cfg["tab"]["cat_art"]." AS c, + ".$cfg["tab"]["actionlog"]." AS d + WHERE + a.idlang = '".Contenido_Security::toInteger($lang)."' AND + a.idart = b.idart AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idart = c.idart AND + d.idaction = '".Contenido_Security::toInteger($idaction)."' AND + d.user_id = '".Contenido_Security::escapeDB($auth->auth["uid"], $db)."' AND + d.idcatart = c.idcatart + GROUP BY + c.idcatart + ORDER BY + logtimestamp DESC + LIMIT 5"; + } else { + $sql = "SELECT + a.idart AS idart, + a.idartlang AS idartlang, + a.title AS title, + c.idcat AS idcat, + a.idlang AS idlang, + c.idcatart AS idcatart, + a.idtplcfg AS idtplcfg, + a.online AS online, + a.created AS created, + a.lastmodified AS lastmodified + FROM + ".$cfg["tab"]["art_lang"]." AS a, + ".$cfg["tab"]["art"]." AS b, + ".$cfg["tab"]["cat_art"]." AS c, + ".$cfg["tab"]["actionlog"]." AS d + WHERE + a.idlang = '".Contenido_Security::toInteger($lang)."' AND + a.idart = b.idart AND + b.idclient = '".Contenido_Security::toInteger($client)."' AND + b.idart = c.idart AND + d.idaction = '".Contenido_Security::toInteger($idaction)."' AND + d.user_id = '".Contenido_Security::escapeDB($auth->auth["uid"], $db)."' AND + d.idcatart = c.idcatart + GROUP BY + c.idcatart + ORDER BY + logtimestamp DESC + LIMIT 5"; + } + + # Debug info + if ( $debug ) { + + echo "
    ";
    +            echo $sql;
    +            echo "
    "; + + } + + $db->query($sql); + + # Reset Template + $tpl->reset(); + + # No article + $no_article = true; + + $tpl->set('s', 'LASTARTICLES', i18n("Recently edited articles").":".markSubMenuItem(1)); + + while ( $db->next_record() ) { + $idtplcfg = $db->f("idtplcfg"); + $idartlang = $db->f("idartlang"); + $idlang = $db->f("idlang"); + $idcat = $db->f("idcat"); + $idart = $db->f("idart"); + $online = $db->f("online"); + + if ($cfg["is_start_compatible"] == true) + { + $is_start = $db->f("is_start"); + } else { + $is_start = isStartArticle($idartlang, $idcat, $idlang); + } + + $idcatart = $db->f("idcatart"); + $created = $db->f("created"); + $modified = $db->f("lastmodified"); + $category = ""; + conCreateLocationString($idcat, " / ", $category); + if ($category == "") + { + $category = " "; + } + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + + # Backgroundcolor of the table row + $tpl->set('d', 'BGCOLOR', $bgcolor); + + # Article Title + $tmp_alink = $sess->url("frameset.php?area=con&override_area4=con_editcontent&override_area3=con&action=con_editart&idartlang=$idartlang&idart=$idart&idcat=$idcat&idartlang=$idartlang"); + $tpl->set('d', 'ARTICLE', $db->f('title')); + + # Created + $tpl->set('d', 'CREATED', $created); + + # Lastmodified + $tpl->set('d', 'LASTMODIFIED', $modified); + + # Category + $tpl->set('d', 'CATEGORY', $category); + # Article Template + if ( 0 == $idtplcfg ) { # Uses Category Template + $a_tplname = "--- ".i18n("None")." ---"; + $a_idtpl = 0; + + } else { # Has own Template + + if ( !isset($db2) || !is_object($db2) ) { + $db2 = new DB_ConLite; + } + + $sql2 = "SELECT + b.name AS tplname, + b.idtpl AS idtpl + FROM + ".$cfg["tab"]["tpl_conf"]." AS a, + ".$cfg["tab"]["tpl"]." AS b + WHERE + a.idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' AND + a.idtpl = b.idtpl"; + + $db2->query($sql2); + $db2->next_record(); + + $a_tplname = $db2->f("tplname"); + $a_idtpl = $db2->f("idtpl"); + } + + if ($a_tplname == "") + { + $a_tplname = " "; + } + + $tpl->set('d', 'TPLNAME', $a_tplname); + + # Make Startarticle button + $tmp_img = (1 == $is_start) ? '' : ''; + $tpl->set('d', 'START', $tmp_img); + + if ( $online ) { + $tmp_online = ''.i18n('; + + } else { + $tmp_online = ''.i18n('; + } + + $tpl->set('d', 'ONLINE', $tmp_online); + + + # Next iteration + $tpl->next(); + + # Articles found + $no_article = false; + + } + + # Sortierungs select + $s_types = array(1 => "Alphabetisch", + 2 => "Letze �nderung", + 3 => "Erstellungsdatum"); + + $tpl2 = new Template; + $tpl2->set('s', 'NAME', 'sort'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'onchange="artSort(this)"'); + + foreach ($s_types as $key => $value) { + + $selected = ( isset($_GET['sort']) && $_GET['sort'] == $key ) ? 'selected="selected"' : ''; + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value); + $tpl2->set('d', 'SELECTED', $selected); + $tpl2->next(); + + } + + $select = ( !$no_article ) ? $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true) : ''; + $caption = ( !$no_article ) ? 'Artikel sortieren' : ''; + + $tpl->set('s', 'ARTSORTCAPTION', $caption); + $tpl->set('s', 'ARTSORT', $select); + + # Extract Category and Catcfg + $sql = "SELECT + b.name AS name, + d.idtpl AS idtpl + FROM + (".$cfg["tab"]["cat"]." AS a, + ".$cfg["tab"]["cat_lang"]." AS b, + ".$cfg["tab"]["tpl_conf"]." AS c) + LEFT JOIN + ".$cfg["tab"]["tpl"]." AS d + ON + d.idtpl = c.idtpl + WHERE + a.idclient = '".Contenido_Security::toInteger($client)."' AND + a.idcat = '".Contenido_Security::toInteger($idcat)."' AND + b.idlang = '".Contenido_Security::toInteger($lang)."' AND + b.idcat = a.idcat AND + c.idtplcfg = b.idtplcfg"; + + $db->query($sql); + $db->next_record(); + + $cat_idtpl = $db->f("idtpl"); + + # Hinweis wenn kein Artikel gefunden wurde + if ( $no_article ) { + + $tpl->set("d", "START", " "); + $tpl->set("d", "ARTICLE", i18n("No article found")); + $tpl->set("d", "CREATED", " "); + $tpl->set("d", "LASTMODIFIED", " "); + $tpl->set("d", "ARTCONF", " "); + $tpl->set("d", "TPLNAME", " "); + $tpl->set("d", "TPLCONF", " "); + $tpl->set("d", "ONLINE", " "); + $tpl->set('d', 'CATEGORY', ' '); + $tpl->set("d", "DELETE", " "); + + $tpl->next(); + + } + + $cat_name = ""; + + # SELF_URL (Variable f�r das javascript); + $tpl->set('s', 'SELF_URL', $sess->url("main.php?area=con&frame=4&idcat=$idcat")); + + # Neuer Artikel link + $tpl->set('s', 'NEWARTICLE', 'Neuen Artikel erstellen'); + + $tpl->set('s', 'HELP', ""); + + # Generate template + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['mycontenido_lastarticles']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.mycontenido_settings.php b/conlite/includes/include.mycontenido_settings.php new file mode 100644 index 0000000..2ff0ee2 --- /dev/null +++ b/conlite/includes/include.mycontenido_settings.php @@ -0,0 +1,148 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-10-??, Bilal Arslan - moved password DB queries, added new ConUser object + * modified 2008-11-17, H. Librenz - method calls on new ConUser object modified, comments added + * modified 2011-02-07, Dominik Ziegler, removed integration of not supported java module editor + * + * $Id: include.mycontenido_settings.php 130 2012-09-13 10:34:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$user = new cApiUser($auth->auth["uid"]); + +$noti = ""; + +if ($action == "mycontenido_editself") +{ + + if (!isset($wysi)) + { + $wysi = false; + } + + $error = false; + + if ($newpassword != "") + { + if (md5($oldpassword) != $user->get("password")) + { + $error = i18n("Old password incorrect"); + } + + if (strcmp($newpassword, $newpassword2) != 0) + { + $error = i18n("Passwords don't match"); + } + + + if ($error !== false) + { + $noti = $notification->returnNotification("error", $error)."
    "; + } else { + // New Class User, update password + $oUser = new ConUser($cfg, $db, $auth->auth['uid']); + $iResult = $oUser->savePassword($newpassword); + + #$user->set("password", md5($newpassword)); + + if ( $iResult == iConUser::PASS_OK ) { + $noti = $notification->returnNotification("info", i18n("Password changed"))."
    "; + } else { + $noti = $notification->returnNotification("error", ConUser::getErrorString($iResult, $cfg)); + } + + } + } + + + + $user->set("email", $email); + $user->set("wysi", $wysi); + + $user->setUserProperty("backend", "timeformat", $format); + $user->setUserProperty("backend", "timeformat_date", $formatdate); + $user->setUserProperty("backend", "timeformat_time", $formattime); + $user->store(); +} + + +$settingsfor = sprintf(i18n("Settings for %s"), $user->get("username") . " (".$user->get("realname").")"); + +$form = new UI_Table_Form("settings"); +$form->setWidth('550'); + +$form->setVar("idlang", $lang); +$form->setVar("area", $area); +$form->setVar("action", "mycontenido_editself"); +$form->setVar("frame", $frame); + +$form->addHeader($settingsfor); + +// @since 2006-07-04 Display password fields if not authenticated via LDAP/AD, only +if ($user->get("password") != 'active_directory_auth') { + $oldpassword = new cHTMLPasswordbox("oldpassword"); + $newpassword = new cHTMLPasswordbox("newpassword"); + $newpassword2 = new cHTMLPasswordbox("newpassword2"); + + $form->add(i18n("Old password"), $oldpassword); + $form->add(i18n("New password"), $newpassword); + $form->add(i18n("Confirm new password"), $newpassword2); +} + +$email = new cHTMLTextbox("email", $user->get("email")); +$form->add(i18n("E-Mail"), $email); + +$wysiwyg = new cHTMLCheckbox("wysi", 1); +$wysiwyg->setChecked($user->get("wysi")); +$wysiwyg->setLabelText(i18n("Use WYSIWYG Editor")); + +$form->add(i18n("Options"), array($wysiwyg)); + +$formathint = "
    ".i18n("The format is equal to PHP's date() function."); +$formathint.= "
    "; +$formathint.= i18n("Common date formattings").":"; +$formathint.= "
    "; +$formathint.= "d M Y H:i => 01 Jan 2004 00:00"; +$formathint.= "
    "; +$formathint.= "d.m.Y H:i:s => 01.01.2004 00:00:00"; + +$format = new cHTMLTextbox("format", $user->getUserProperty("backend", "timeformat")); +$format2 = new cHTMLTextbox("formatdate", $user->getUserProperty("backend", "timeformat_date")); +$format3 = new cHTMLTextbox("formattime", $user->getUserProperty("backend", "timeformat_time")); + +$form->add(i18n("Date/Time format"), array($format, $formathint)); +$form->add(i18n("Date format"), array($format2)); +$form->add(i18n("Time format"), array($format3)); + +$page = new cPage(); +$page->setContent(array($noti, $form, markSubMenuItem(3, true))); +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.note.display.php b/conlite/includes/include.note.display.php new file mode 100644 index 0000000..4e6a378 --- /dev/null +++ b/conlite/includes/include.note.display.php @@ -0,0 +1,51 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.note.display.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ($action == "note_delete") +{ + $oNoteCollection = new NoteCollection; + $oNoteCollection->delete($deleteitem); +} + +$page = new cPage; + +$oNoteList = new NoteList($itemtype, $itemid); +$oNoteList->setDeleteable(true); + +$page->setExtra('background: '.$cfg["color"]["table_light"]); +$page->setMargin(0); +$page->setContent($oNoteList); +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.note.popup.php b/conlite/includes/include.note.popup.php new file mode 100644 index 0000000..88c9227 --- /dev/null +++ b/conlite/includes/include.note.popup.php @@ -0,0 +1,100 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.note.popup.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$cpage = new cPage; + +if ($action == "note_save_item") +{ + $notes = new NoteCollection; + + $note = stripslashes(nl2br($note)); + + if ($category != "") + { + $categoryname = $category; + } + + if ($categoryentry != "") + { + $categoryname = $categoryentry; + } + + $item = $notes->create($itemtype, $itemid, $lang, $note, $categoryname); + $item->store(); + + $cpage->setContent(""); +} else { + $list = new NoteView($itemtype, $itemid); + $list->setWidth("100%"); + $list->setStyleDefinition("margin-bottom", "10px"); + $ui = new UI_Table_Form("note"); + $ui->addHeader(i18n("Add note")); + + $ui->setVar("area",$area); + $ui->setVar("frame", $frame); + $ui->setVar("action", "note_save_item"); + $ui->setVar("itemtype", $itemtype); + $ui->setVar("itemid", $itemid); + + /* Fetch all note categors */ + $dbprop = new DB_ConLite; + $dbprop->query("SELECT DISTINCT value FROM ".$cfg["tab"]["properties"] .' where type="note" AND name="category"'); + + $categories = array("" => i18n("No category")); + + $oNoteItem = new NoteItem; + + while ($dbprop->next_record()) + { + $sValue = $oNoteItem->_outFilter($dbprop->f("value")); + $categories[$sValue] = $sValue; + } + + $cselect = new cHTMLSelectElement("category"); + $cselect->autoFill($categories); + + $centry = new cHTMLTextbox("categoryentry", "", 30); + + $message = new cHTMLTextarea("note"); + $message->setStyle("width: 100%"); + $ui->add(i18n("Note"), $message->render()); + $ui->add(i18n("Category"), array($cselect, $centry)); + $ui->setWidth("100%"); + + $cpage->setcontent($list->render().$ui->render()); +} +$cpage->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.pretplcfg_edit.php b/conlite/includes/include.pretplcfg_edit.php new file mode 100644 index 0000000..60b9b0a --- /dev/null +++ b/conlite/includes/include.pretplcfg_edit.php @@ -0,0 +1,106 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2009-10-23, Ortwin Pinke, deleted not needed idcat/idart part for better performance + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.pretplcfg_edit.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( !isset($idtplcfg) ) { + + $sql = "SELECT + idtplcfg + FROM + ".$cfg["tab"]["tpl"]." + WHERE + idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + + $db->query($sql); + $db->next_record(); + + $idtplcfg = $db->f("idtplcfg"); + + if ( $idtplcfg == 0 ) { + + $nextid = $db->nextid($cfg["tab"]["tpl_conf"]); + $timestamp = time(); + + $sql = "UPDATE ".$cfg["tab"]["tpl"]." SET idtplcfg = '".Contenido_Security::toInteger($nextid)."' WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + $db->query($sql); + + $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." + (idtplcfg, idtpl, status, author, created, lastmodified) + VALUES + ('".Contenido_Security::toInteger($nextid)."', '".Contenido_Security::toInteger($idtpl)."', '', '', '".$timestamp."', '".$timestamp."')"; + + $db->query($sql); + $idtplcfg = $nextid; + } + +} + +if (isset($idtplcfg)) { + $sql = "SELECT number FROM ".$cfg["tab"]["container"]." WHERE idtpl='".Contenido_Security::toInteger($idtpl)."'"; + $db->query($sql); + while ($db->next_record()) { + $i = $db->f("number"); + $CiCMS_VAR = "C".$i."CMS_VAR"; + if (isset($_POST[$CiCMS_VAR])) { + $tmp = $_POST[$CiCMS_VAR]; + } else { + unset($tmp); + } + if (isset($tmp)) { + foreach ($tmp as $key=>$value) { + $value = urlencode($value); + if (!isset($varstring[$i])) $varstring[$i]=""; + $varstring[$i] = $varstring[$i].$key."=".$value."&"; + } +# $varstring[$i] = preg_replace("/&$/", "", $varstring[$i]); + } + } + + // update/insert in container_conf + if (isset($varstring) && is_array($varstring)) { + // delete all containers + $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($idtplcfg)."'"; + $db->query($sql); + + foreach ($varstring as $col=>$val) { + // insert all containers + $sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." (idcontainerc, idtplcfg, number, container) ". + "VALUES ('".$db->nextid($cfg["tab"]["container_conf"])."', '".Contenido_Security::toInteger($idtplcfg)."', '".Contenido_Security::toInteger($col)."', '".Contenido_Security::escapeDB($val, $db)."') "; + $db->query($sql); + } + } +} +?> \ No newline at end of file diff --git a/conlite/includes/include.pretplcfg_edit_form.php b/conlite/includes/include.pretplcfg_edit_form.php new file mode 100644 index 0000000..7514146 --- /dev/null +++ b/conlite/includes/include.pretplcfg_edit_form.php @@ -0,0 +1,160 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.pretplcfg_edit_form.php 74 2012-05-24 18:49:58Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$tpl->reset(); + +$sql = "SELECT * FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($idtplcfg)."'"; +$db->query($sql); + +$a_c = array(); + +while ($db->next_record()) { + $a_c[$db->f("number")] = $db->f("container"); // 'varstring' is safed in $a_c +} + +//Form +$formaction = $sess->url("main.php"); +# +$hidden = ' + + + + + + + '; + +$tpl->set('s', 'FORMACTION', $formaction ); +$tpl->set('s', 'HIDDEN', $hidden ); + + +$sql = "SELECT + idtpl, + name + FROM + ".$cfg["tab"]["tpl"]." + WHERE + idclient = '".Contenido_Security::toInteger($client)."' AND + idtpl = '".Contenido_Security::toInteger($idtpl)."'"; + +$db->query($sql); +$db->next_record(); + +$tpl->set('s', 'TEMPLATECAPTION', i18n("Template"). ": "); +$tpl->set('s', 'TEMPLATESELECTBOX', $db->f("name")); + +//************** For all Containers list module input +$sql = "SELECT + * + FROM + ".$cfg["tab"]["container"]." + WHERE + idtpl='".Contenido_Security::toInteger($idtpl)."' ORDER BY idcontainer ASC"; + +$db->query($sql); +while ($db->next_record()) { + $a_d[$db->f("number")] = $db->f("idmod"); // 'list of used modules' is safed in $a_d +} + +if (isset($a_d) && is_array($a_d)) { + foreach ($a_d as $cnumber=>$value) { + // nur die Container anzeigen, in denen auch ein Modul enthalten ist + if ($value != 0) { + global $cCurrentModule; + + $oModule = new cApiModule((int) $a_d[$cnumber]); + $input = $oModule->get("input")."\n"; + $cCurrentModule = $oModule->get("idmod"); + $modulecaption = sprintf(i18n("Module in Container %s"), $cnumber); + $modulename = $oModule->get("name"); + unset($oModule); + + $varstring = array(); + if (isset($a_c[$cnumber])) { + $a_c[$cnumber] = preg_replace("/&$/", "", $a_c[$cnumber]); + $tmp1 = preg_split("/&/", $a_c[$cnumber]); + + foreach ($tmp1 as $key1=>$value1) { + $tmp2 = explode("=", $value1); + foreach ($tmp2 as $key2=>$value2) { + $varstring[$tmp2[0]]=$tmp2[1]; + } + } + } + $CiCMS_Var = '$C'.$cnumber.'CMS_VALUE'; + $CiCMS_VALUE = ''; + + foreach ($varstring as $key3=>$value3){ + $tmp = urldecode($value3); + $tmp = str_replace("\'", "'", $tmp); + $CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; '; + $input = str_replace("\$CMS_VALUE[$key3]", $tmp, $input); + $input = str_replace("CMS_VALUE[$key3]", $tmp, $input); + } + + $input = str_replace("CMS_VALUE", $CiCMS_Var, $input); + $input = str_replace("\$".$CiCMS_Var, $CiCMS_Var, $input); + $input = str_replace("CMS_VAR", "C".$cnumber."CMS_VAR" , $input); + + ob_start(); + eval($CiCMS_VALUE." \r\n ".$input); + $modulecode = ob_get_contents(); + ob_end_clean(); + + $tpl->set('d', 'MODULECAPTION', $modulecaption); + $tpl->set('d', 'MODULENAME', $modulename); + $tpl->set('d', 'MODULECODE', $modulecode); + $tpl->next(); + + } + } +} + +$tpl->set('s', 'SCRIPT', ''); +$tpl->set('s', 'MARKSUBMENU', ''); +$tpl->set('s', 'CATEGORY', ''); + +$tpl->set('s', 'HEADER', i18n('Template preconfiguration')); +$tpl->set('s', 'DISPLAY_HEADER', 'block'); + +$buttons = '     + '; + +$tpl->set('s', 'BUTTONS', $buttons); + +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['tplcfg_edit_form']); +?> \ No newline at end of file diff --git a/conlite/includes/include.rights_create.php b/conlite/includes/include.rights_create.php new file mode 100644 index 0000000..67e6a3e --- /dev/null +++ b/conlite/includes/include.rights_create.php @@ -0,0 +1,316 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-30 + * modified 2008-06-24, Timo Trautmann, storage for valid from valid to added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-11-17, H. Librenz - new ConUser class are used for user creation now, comments fixed, code formatted + * modified 2008-11-18, H. Librenz - values given during a submittion try are now resubmitted + * modified 2010-05-31, Ortwin Pinke, PHP >= 5.3, replace deprecated split-function with explode() + * modified 2011-02-07, Murat Purc, Cleanup, optimization and formatting + * + * $Id: include.rights_create.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude('includes', 'functions.rights.php'); + +if (!$perm->have_perm_area_action($area, $action)) { + $notification->displayNotification("error", i18n("Permission denied")); + return; +} + +$aPerms = array(); +$sNotification = ''; +$bError = false; + +if ($action == 'user_createuser') { + if ($username == '') { + $sNotification = $notification->returnNotification("warning", i18n("Username can't be empty")); + $bError = true; + } else { + + $aPerms = buildUserOrGroupPermsFromRequest(true); + + $oUser = new ConUser($cfg, $db); + + if (strcmp($password, $passwordagain) == 0) { + + // ok, both passwords given are equal, but is the password valid? + $iPassCheck = $oUser->setPassword($password); + + if ($iPassCheck == iConUser::PASS_OK) { + // yes, it is.... + try { + $oUser->setUserName($username); + $oUser->setRealName($realname); + $oUser->setMail($email); + $oUser->setTelNumber($telephone); + $oUser->setStreet($address_street); + $oUser->setCity($address_city); + $oUser->setZip($address_zip); + $oUser->setCountry($address_country); + $oUser->setUseTiny($wysi); + $oUser->setValidDateFrom($valid_from); + $oUser->setValidDateTo($valid_to); + $oUser->setPerms($aPerms); + $oUser->setPassword($password); + + if ($oUser->save()) { + // save user id and clean "old" values... + $sNotification = $notification->returnNotification("info", i18n("User created")); + $userid = $oUser->getUserId(); + + $username = ''; + $realname = ''; + $email = ''; + $telephone = ''; + $address_city = ''; + $address_country = ''; + $address_street = ''; + $address_zip = ''; + $wysi = ''; + $valid_from = ''; + $valid_to = ''; + $aPerms = array(); + $password = ''; + } + + } catch (ConUserException $cue) { + switch ($cue->getCode()) { + case iConUser::EXCEPTION_USERNAME_EXISTS: + $sNotification = $notification->returnNotification("warning", i18n("Username already exists")); + $bError = true; + break; + default: + $sNotification = $notification->returnNotification("warning", i18n("Unknown error") . ": " . $cue->getMessage()); + $bError = true; + break; + } + } + } else { + // oh oh, password is NOT valid. check it... + $sNotification = $notification->returnNotification("warning", ConUser::getErrorString($iPassCheck, $cfg)); + $bError = true; + } + + } else { + $sNotification = $notification->returnNotification("warning", i18n("Passwords don't match")); + $bError = true; + } + } +} + + +$tpl->reset(); +$tpl->set('s','NOTIFICATION', $sNotification); + +$form = '
    + ' . $sess->hidden_session(true) . ' + + + + '; + +$tpl->set('s', 'FORM', $form); +$tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('s', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('s', 'SUBMITTEXT', i18n("Save changes")); + +$tpl->set('d', 'CATNAME', i18n("Property")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', i18n("Value")); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Username")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'username', $username, 40, 32)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Name")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'realname', $realname, 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("New password")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('password', 'password', '', 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Confirm new password")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('password', 'passwordagain', '', 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("E-Mail")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'email', $email, 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Phone number")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'telephone', $telephone, 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Street")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_street', $address_street, 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("ZIP code")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_zip', $address_zip, 10, 10)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("City")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_city', $address_city, 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Country")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_country', $address_country, 40, 255)); +$tpl->next(); + +// permissions of current logged in user +$aAuthPerms = explode(',', $auth->auth['perm']); + +// sysadmin perm +if (in_array('sysadmin', $aAuthPerms)) { + $tpl->set('d', 'CATNAME', i18n("System administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateCheckbox('msysadmin', '1', in_array('sysadmin', $aPerms))); + $tpl->next(); +} + +// clients admin perms +$oClientsCollection = new cApiClientCollection(); +$aClients = $oClientsCollection->getAvailableClients(); +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if (in_array("admin[" . $idclient . "]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("madmin[" . $idclient . "]", $idclient, in_array("admin[" . $idclient . "]", $aPerms), $item['name'] . "(" . $idclient . ")") . "
    "; + } +} + +if ($sClientCheckboxes !== '') { + $tpl->set('d', 'CATNAME', i18n("Administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// clients perms +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if (in_array("client[" . $idclient . "]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms) || in_array("admin[" . $idclient . "]", $aAuthPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("mclient[" . $idclient . "]", $idclient, in_array("client[" . $idclient . "]", $aPerms), $item['name'] . "(" . $idclient . ")") . "
    "; + } +} + +$tpl->set('d', 'CATNAME', i18n("Access clients")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', $sClientCheckboxes); +$tpl->next(); + +// languages perms +$aClientsLanguages = getAllClientsAndLanguages(); +$sClientCheckboxes = ''; +foreach ($aClientsLanguages as $item) { + if ($perm->have_perm_client("lang[" . $item['idlang'] . "]") || $perm->have_perm_client("admin[" . $item['idclient'] . "]")) { + $sClientCheckboxes .= formGenerateCheckbox("mlang[" . $item['idlang'] . "]", $item['idlang'], in_array("lang[" . $item['idlang'] . "]", $aPerms), $item['langname'] . "(" . $item['clientname'] . ")") . "
    "; + } +} + +$tpl->set('d', 'CATNAME', i18n("Access languages")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', $sClientCheckboxes); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Use WYSIWYG-Editor")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', formGenerateCheckbox('wysi', '1', ((int) $wysi == 1))); +$tpl->next(); + +$sInputValidFrom = ' + + + '; +$sInputValidFrom .= ' '; +$sInputValidFrom .= ''; + +$tpl->set('d', 'CATNAME', i18n("Valid from")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', $sInputValidFrom); +$tpl->next(); + +$sInputValidTo = ' '; +$sInputValidTo .= ''; + +$tpl->set('d', 'CATNAME', i18n("Valid to")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', $sInputValidTo); +$tpl->next(); + +// Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['rights_create']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.rights_external.php b/conlite/includes/include.rights_external.php new file mode 100644 index 0000000..19b54d4 --- /dev/null +++ b/conlite/includes/include.rights_external.php @@ -0,0 +1,58 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-16, Holger Librenz, Hotfix: added check for invalid calls + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.rights_external.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// @TODO: check if the code beneath is necessary +if (isset($_REQUEST['sAreaFilename'])) { + die ('Illegal call!'); +} + +$_cecIterator = $_cecRegistry->getIterator("Contenido.Permissions.User.GetAreaEditFilename"); + +while ($chainEntry = $_cecIterator->next()) +{ + $aInfo = $chainEntry->execute($_REQUEST["external_area"]); + if ($aInfo !== false) + { + $sAreaFilename = $aInfo; + break; + } +} + +if ($sAreaFilename !== false) +{ + include($sAreaFilename); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.rights_left_top.php b/conlite/includes/include.rights_left_top.php new file mode 100644 index 0000000..77c9e46 --- /dev/null +++ b/conlite/includes/include.rights_left_top.php @@ -0,0 +1,199 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-29 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.rights_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oUser = new cApiUser($auth->auth["uid"]); +if (!isset($elemperpage) || !is_numeric($elemperpage) || $elemperpage < 0) +{ + $elemperpage = $oUser->getProperty("itemsperpage", $area); + $_REQUEST['elemperpage'] = $elemperpage; + if ((int) $elemperpage <= 0) { + $oUser->setProperty("itemsperpage", $area, 25); + $elemperpage = 25; + $_REQUEST['elemperpage'] = 25; + } +} else { + $oUser->setProperty("itemsperpage", $area, $elemperpage); + $_REQUEST['elemperpage'] = $elemperpage; +} + +// The following lines unset all right objects since +// I don't know (or I was unable to find out) if they +// are global and/or session variables - so if you are +// switching between groups and user management, we are +// safe. +unset($right_list); +unset($rights_list_old); +unset($rights_perms); +$right_list = ""; +$rights_list_old = ""; +$rights_perms = ""; + +$tpl->set('s', 'ID', 'restrict'); +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'SID', $sess->id); +$tpl->set('s', 'SESSID', $sess->id); + + +$tpl2 = new Template; +$tpl2->set('s', 'NAME', 'restrict'); +$tpl2->set('s', 'CLASS', 'text_medium'); +$tpl2->set('s', 'OPTIONS', 'onchange="userChangeRestriction()"'); + +$limit = array( + "2" => i18n("All"), + "1" => i18n("Frontend only"), + "3" => i18n("Backend only")); + +foreach ($limit as $key => $value) { + + if ($restrict == $key) + { + $selected = "selected"; + } else { + $selected = ""; + } + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value); + $tpl2->set('d', 'SELECTED', $selected); + $tpl2->next(); + +} + +$select = $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true); + +$tpl->set('s', 'ACTION', ''); + +$tmp_mstr = '
    + %s
    '; +$area = "user"; +$mstr = sprintf($tmp_mstr, 'right_bottom',$sess->url("main.php?area=user_create&frame=4"),i18n("Create user")); + +if ($perm->have_perm_area_action('user_create', "user_createuser")) { + $tpl->set('s', 'NEWUSER', $mstr); +} else { + $tpl->set('s', 'NEWUSER', ''); +} +$tpl->set('s', 'CAPTION', ''); + +################# +# List Options +################# +$aSortByOptions = array( "username" => i18n("User name"), + "realname" => i18n("Name")); + +$aSortOrderOptions = array( "asc" => i18n("Ascending"), + "desc" => i18n("Descending")); + +$listOptionId="listoption"; +$tpl->set('s', 'LISTOPLINK', $listOptionId); +$oListOptionRow = new cFoldingRow( "5498dbba-ed4a-4618-8e49-3a3635396e22", i18n("List options"), $listOptionId); +$oListOptionRow->setExpanded('true'); +$oSelectItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelectItemsPerPage->autoFill(array(25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelectItemsPerPage->setDefault($_REQUEST["elemperpage"]); + +$oSelectSortBy = new cHTMLSelectElement("sortby"); +$oSelectSortBy->autoFill($aSortByOptions); +$oSelectSortBy->setDefault($_REQUEST["sortby"]); + +$oSelectSortOrder = new cHTMLSelectElement("sortorder"); +$oSelectSortOrder->autoFill($aSortOrderOptions); +$oSelectSortOrder->setDefault($_REQUEST["sortorder"]); + +$oTextboxFilter = new cHTMLTextbox("filter", $_REQUEST["filter"], 20); +$oTextboxFilter->setStyle('width:114px;'); + +$content = '
    '; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= ''; +$content .= '
    '. i18n("Items / page").''.$oSelectItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelectSortBy->render().'
    '. i18n("Sort order").''.$oSelectSortOrder->render().'
    '. i18n("Search for").''.$oTextboxFilter->render().'
     
    '; +$content .= ''; +$content .= '
    '; +$oListOptionRow->setContentData($content); +$tpl->set('s', 'LISTOPTIONS', $oListOptionRow->render()); + +######### +# Paging +######### +$cApiUserCollection = new cApiUserCollection; +$cApiUserCollection->query(); +$iItemCount = $cApiUserCollection->count(); + +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("elemperpage", $elemperpage); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("frame", 2); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +$pagerID="pager"; +$oPager = new cObjectPager("44b41691-0dd4-443c-a594-66a8164e25fd", $iItemCount, $elemperpage, $page, $oPagerLink, "page", $pagerID); +$oPager->setExpanded('true'); +$tpl->set('s', 'PAGINGLINK', $pagerID); +$tpl->set('s', 'PAGING', $oPager->render()); + + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['rights_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.rights_menu.php b/conlite/includes/include.rights_menu.php new file mode 100644 index 0000000..fc45370 --- /dev/null +++ b/conlite/includes/include.rights_menu.php @@ -0,0 +1,250 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-23 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * + * $Id: include.rights_menu.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oPage = new cPage; + +$cApiUserCollection = new cApiUserCollection; +$cApiUserCollection->query(); +$iSumUsers = $cApiUserCollection->count(); + +if (isset($_REQUEST["sortby"]) && $_REQUEST["sortby"] != "") +{ + $cApiUserCollection->setOrder($_REQUEST["sortby"]. " ". $_REQUEST["sortorder"]); +} else { + $cApiUserCollection->setOrder("username asc"); +} + +if (isset($_REQUEST["filter"]) && $_REQUEST["filter"] != "") +{ + $cApiUserCollection->setWhereGroup("default", "username", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "realname", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "email", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "telephone", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "address_street", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "address_zip", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "address_city", "%".$_REQUEST["filter"]."%", "LIKE"); + $cApiUserCollection->setWhereGroup("default", "address_country", "%".$_REQUEST["filter"]."%", "LIKE"); + + $cApiUserCollection->setInnerGroupCondition("default", "OR"); +} +$cApiUserCollection->query(); + +$aCurrentUserPermissions = explode(',', $auth->auth['perm']); +$aCurrentUserAccessibleClients = $classclient->getAccessibleClients(); + +$iMenu = 0; +$iItemCount = 0; +$mPage = $_REQUEST["page"]; + +if ($mPage == 0) +{ + $mPage = 1; +} + +$elemperpage = $_REQUEST["elemperpage"]; + +if ($elemperpage == 0) +{ + $elemperpage = 25; +} + +$mlist = new UI_Menu; +$sToday = date('Y-m-d'); + + +if (($elemperpage*$mPage) >= $iSumUsers+$elemperpage && $mPage != 1) { + $_REQUEST["page"]--; + $mPage--; +} + +while ($cApiUser = $cApiUserCollection->next()) +{ + $userid = $cApiUser->get("user_id"); + + $aUserPermissions = explode(',', $cApiUser->get('perms')); + + $bDisplayUser = false; + + if (in_array("sysadmin", $aCurrentUserPermissions)) + { + $bDisplayUser = true; + } + + foreach ($aCurrentUserAccessibleClients as $key => $value) + { + if (in_array("client[$key]", $aUserPermissions)) + { + $bDisplayUser = true; + } + } + + foreach ($aUserPermissions as $sLocalPermission) + { + if (in_array($sLocalPermission, $aCurrentUserPermissions)) + { + $bDisplayUser = true; + } + } + + $link = new cHTMLLink; + $link->setMultiLink("user", "", "user_overview", ""); + $link->setCustom("userid", $cApiUser->get("user_id")); + + if ($bDisplayUser == true) + { + $iItemCount++; + + if ($iItemCount > ($elemperpage * ($mPage - 1)) && $iItemCount < (($elemperpage * $mPage) + 1)) + { + if ($perm->have_perm_area_action('user',"user_delete") ) { + $message = sprintf(i18n("Do you really want to delete the user %s?"), $cApiUser->get("username")); + + $delTitle = i18n("Delete user"); + $deletebutton = ''.$delTitle.''; + + } else { + $deletebutton = ""; + } + + $iMenu++; + + if (($sToday < $cApiUser->get("valid_from") && ($cApiUser->get("valid_from") != '0000-00-00' && $cApiUser->get("valid_from") != '')) || + ($sToday > $cApiUser->get("valid_to") && ($cApiUser->get("valid_to") != '0000-00-00') && $cApiUser->get("valid_from") != '')) { + $mlist->setTitle($iMenu, ''.$cApiUser->get("username")."
    ".$cApiUser->get("realname").'
    '); + } else { + $mlist->setTitle($iMenu, $cApiUser->get("username")."
    ".$cApiUser->get("realname")); + } + + $mlist->setLink($iMenu, $link); + $mlist->setActions($iMenu, "delete", $deletebutton); + + if ($_GET['userid'] == $cApiUser->get("user_id")) { + $mlist->setExtra($iMenu, 'id="marked" '); + } + } + } + +} + +$deleteScript = ''; + +$markActiveScript = ''; + // +$oPage->setMargin(0); +$oPage->addScript('rowMark.js', ''); +$oPage->addScript('parameterCollector.js', ''); +$oPage->addScript('messagebox', ''); +$oPage->addScript('delete', $deleteScript); +$oPage->setContent($mlist->render(false).$markActiveScript); + +//generate current content for Object Pager +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("elemperpage", $elemperpage); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("frame", $frame); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +$pagerID="pager"; +$oPager = new cObjectPager("44b41691-0dd4-443c-a594-66a8164e25fd", $iItemCount, $elemperpage, $page, $oPagerLink, "page", $pagerID); + + +//add slashes, to insert in javascript +$sPagerContent = $oPager->render(1); +$sPagerContent = str_replace('\\', '\\\\', $sPagerContent); +$sPagerContent = str_replace('\'', '\\\'', $sPagerContent); + +//send new object pager to left_top +$sRefreshPager = ' + '; +$oPage->addScript('refreshpager', $sRefreshPager); + +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.rights_overview.php b/conlite/includes/include.rights_overview.php new file mode 100644 index 0000000..536a668 --- /dev/null +++ b/conlite/includes/include.rights_overview.php @@ -0,0 +1,467 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-30 + * modified 2008-06-24, Timo Trautmann, storage for valid from valid to added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-08-26, Timo Trautmann - fixed CON-200 - User can only get lang rights, if he has client access + * modified 2008-10-??, Bilal Arslan - direct DB user modifications are now encapsulated in new ConUser class + * modified 2008-11-17, Holger Librenz - method calls for new user object modified, comments updated + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2011-02-07, Murat Purc, Cleanup, optimization and formatting + * + * $Id: include.rights_overview.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + * TODO error handling!!! + * TODO export functions to new ConUser object! + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude('includes', 'functions.rights.php'); + + +if (!($perm->have_perm_area_action($area, $action) || $perm->have_perm_area_action('user', $action))) { + // access denied + $notification->displayNotification("error", i18n("Permission denied")); + return; +} + +if (!isset($userid)) { + // no user id, get out here + return; +} + +$aPerms = array(); +$bError = false; +$sNotification = ''; + +// delete user +if ($action == 'user_delete') { + $oUsers = new Users(); + $oUsers->deleteUserByID($userid); + + $sql = "DELETE FROM " . $cfg["tab"]["groupmembers"] + . " WHERE user_id = '" . Contenido_Security::escapeDB($userid, $db) . "'"; + $db->query($sql); + + $sql = "DELETE FROM " . $cfg["tab"]["rights"] + ." WHERE user_id = '" . Contenido_Security::escapeDB($userid, $db) . "'"; + $db->query($sql); + + $sNotification = $notification->displayNotification("info", i18n("User deleted")); + $sTemplate = ' + + + + + + + +{NOTIFICATION} + + + '; + + $tpl->reset(); + $tpl->set('s', 'NOTIFICATION', $sNotification); + $tpl->generate($sTemplate); + return; +} + +// edit user +if ($action == 'user_edit') { + $aPerms = buildUserOrGroupPermsFromRequest(); + + // update user values + // New Class User, update password and other values + $oConUser = new ConUser($cfg, $db); + $oConUser->setUserId($userid); + $oConUser->setRealName($realname); + $oConUser->setMail($email); + $oConUser->setTelNumber($telephone); + $oConUser->setAddressData($address_street, $address_city, $address_zip, $address_country); + $oConUser->setUseTiny($wysi); + $oConUser->setValidDateFrom($valid_from); + $oConUser->setValidDateTo($valid_to); + $oConUser->setPerms($aPerms); + + // is a password set? + $bPassOk = false; + if (strlen($password) > 0) { + // yes --> check it... + if (strcmp($password, $passwordagain) == 0) { + // set password.... + $iPasswordSaveResult = $oConUser->setPassword($password); + + // fine, passwords are the same, but is the password valid? + if ($iPasswordSaveResult != iConUser::PASS_OK) { + // oh oh, password is NOT valid. check it... + $sPassError = ConUser::getErrorString($iPasswordSaveResult, $cfg); + $sNotification = $notification->returnNotification("error", $sPassError); + $bError = true; + } else { + $bPassOk = true; + } + } else { + $sNotification = $notification->returnNotification("error", i18n("Passwords don't match")); + $bError = true; + } + } + + if (strlen($password) == 0 || $bPassOk == true) { + try { + // save, if no error occured.. + if ($oConUser->save()) { + $sNotification = $notification->returnNotification("info", i18n("Changes saved")); + $bError = true; + } else { + $sNotification = $notification->returnNotification("error", i18n("An error occured while saving user info.")); + $bError = true; + } + } catch (ConUserException $cue) { + // TODO make check and info ouput better! + $sNotification = $notification->returnNotification("error", i18n("An error occured while saving user info.")); + $bError = true; + } + } +} + + +// TODO port this to new ConUser class! +$oUser = new User(); +$oUser->loadUserByUserID(Contenido_Security::escapeDB($userid, $db)); + +// delete user property +if (is_string($del_userprop_type) && is_string($del_userprop_name)) { + $oUser->deleteUserProperty($del_userprop_type, $del_userprop_name); +} + +// edit user property +if (is_string($userprop_type) && is_string($userprop_name) && is_string($userprop_value) + && !empty($userprop_type) && !empty($userprop_name)) { + $oUser->setUserProperty($userprop_type, $userprop_name, $userprop_value); +} + +if (count($aPerms) == 0 || $action == '' || !isset($action)) { + $aPerms = explode(',', $oUser->getField('perms')); +} + + +$tpl->reset(); +$tpl->set('s','SID', $sess->id); +$tpl->set('s','NOTIFICATION', $sNotification); + +$form = '
    + '.$sess->hidden_session(true).' + + + + + '; + +$tpl->set('s', 'FORM', $form); +$tpl->set('s', 'GET_USERID', $userid); +$tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('s', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('s', 'SUBMITTEXT', i18n("Save changes")); +$tpl->set('s', 'CANCELTEXT', i18n("Discard changes")); +$tpl->set('s', 'CANCELLINK', $sess->url("main.php?area=$area&frame=4&userid=$userid")); + + +$tpl->set('d', 'CATNAME', i18n("Property")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_header"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', i18n("Value")); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Username")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', $oUser->getField('username').''); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Name")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField("text", "realname", $oUser->getField('realname'), 40, 255)); +$tpl->next(); + +// @since 2006-07-04 Display password fields only if not authenticated via LDAP/AD +if ($msysadmin || $oUser->getField('password') != 'active_directory_auth') { + $tpl->set('d', 'CATNAME', i18n("New password")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField('password', 'password', '', 40, 255)); + $tpl->next(); + + $tpl->set('d', 'CATNAME', i18n("Confirm new password")); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'CATFIELD', formGenerateField('password', 'passwordagain', '', 40, 255)); + $tpl->next(); +} + +$tpl->set('d', 'CATNAME', i18n("E-Mail")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'email', $oUser->getField('email'), 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Phone number")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'telephone', $oUser->getField('telephone'), 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Street")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_street', $oUser->getField('address_street'), 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("ZIP code")); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_zip', $oUser->getField('address_zip'), 10, 10)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("City")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_city', $oUser->getField('address_city'), 40, 255)); +$tpl->next(); + +$tpl->set('d', 'CATNAME', i18n("Country")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', formGenerateField('text', 'address_country', $oUser->getField('address_country'), 40, 255)); +$tpl->next(); + +// permissions of current logged in user +$aAuthPerms = explode(',', $auth->auth['perm']); + +// sysadmin perm +if (in_array('sysadmin', $aAuthPerms)) { + $tpl->set('d', 'CATNAME', i18n("System administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', formGenerateCheckbox('msysadmin', '1', in_array('sysadmin', $aPerms))); + $tpl->next(); +} + +// clients admin perms +$oClientsCollection = new cApiClientCollection(); +$aClients = $oClientsCollection->getAvailableClients(); +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if (in_array("admin[".$idclient."]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms)){ + $sClientCheckboxes .= formGenerateCheckbox("madmin[".$idclient."]", $idclient, in_array("admin[".$idclient."]", $aPerms), $item['name']." (".$idclient.")")."
    "; + } +} + +if ($sClientCheckboxes !== '' && !in_array('sysadmin', $aPerms)) { + $tpl->set('d', 'CATNAME', i18n("Administrator")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// clients perms +$sClientCheckboxes = ''; +foreach ($aClients as $idclient => $item) { + if ((in_array("client[".$idclient."]", $aAuthPerms) || in_array('sysadmin', $aAuthPerms) || in_array("admin[".$idclient."]", $aAuthPerms)) && !in_array("admin[".$idclient."]", $aPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("mclient[".$idclient."]", $idclient, in_array("client[".$idclient."]", $aPerms), $item['name']." (". $idclient . ")")."
    "; + } +} + +if ($sClientCheckboxes !== '' && !in_array('sysadmin', $aPerms)) { + $tpl->set('d', 'CATNAME', i18n("Access clients")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + +// languages perms +$aClientsLanguages = getAllClientsAndLanguages(); +$sClientCheckboxes = ''; +foreach ($aClientsLanguages as $item) { + if (($perm->have_perm_client("lang[".$item['idlang']."]") || $perm->have_perm_client("admin[".$item['idclient']."]")) && !in_array("admin[".$item['idclient']."]", $aPerms)) { + $sClientCheckboxes .= formGenerateCheckbox("mlang[".$item['idlang']."]", $item['idlang'], in_array("lang[".$item['idlang']."]", $aPerms), $item['langname']." (". $item['clientname'] .")") ."
    "; + } +} + +if ($sClientCheckboxes != '' && !in_array('sysadmin', $aPerms)) { + $tpl->set('d', 'CATNAME', i18n("Access languages")); + $tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); + $tpl->set('d', 'CATFIELD', $sClientCheckboxes); + $tpl->next(); +} + + +// user properties +$aProperties = $oUser->getUserProperties(); +$sPropRows = ''; +foreach ($aProperties as $entry) { + $type = $entry['type']; + if ($type != 'system') { + $name = $entry['name']; + $value = $entry['value']; + $sPropRows .= ' + + ' . $type . ' + ' . $name . ' + ' . $value . ' + + Eigenschaft l�schen + + '; + } +} +$table = ' + + + + + + + + ' . $sPropRows . ' + + + + + + +
    '.i18n("Area/Type").''.i18n("Property").''.i18n("Value").' 
     
    '; + +$tpl->set('d', 'CATNAME', i18n("User-defined properties")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', $table); +$tpl->next(); + +// wysiwyg +$tpl->set('d', 'CATNAME', i18n("Use WYSIWYG-Editor")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', formGenerateCheckbox('wysi', '1', $oUser->getField('wysi'))); +$tpl->next(); + +// account active data (from-to) +$sCurrentValueFrom = str_replace('00:00:00', '', $oUser->getField('valid_from')); +$sCurrentValueFrom = trim(str_replace('0000-00-00', '', $sCurrentValueFrom)); + +$sInputValidFrom = ' + + + '; +$sInputValidFrom .= ' '; +$sInputValidFrom .= ''; + +$tpl->set('d', 'CATNAME', i18n("Valid from")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', $sInputValidFrom); +$tpl->next(); + +$sCurrentValueTo = str_replace('00:00:00', '', $oUser->getField('valid_to')); +$sCurrentValueTo = trim(str_replace('0000-00-00', '', $sCurrentValueTo)); + +$sInputValidTo = ' '; +$sInputValidTo .= ''; + +$tpl->set('d', 'CATNAME', i18n("Valid to")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_light"]); +$tpl->set('d', 'CATFIELD', $sInputValidTo); +$tpl->next(); + +// account active or not +if ($sCurrentValueFrom == '') { + $sCurrentValueFrom = '0000-00-00'; +} + +if (($sCurrentValueTo == '') || ($sCurrentValueTo == '0000-00-00')) { + $sCurrentValueTo = '9999-99-99'; +} + +$sCurrentDate = date('Y-m-d'); + +if (($sCurrentValueFrom > $sCurrentDate) || ($sCurrentValueTo < $sCurrentDate)) { + $sAccountState = i18n("This account is currently inactive."); + $sAccountColor = 'red'; +} else { + $sAccountState = i18n("This account is currently active."); + $sAccountColor = 'green'; +} + +$tpl->set('d', 'CATNAME', ' '); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', ''.$sAccountState.''); +$tpl->next(); + +// Show backend user's group memberships +$aGroups = $oUser->getGroupsByUserID($userid); +if (count($aGroups) > 0) { + asort($aGroups); + $sGroups = implode("
    ", $aGroups); +} else { + $sGroups = i18n("none"); +} + +$tpl->set('d', 'CATNAME', i18n("Group membership")); +$tpl->set('d', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$tpl->set('d', 'BGCOLOR', $cfg["color"]["table_dark"]); +$tpl->set('d', 'CATFIELD', $sGroups); +$tpl->next(); + +// Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['rights_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.stat_left_top.php b/conlite/includes/include.stat_left_top.php new file mode 100644 index 0000000..2d633a9 --- /dev/null +++ b/conlite/includes/include.stat_left_top.php @@ -0,0 +1,36 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-29 + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.stat_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['stat_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.stat_menu.php b/conlite/includes/include.stat_menu.php new file mode 100644 index 0000000..2e6e4a7 --- /dev/null +++ b/conlite/includes/include.stat_menu.php @@ -0,0 +1,98 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-23 + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.stat_menu.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); + +$currentLink = ''.i18n("Current Report").''; + +$availableYears = statGetAvailableYears($client,$lang); + +// Title +$bgcolor = "#FFFFFF"; +$tpl->set('s', 'OVERVIEWBGCOLOR', $cfg["color"]["table_header"]); +$tpl->set('s', 'PADDING_LEFT', '17'); +$tpl->set('s', 'OVERVIEWTEXT', "".i18n("Statistics Overview").""); + +// Current Statistic +$bgcolor = $cfg["color"]["table_light"]; +$tpl->set('s', 'CURRENTBGCOLOR', $bgcolor); +$tpl->set('s', 'CURRENTTEXT', $currentLink); +$tpl->set('s', 'PADDING_LEFT', '17'); + +// Empty Row +$bgcolor = '#FFFFFF'; +$tpl->set('s', 'ARCHIVEBGCOLOR', $cfg["color"]["table_header"]); +$tpl->set('s', 'ARCHIVETEXT', ''.i18n("Archived Statistics").''); +$tpl->set('s', 'PADDING_LEFT', '17'); + +foreach ($availableYears as $yearIterator) +{ + //$yearLink = function statsOverviewYear($year) + $dark = !$dark; + $yearLink = ''."$yearIterator".''; + if ($dark) { + $bgcolor = $cfg["color"]["table_dark"]; + } else { + $bgcolor = $cfg["color"]["table_light"]; + } + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'TEXT', $yearLink); + $tpl->set('d', 'PADDING_LEFT', '17'); + $tpl->next(); + + $availableMonths = statGetAvailableMonths($yearIterator,$client,$lang); + + foreach ($availableMonths as $monthIterator) + { + $monthCanonical = statReturnCanonicalMonth($monthIterator); + $monthLink = ''."$monthCanonical".''; + + $dark = !$dark; + + if ($dark) { + $bgcolor = $cfg["color"]["table_dark"]; + } else { + $bgcolor = $cfg["color"]["table_light"]; + } + + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'TEXT', $monthLink); + $tpl->set('d', 'PADDING_LEFT', '20'); + $tpl->next(); + } +} + +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['stat_menu']); +?> \ No newline at end of file diff --git a/conlite/includes/include.stat_overview.php b/conlite/includes/include.stat_overview.php new file mode 100644 index 0000000..3f1726f --- /dev/null +++ b/conlite/includes/include.stat_overview.php @@ -0,0 +1,147 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-29 + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.stat_overview.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); + +if ($action == "stat_show") +{ + if (strlen($yearmonth) < 4) + { + $yearmonth = "current"; + } + + switch ($displaytype) + { + case "all": + $stattype = i18n("Full statistics"); + break; + case "top10": + $stattype = i18n("Top 10"); + break; + case "top20": + $stattype = i18n("Top 20"); + break; + case "top30": + $stattype = i18n("Top 30"); + break; + default: + $displaytype = "all"; + $stattype = i18n("Full statistics"); + break; + } + + $tpl->set('s', 'SELF_URL', $sess->url("main.php?area=stat&frame=4&idcat=$idcat")); + if ($showYear == 1) + { + $tpl->set('s', 'DROPDOWN', statDisplayYearlyTopChooser($displaytype)); + $tpl->set('s', 'YEARMONTH', '
    '); + } else { + $tpl->set('s', 'DROPDOWN', statDisplayTopChooser($displaytype)); + $tpl->set('s', 'YEARMONTH', '
    '); + } + + if ($showYear == 1) + { + $tpl->set('s', 'STATTITLE', i18n("Yearly").' '.$stattype . " " .$year); + } else { + if (strcmp($yearmonth,"current")==0) + { + $tpl->set('s', 'STATTITLE', i18n("Current"). ' '.$stattype); + } else { + $tpl->set('s', 'STATTITLE', $stattype." ".statReturnCanonicalMonth(substr($yearmonth, 4,2)).' '.substr($yearmonth,0,4)); + } + } + + $tpl->set('s', 'BGCOLOR', '#FFFFFF'); + $tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); + $tpl->set('s', 'TITLEBGCOLOR', $cfg["color"]["table_header"]); + $tpl->set('s', 'TITLETEXT', i18n("Title")); + $tpl->set('s', 'TITLESTATUS', i18n("Status")); + $tpl->set('s', 'TITLENUMBEROFARTICLES', i18n("Number of articles")); + $tpl->set('s', 'TITLETOTAL',i18n("Hits")); + $tpl->set('s', 'TITLEPADDING_LEFT',"5"); + $tpl->set('s', 'TITLEINTHISLANGUAGE', i18n("Hits in this language")); + + switch ($displaytype) + { + case "all": + default: + if ($showYear == 1) + { + statsOverviewYear($year); + } else { + statsOverviewAll($yearmonth); + } + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['stat_overview']); + break; + + case "top10": + if ($showYear == 1) + { + statsOverviewTopYear($year,10); + }else { + statsOverviewTop($yearmonth,10); + } + + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['stat_top']); + break; + + case "top20": + if ($showYear == 1) + { + statsOverviewTopYear($year,20); + }else { + statsOverviewTop($yearmonth,20); + } + + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['stat_top']); + break; + + case "top30": + if ($showYear == 1) + { + statsOverviewTopYear($year,30); + }else { + statsOverviewTop($yearmonth,30); + } + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['stat_top']); + break; + } + +} else { + $tpl->reset(); + $tpl->set('s', 'CONTENTS', ''); + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['blank']); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.str_overview.php b/conlite/includes/include.str_overview.php new file mode 100644 index 0000000..50ce455 --- /dev/null +++ b/conlite/includes/include.str_overview.php @@ -0,0 +1,1002 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-28 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2009-10-14, Dominik Ziegler - added some functionality for "cancel moving tree" + * modified 2009-10-15, Dominik Ziegler - removed unnecessary database query for selecting the level (level is already available) + * modified 2010-01-30, Ingo van Peeren, some optimization of the amount of db queries for template names and descriptions, see [CON-301] + * removed use of deprecated methods of class.template.php, see [CON-302] + * modified 2010-02-06, Ingo van Peeren, fixed small bug added by last modification + * + * $Id: include.str_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$debug = false; + +$tmp_area = "str"; + +if ($action == "str_duplicate" && + ($perm->have_perm_area_action("str", "str_duplicate") || + $perm->have_perm_area_action_item("str", "str_duplicate", $idcat))) +{ + strCopyTree($idcat, $parentid); +} + +//Everybody is allowed to update aliases, if there is no Permission to update category names, this block updates category alias only +if(isset($_POST['newcategoryalias']) && isset($_POST['action']) && $_POST['action'] == 'str_renamecat') { + $iIdCat = (int) $_POST['idcat']; + if(!($perm->have_perm_area_action($tmp_area, "str_renamecat") || $perm->have_perm_area_action_item($tmp_area, "str_renamecat", $iIdCat)) ) { + if (trim($_POST['newcategoryalias']) != '') { + $sUrlName = capiStrCleanURLCharacters($_POST['newcategoryalias']); + $sql = "UPDATE {$cfg['tab']['cat_lang']} SET urlname = '". Contenido_Security::escapeDB($sUrlName, $db) ."' WHERE idcat = '".Contenido_Security::toInteger($iIdCat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + } else { + //Use categoryname as default -> get it escape it save it as urlname + $sql = "SELECT name from {$cfg['tab']['cat_lang']} WHERE idcat = '".Contenido_Security::toInteger($iIdCat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + if ($db->next_record()) { + $sUrlName = capiStrCleanURLCharacters($db->f('name')); + $sql = "UPDATE {$cfg['tab']['cat_lang']} SET urlname = '". $sUrlName ."' WHERE idcat = '".Contenido_Security::toInteger($iIdCat)."' AND idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + $lang = Contenido_Security::escapeDB($lang, null); + @unlink($cfgClient[$client]["path"]["frontend"]."cache/locationstring-url-cache-$lang.txt"); + } + } + } +} + + +$oDirectionDb = new DB_ConLite(); + +/** + * Build a Category select Box containg all categories which user is allowed to create new categories + * + * @return String HTML + */ +function buildCategorySelectRights() { + global $cfg, $client, $lang, $idcat, $perm, $tmp_area; + + $db = new DB_ConLite(); + + $oHtmlSelect = new cHTMLSelectElement ('idcat', "", "new_idcat"); + + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Please choose"), '', true); + $oHtmlSelect->addOptionElement(0, $oHtmlSelectOption); + + + $sql = "SELECT a.idcat AS idcat, b.name AS name, c.level FROM + ".$cfg["tab"]["cat"]." AS a, ".$cfg["tab"]["cat_lang"]." AS b, + ".$cfg["tab"]["cat_tree"]." AS c WHERE a.idclient = '".Contenido_Security::toInteger($client)."' + AND b.idlang = '".Contenido_Security::toInteger($lang)."' AND b.idcat = a.idcat AND c.idcat = a.idcat + ORDER BY c.idtree"; + + $db->query($sql); + + $categories = array (); + + while ($db->next_record()) + { + $categories[$db->f("idcat")]["name"] = $db->f("name"); + $categories[$db->f("idcat")]["idcat"] = $db->f("idcat"); + + if ($perm->have_perm_area_action($tmp_area, "str_newcat") || $perm->have_perm_area_action_item($tmp_area, "str_newcat", $db->f("idcat"))) { + $categories[$db->f("idcat")]["perm"] = 1; + } else { + $categories[$db->f("idcat")]["perm"] = 0; + } + + $categories[$db->f("idcat")]["level"] = $db->f("level"); + } + + $aCategoriesReversed = array_reverse($categories); + + $iLevel = 0; + foreach ($aCategoriesReversed as $iKeyIdCat => $aValues) { + if ($aValues['level'] > $iLevel && $aValues['perm']) { + $iLevel = $aValues['level']; + } else if ($aValues['level'] < $iLevel) { + $iLevel = $aValues['level']; + } else { + if (!$aValues['perm']) { + unset($categories[$aValues["idcat"]]); + } + } + } + + $j = 1; + foreach ($categories as $tmpidcat => $props) + { + $spaces = "  "; + + for ($i = 0; $i < $props["level"]; $i ++) + { + $spaces .= "     "; + } + + $sCategoryname = clHtmlSpecialChars($props["name"]); + $sCategoryname = capiStrTrimHard($sCategoryname, 30); + $oHtmlSelectOption = new cHTMLOptionElement($spaces.">".$sCategoryname, $tmpidcat, false, !$props["perm"]); + $oHtmlSelect->addOptionElement($j, $oHtmlSelectOption); + $j++; + } + + return $oHtmlSelect->toHtml(); +} + +function getExpandCollapseButton ($item, $catName) +{ + global $sess, $PHP_SELF, $frame, $area; + $selflink = "main.php"; + + $img = new cHTMLImage; + $img->updateAttributes(array ("style" => "padding:4px;")); + + + if (count($item->subitems) > 0) + { + if ($item->collapsed == true) + { + $expandlink = $sess->url($selflink . "?area=$area&frame=$frame&expand=". $item->id); + + $img->setSrc($item->collapsed_icon); + $img->setAlt(i18n("Open category")); + return (''.$img->render().' '.''.$catName.''); + } else { + $collapselink = $sess->url($selflink . "?area=$area&frame=$frame&collapse=". $item->id); + $img->setSrc($item->expanded_icon); + $img->setAlt(i18n("Close category")); + + return(''.$img->render().' '.''.$catName.''); + } + } else { + return ' '.$catName; + } +} + +function getTemplateSelect() { + global $client, $cfg, $db; + + $oHtmlSelect = new cHTMLSelectElement ('cat_template_select', "", "cat_template_select"); + + $oHtmlSelectOption = new cHTMLOptionElement('--- '.i18n("none"). ' ---', 0, false); + $oHtmlSelect->addOptionElement(0, $oHtmlSelectOption); + + $sql = "SELECT + idtpl, + name, defaulttemplate + FROM + ".$cfg['tab']['tpl']." + WHERE + idclient = '".$client."' + ORDER BY + name"; + + $i = 1; + if ($db->query($sql)) { + while ($db->next_record()) { + $bDefaultTemplate = $db->f('defaulttemplate'); + $oHtmlSelectOption = new cHTMLOptionElement($db->f('name'), $db->f('idtpl'), $bDefaultTemplate); + $oHtmlSelect->addOptionElement($i, $oHtmlSelectOption); + $i++; + } + } + + return $oHtmlSelect->toHtml(); +} + +getTemplateSelect(); + +$sess->register("remakeStrTable"); +$sess->register("StrTableClient"); +$sess->register("StrTableLang"); + +$cancel = $sess->url("main.php?area=$area&frame=$frame"); + +if (isset($force) && $force == 1) { + $remakeStrTable = true; +} + +if ($StrTableClient != $client) +{ + unset($expandedList); + $remakeStrTable = true; +} + +if ($StrTableLang != $lang) +{ + unset($expandedList); + $remakeStrTable = true; +} + +$StrTableClient = $client; +$StrTableLang = $lang; + +if (!isset($idcat) ) $idcat = 0; +if (!isset($action) ) $action = 0; + +function buildTree (&$rootItem, &$items) +{ + global $nextItem, $perm, $tmp_area; + + while ($item_list = each($items)) + { + list($key, $item) = $item_list; + + unset($newItem); + + $bCheck = false; + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_newtree"); } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_newcat"); } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_makevisible");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_makepublic");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_deletecat");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_moveupcat");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_movedowncat");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_movesubtree");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_renamecat");} + if (!$bCheck) { $bCheck = $perm->have_perm_area_action("str_tplcfg", "str_tplcfg");} + if (!$bCheck) { $bCheck = $perm->have_perm_item($tmp_area, $item['idcat']);} + + if ($bCheck) { + $newItem = new TreeItem($item['name'], $item['idcat'], true); + } else { + $newItem = new TreeItem($item['name'], $item['idcat'], false); + } + + $newItem->collapsed_icon = 'images/open_all.gif'; + $newItem->expanded_icon = 'images/close_all.gif'; + $newItem->custom['idtree'] = $item['idtree']; + $newItem->custom['level'] = $item['level']; + $newItem->custom['idcat'] = $item['idcat']; + $newItem->custom['idtree'] = $item['idtree']; + $newItem->custom['parentid'] = $item['parentid']; + $newItem->custom['alias'] = $item['alias']; + $newItem->custom['preid'] = $item['preid']; + $newItem->custom['postid'] = $item['postid']; + $newItem->custom['visible'] = $item['visible']; + $newItem->custom['idtplcfg'] = $item['idtplcfg']; + $newItem->custom['public'] = $item['public']; + + if ($perm->have_perm_item("str", $item['idcat'])) + { + $newItem->custom['forcedisplay'] = 1; + } + + if (array_key_exists($key+1, $items)) + { + $nextItem = $items[$key+1]; + } else { + $nextItem = 0; + } + + if (array_key_exists($key-1, $items)) + { + $lastItem = $items[$key-1]; + } else { + $lastItem = 0; + } + + $rootItem->addItem($newItem); + + if ($nextItem['level'] > $item['level']) + { + $oldRoot = $rootItem; + buildTree($newItem, $items); + $rootItem = $oldRoot; + } + + if ($nextItem['level'] < $item['level']) + { + return; + } + } + +} + +if ( $perm->have_perm_area_action($area) ) { + + $sql = "SELECT + idtree, A.idcat, level, name, parentid, preid, postid, visible, public, idtplcfg, C.urlname as alias + FROM + ".$cfg["tab"]["cat_tree"]." AS A, + ".$cfg["tab"]["cat"]." AS B, + ".$cfg["tab"]["cat_lang"]." AS C + WHERE + A.idcat = B.idcat AND + B.idcat = C.idcat AND + C.idlang = '".Contenido_Security::toInteger($lang)."' AND + B.idclient = '".Contenido_Security::toInteger($client)."' + ORDER BY + idtree"; + + # Debug info + if ( $debug ) { + + echo "
    ";
    +        echo $sql;
    +        echo "
    "; + + } + + $db->query($sql); + + $bIgnore = false; + $iIgnoreLevel = 0; + + $items = array(); + while ($db->next_record()) + { + $bSkip = false; + + if ($bIgnore == true && $iIgnoreLevel >= $db->f("level")) { + $bIgnore = false; + } + + if ($db->f("idcat") == $movesubtreeidcat) { + $bIgnore = true; + $iIgnoreLevel = $db->f("level"); + $sMoveSubtreeCatName = $db->f("name"); + } + + if ($iCurLevel == $db->f("level")) { + if ($iCurParent != $db->f("parentid")) { + $bSkip = true; + } + } else { + $iCurLevel = $db->f("level"); + $iCurParent = $db->f("parentid"); + } + + if ($bIgnore == false && $bSkip == false) { + $entry = array(); + $entry['idtree'] = $db->f("idtree"); + $entry['idcat'] = $db->f("idcat"); + $entry['level'] = $db->f("level"); + $entry['name'] = htmldecode($db->f("name")); + $entry['alias'] = htmldecode($db->f("alias")); + $entry['parentid'] = $db->f("parentid"); + $entry['preid'] = $db->f("preid"); + $entry['postid'] = $db->f("postid"); + $entry['visible'] = $db->f("visible"); + $entry['public'] = $db->f("public"); + $entry['idtplcfg'] = $db->f("idtplcfg"); + + array_push($items, $entry); + } + } + + $rootStrItem = new TreeItem("root",-1); + $rootStrItem->collapsed_icon = 'images/open_all.gif'; + $rootStrItem->expanded_icon = 'images/close_all.gif'; + + buildTree($rootStrItem, $items); + + $expandedList = unserialize($currentuser->getUserProperty("system","cat_expandstate")); + + if (is_array($expandedList)) + { + $rootStrItem->markExpanded($expandedList); + } + + if (isset($collapse) && is_numeric($collapse)) + { + $rootStrItem->markCollapsed($collapse); + } + + if (isset($expand) && is_numeric($expand)) + { + $rootStrItem->markExpanded($expand); + } + + if (isset($expand) && $expand == "all") + { + $rootStrItem->expandAll(-1); + } + + if (isset($collapse) && $collapse == "all") + { + $rootStrItem->collapseAll(-1); + } + + if ($action === "str_newcat") + { + $rootStrItem->markExpanded($idcat); + } + + $expandedList = Array(); + $objects = array(); + + $rootStrItem->traverse($objects); + + $rootStrItem->getExpandedList($expandedList); + $currentuser->setUserProperty("system","cat_expandstate", serialize($expandedList)); + + # Reset Template + $tpl->reset(); + $tpl->set('s', 'SID', $sess->id); + $tpl->set('s', 'AREA', $area); + $tpl->set('s', 'FRAME', $frame); + + $_cecIterator = $_cecRegistry->getIterator("Contenido.CategoryList.Columns"); + + $listColumns = array(); + if ($_cecIterator->count() > 0) + { + + while ($chainEntry = $_cecIterator->next()) + { + $tmplistColumns = $chainEntry->execute(array()); + + if (is_array($tmplistColumns)) + { + $listColumns = array_merge($listColumns, $tmplistColumns); + } + } + + + foreach ($listColumns as $content) + { + // Header for additional columns + $additionalheaders[] = ''.$content.''; + } + + $additionalheader = implode("", $additionalheaders); + } else { + $additionalheader = ""; + } + + $tpl->set('s', 'ADDITIONALHEADERS', $additionalheader); + + // We don't want to show our root + unset($objects[0]); + + $selflink = "main.php"; + $expandlink = $sess->url($selflink . "?area=$area&frame=$frame&expand=all&syncoptions=$syncoptions"); + $collapselink = $sess->url($selflink . "?area=$area&frame=$frame&collapse=all&syncoptions=$syncoptions"); + $collapseimg = + ' +  '.i18n("Close all categories"). + ''; + $expandimg = + ' +  '.i18n("Open all categories"). + ''; + + + $tpl->set('s', 'COLLAPSE_ALL', $collapseimg); + $tpl->set('s', 'EXPAND_ALL', $expandimg); + $sMouseover = 'onmouseover="str.over(this)" onmouseout="str.out(this)" onclick="str.click(this)"'; + + //Fill inline edit table row + $tpl->set('s', 'SUM_COLUMNS_EDIT', 14+count($listColumns)); + $tpl->set('s', 'ACTION_EDIT_URL', $sess->url("main.php?frame=$frame")); + $tpl->set('s', 'SRC_CANCEL', $cfg["path"]["contenido_fullhtml"].$cfg["path"]["images"].'but_cancel.gif'); + $tpl->set('s', 'SRC_OK', $cfg["path"]["contenido_fullhtml"].$cfg["path"]["images"].'but_ok.gif'); + $tpl->set('s', 'HREF_CANCEL', "javascript:handleInlineEdit(0)"); + $tpl->set('s', 'LABEL_ALIAS_NAME', i18n('Alias')); + $tpl->set('s', 'TEMPLATE_URL', $sess->url("main.php?area=str_tplcfg&frame=$frame")); + $message = addslashes(i18n("Do you really want to duplicate the following category:

    %s

    Notice: The duplicate process can take up to several minutes, depending on how many subitems and articles you've got.")); + $tpl->set('s', 'DUPLICATE_MESSAGE', $message); + $tpl->set('s', 'DELETE_MESSAGE', i18n("Do you really want to delete the following category:

    %s")); + + $bAreaAddNewCategory = false; + + $aInlineEditData = array(); + + $sql = "SELECT + idtplcfg, idtpl + FROM + ".$cfg["tab"]["tpl_conf"]; + $db->query($sql); + $aTplconfigs = array(); + while ($db->next_record()) { + $aTplconfigs[$db->f('idtplcfg')] = $db->f('idtpl'); + } + + $sql = "SELECT + name, description, idtpl + FROM + ".$cfg["tab"]["tpl"]; + + $db->query($sql); + $aTemplates = array(); + while ($db->next_record()) { + $aTemplates[$db->f('idtpl')] = array( + 'name' => $db->f('name'), + 'description' => $db->f('description') + ); + } + + foreach ($objects as $key=>$value) { + // check if there area any permission for this $idcat in the mainarea 6 (=str) and there subareas + $bCheck = false; + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_newtree"); } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_newcat") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_makevisible"); } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_makepublic") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_deletecat") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_moveupcat") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_movedowncat") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_movesubtree") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action($tmp_area, "str_renamecat") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_area_action("str_tplcfg", "str_tplcfg") ; } + if (!$bCheck) { $bCheck = $perm->have_perm_item($tmp_area, $value->id) ; } + if (!$bCheck) { $bCheck = $value->isCustomAttributeSet("forcedisplay") ; } + + if ($bCheck) { + + //Insert empty row + if ( $value->custom['level'] == 0 && $value->custom['preid'] != 0 ) { + + $tpl->set('d', 'BGCOLOR', '#FFFFFF'); + $tpl->set('d', 'BGCOLOR_EDIT', '#F1F1F1'); + $tpl->set('d', 'ALIAS', ' '); + $tpl->set('d', 'INDENT', '3px'); + $tpl->set('d', 'RENAMEBUTTON', ' '); + $tpl->set('d', 'NEWCATEGORYBUTTON', ' '); + $tpl->set('d', 'VISIBLEBUTTON', ' '); + $tpl->set('d', 'PUBLICBUTTON', ' '); + $tpl->set('d', 'DELETEBUTTON', ' '); + $tpl->set('d', 'UPBUTTON', ' '); + $tpl->set('d', 'COLLAPSE_CATEGORY_NAME', ' '); + $tpl->set('d', 'TPLNAME', ' '); + $tpl->set('d', 'MOVEBUTTON', ' '); + $tpl->set('d', 'DOWNBUTTON', ' '); + $tpl->set('d', 'SHOW_MOUSEOVER', ''); + $tpl->set('d', 'SHOW_MOUSEOVER_ALIAS', ''); + $tpl->set('d', 'SHOW_MOUSEOVER_CATEGORY', ''); + $tpl->set('d', 'TPLDESC', ''); + $tpl->set('d', 'DUPLICATEBUTTON', ' '); + $tpl->set('d', 'TEMPLATEBUTTON', ' '); + $tpl->set('d', 'MOUSEOVER', ''); + $tpl->set('d', 'SUM_COLUMNS_EDIT', 14+count($listColumns)); + $tpl->set('d', 'CATID', ''); + $tpl->set('d', 'ACTION_EDIT_URL', ''); + $tpl->set('d', 'INPUT_CATEGORY', ''); + $tpl->set('d', 'LABEL_ALIAS_NAME', ''); + $tpl->set('d', 'HREF_CANCEL', ''); + $tpl->set('d', 'SRC_CANCEL', ''); + $tpl->set('d', 'DIRECTION', ''); + $tpl->set('d', 'SRC_OK', ''); + $tpl->set('d', 'VALUE_ALIAS_NAME', ''); + $tpl->set('d', 'HEIGTH', 'height:5px;'); + $tpl->set('d', 'BORDER_CLASS', 'str-style-b'); + + $additionalColumns = array(); + + foreach ($listColumns as $content) + { + // Content rows + $additionalColumns[] = ' '; + } + $tpl->set('d', 'ADDITIONALCOLUMNS', implode("", $additionalColumns)); + $tpl->next(); + } + + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'BGCOLOR_EDIT', '#F1F1F1'); + $tpl->set('d', 'HEIGTH', 'height:25px'); + $tpl->set('d', 'BORDER_CLASS', 'str-style-c'); + + $spaces = ""; + + $tpl->set('d', 'INDENT', ($value->custom['level'] * 16) . "px"); + $sCategoryname = $value->name; + if (strlen($value->name) > 30) { + $sCategoryname = capiStrTrimHard($sCategoryname, 30); + } + + //$tpl->set('d', 'CATEGORY', $sCategoryname); + if (strlen($value->name) > 30) { + $tpl->set('d', 'SHOW_MOUSEOVER_CATEGORY', 'onmouseover="Tip(\''.$value->name.'\', BALLOON, true, ABOVE, true);"'); + } else { + $tpl->set('d', 'SHOW_MOUSEOVER_CATEGORY', ''); + } + + $tpl->set('d', 'COLLAPSE_CATEGORY_NAME', getExpandCollapseButton($value, $sCategoryname)); + if ($value->custom['alias']) { + $sCategoryalias = $value->custom['alias']; + if (strlen($value->custom['alias']) > 30) { + $sCategoryalias = capiStrTrimHard($sCategoryalias, 30); + } + $tpl->set('d', 'ALIAS', $sCategoryalias); + if (strlen($value->custom['alias']) > 30) { + $tpl->set('d', 'SHOW_MOUSEOVER_ALIAS', 'onmouseover="Tip(\''.$value->custom['alias'].'\', BALLOON, true, ABOVE, true);"'); + } else { + $tpl->set('d', 'SHOW_MOUSEOVER_ALIAS', ''); + } + } else { + $tpl->set('d', 'SHOW_MOUSEOVER_ALIAS', ''); + $tpl->set('d', 'ALIAS', ' '); + } + + $template = $aTemplates[$aTplconfigs[$value->custom['idtplcfg']]]['name']; + $templateDescription = $aTemplates[$aTplconfigs[$value->custom['idtplcfg']]]['description']; + + $descString = ''; + + if ($template == "") + { + $template = '--- '.i18n("none").' ---'; + } + + // Description for hover effect + $descString = ''.$template.''; + + if( sizeof($templateDescription)>0 ) + { + $descString .= '
    '.$templateDescription; + } + + $sTemplatename = $template; + if (strlen($template) > 20) { + $sTemplatename = capiStrTrimHard($sTemplatename, 20); + } + + $tpl->set('d', 'TPLNAME', $sTemplatename); + $tpl->set('d', 'TPLDESC', $descString); + + if($perm->have_perm_area_action($tmp_area, "str_renamecat") || $perm->have_perm_area_action_item($tmp_area, "str_renamecat", $value->id)) { + $bPermRename = 1; + }else{ + $bPermRename = 0; + } + + if ($perm->have_perm_area_action("str_tplcfg", "str_tplcfg") || $perm->have_perm_area_action_item("str_tplcfg","str_tplcfg",$value->id)) + { + $bPermTplcfg = 1; + } else { + $bPermTplcfg = 0; + } + + $aRecord = array(); + $sCatName = $value->name; + + $aRecord['catn'] = str_replace('\'', '\\\'', $sCatName); + $sAlias = $value->custom['alias']; + $aRecord['alias'] = str_replace('\'', '\\\'', $sAlias); + $aRecord['idtplcfg'] = $value->custom['idtplcfg']; + $aRecord['pName'] = $bPermRename; + $aRecord['pTplcfg'] = $bPermTplcfg; + $aInlineEditData[$value->id] = $aRecord; + + $tpl->set('d', 'RENAMEBUTTON', "id.");\">id."_image\">"); + $tpl->set('d', 'CATID', $value->id); + + if (strlen($template) > 20) { + $tpl->set('d', 'SHOW_MOUSEOVER', 'onmouseover="Tip(\''.$descString.'\', BALLOON, true, ABOVE, true);"'); + } else { + $tpl->set('d', 'SHOW_MOUSEOVER', ''); + } + + $tpl->set('d', 'MOUSEOVER', $sMouseover); + + if($perm->have_perm_area_action($tmp_area, "str_newcat") || $perm->have_perm_area_action_item($tmp_area, "str_newcat", $value->id)) { + $bAreaAddNewCategory = true; + } + + if($perm->have_perm_area_action($tmp_area, "str_makevisible") || $perm->have_perm_area_action_item($tmp_area,"str_makevisible",$value->id)) { + if ($value->custom['visible'] == 1) { + $tpl->set('d', 'VISIBLEBUTTON', "url("main.php?area=$area&action=str_makevisible&frame=$frame&idcat=".$value->id."&visible=".$value->custom['visible'])."#clickedhere\">"); + } else { + $tpl->set('d', 'VISIBLEBUTTON', "url("main.php?area=$area&action=str_makevisible&frame=$frame&idcat=".$value->id."&visible=".$value->custom['visible'])."#clickedhere\">"); + } + } else { + $tpl->set('d', 'VISIBLEBUTTON', ' '); + } + + if($perm->have_perm_area_action($tmp_area, "str_makepublic") || $perm->have_perm_area_action_item($tmp_area,"str_makepublic",$value->id)) { + if ($value->custom['public'] == 1) { + $tpl->set('d', 'PUBLICBUTTON', "url("main.php?area=$area&action=str_makepublic&frame=$frame&idcat=".$value->id."&public=".$value->custom['public'])."#clickedhere\">"); + } else { + $tpl->set('d', 'PUBLICBUTTON', "url("main.php?area=$area&action=str_makepublic&frame=$frame&idcat=".$value->id."&public=".$value->custom['public'])."#clickedhere\">"); + } + } else { + $tpl->set('d', 'PUBLICBUTTON', ' '); + } + + $hasChildren = strNextDeeper($value->id); + $hasArticles = strHasArticles($value->id); + if(($hasChildren == 0) && ($hasArticles == false) &&($perm->have_perm_area_action($tmp_area, "str_deletecat") || $perm->have_perm_area_action_item($tmp_area,"str_deletecat",$value->id))) { + + $delete = ''.""; + $tpl->set('d', 'DELETEBUTTON', $delete); + } else { + $message = i18n("No permission"); + + if ($hasChildren) + { + $button = 'delete_inact_h.gif'; + } + + if ($hasArticles) + { + $button = 'delete_inact_g.gif'; + } + if ($hasChildren && $hasArticles) + { + $button = 'delete_inact.gif'; + } + + + $tpl->set('d', 'DELETEBUTTON', ''); + } + + if($perm->have_perm_area_action($tmp_area, "str_moveupcat") || $perm->have_perm_area_action_item($tmp_area,"str_moveupcat",$value->id)) { + + $rand = rand(); + + if ($value->custom['parentid']==0 && $value->custom['preid']==0) { + $tpl->set('d', 'UPBUTTON', ""); + } else { + if ($value->custom['preid']!=0) { + $tpl->set('d', 'UPBUTTON', "url("main.php?area=$area&action=str_moveupcat&frame=$frame&idcat=".$value->id."&rand=$rand")."#clickedhere\">"); + } else { + $tpl->set('d', 'UPBUTTON', ""); + } + } + } else { + $tpl->set('d', 'UPBUTTON', ""); + } + + if($perm->have_perm_area_action($tmp_area, "str_movedowncat") || $perm->have_perm_area_action_item($tmp_area,"str_movedowncat",$value->id)) { + + $rand = rand(); + + if ($value->custom['postid']==0) { + $tpl->set('d', 'DOWNBUTTON', ""); + } else { + $tpl->set('d', 'DOWNBUTTON', "url("main.php?area=$area&action=str_movedowncat&frame=$frame&idcat=".$value->id."&rand=$rand")."#clickedhere\">"); + } + } else { + $tpl->set('d', 'DOWNBUTTON', ""); + } + + if (($action === "str_movesubtree") && (!isset($parentid_new))) + { + if($perm->have_perm_area_action($tmp_area, "str_movesubtree") || $perm->have_perm_area_action_item($tmp_area,"str_movesubtree",$value->id)) + { + if ($value->id == $idcat) + { + $tpl->set('d', 'MOVEBUTTON', "url("main.php?area=$area&action=str_movesubtree&frame=$frame&idcat=$idcat&parentid_new=0")."\">"); + } else { + $allowed = strMoveCatTargetallowed($value->id, $idcat); + if ($allowed == 1) + { + $tpl->set('d', 'MOVEBUTTON', "url("main.php?area=$area&action=str_movesubtree&frame=$frame&idcat=$idcat&parentid_new=".$value->id)."\">"); + } else { + $tpl->set('d', 'MOVEBUTTON', ' '); + } + } + } else { + $tpl->set('d', 'MOVEBUTTON', ' '); + } + } else { + if($perm->have_perm_area_action($tmp_area, "str_movesubtree") || $perm->have_perm_area_action_item($tmp_area,"str_movesubtree",$value->id)) { + $tpl->set('d', 'MOVEBUTTON', "url("main.php?area=$area&action=str_movesubtree&frame=$frame&idcat=".$value->id)."#movesubtreehere\">"); + }else{ + $tpl->set('d', 'MOVEBUTTON', ' '); + } + } + + if ($perm->have_perm_area_action("str", "str_duplicate") || $perm->have_perm_area_action_item("str", "str_duplicate", $value->id)) + { + $duplicate = ''.""; + + $tpl->set('d', 'DUPLICATEBUTTON', $duplicate); + } else { + $tpl->set('d', 'DUPLICATEBUTTON', ' '); + } + + // DIRECTION + cInclude('includes', 'functions.lang.php'); + $tpl->set('d', 'DIRECTION', 'dir="' . langGetTextDirection($lang, $oDirectionDb) . '"'); + + $columns = array(); + + foreach ($listColumns as $key => $content) + { + $columnInfo = array(); + $_cecIterator = $_cecRegistry->getIterator("Contenido.CategoryList.RenderColumn"); + + $columnContents = array(); + + if ($_cecIterator->count() > 0) + { + while ($chainEntry = $_cecIterator->next()) + { + $columnContents[] = $chainEntry->execute($value->id, $key); + } + } else { + $columnContents[] = ''; + } + + $columns[] = ''.implode("", $columnContents).''; + } + + $tpl->set('d', 'ADDITIONALCOLUMNS', implode("", $columns)); + $tpl->next(); + }//end if -> perm + } + + $jsDataArray = ""; + foreach ($aInlineEditData as $iIdCat => $aData) { + $aTmp = array(); + foreach ($aData as $aKey => $aValue) { + array_push($aTmp, $aKey."':'".$aValue); + } + $jsDataArray.= "tmpObject = new Object(); + tmpObject = {'".implode("', '", $aTmp)."'}; + dataArray[$iIdCat] = tmpObject; + "; + } + + $tpl->set('s', 'JS_DATA', $jsDataArray); + + $string = markSubMenuItem(0, true); + + //Set DHTML generic Values + $sImagepath = $cfg["path"]["images"]; + $tpl->set('s', 'SUM_COLUMNS', 14+count($listColumns)); + $tpl->set('s', 'HREF_ACTION', $sess->url("main.php?frame=$frame")); + $tpl->set('s', 'CON_IMAGES', $cfg["path"]["contenido_fullhtml"].$cfg["path"]["images"]); + + //Generate input fields for category new layer and category edit layer + $oSession = new cHTMLHiddenField ($sess->name, $sess->id); + $oActionEdit = new cHTMLHiddenField ('action', 'str_renamecat'); + $oIdcat = new cHTMLHiddenField ('idcat'); + + $tpl->set('s', 'INPUT_SESSION', $oSession->render()); + $tpl->set('s', 'INPUT_ACTION_EDIT', $oActionEdit->render()); + $tpl->set('s', 'INPUT_IDCAT', $oIdcat->render()); + + $oVisible = new cHTMLHiddenField ('visible', 0, 'visible_input'); + $oPublic = new cHTMLHiddenField ('public', 1, 'public_input'); + $oTemplate = new cHTMLHiddenField ('idtplcfg', 0, 'idtplcfg_input'); + + $tpl->set('s', 'INPUT_VISIBLE', $oVisible->render()); + $tpl->set('s', 'INPUT_PUBLIC', $oPublic->render()); + $tpl->set('s', 'INPUT_TEMPLATE', $oTemplate->render()); + + $oCatName = new cHTMLTextbox ('categoryname', '', '', '', 'cat_categoryname'); + $oCatName->setStyle('width:150px; vertical-align:middle;'); + $tpl->set('s', 'INPUT_CATNAME_NEW', $oCatName->render()); + + $oAlias = new cHTMLTextbox ('categoryalias'); + $oAlias->setStyle('width:150px; vertical-align:middle;'); + $tpl->set('s', 'INPUT_ALIAS_NEW', $oAlias->render()); + + $oNewCatName = new cHTMLTextbox ('newcategoryname'); + $oNewCatName->setStyle('width:150px; vertical-align:middle;'); + $tpl->set('s', 'INPUT_CATNAME_EDIT', $oNewCatName->render()); + + $oNewAlias = new cHTMLTextbox ('newcategoryalias'); + $oNewAlias->setStyle('width:150px; vertical-align:middle;'); + $tpl->set('s', 'INPUT_ALIAS_EDIT', $oNewAlias->render()); + + $sCategorySelect = buildCategorySelectRights('idcat', ''); + + # Show Layerbutton for adding new Cateogries and set options according to Permisssions + if (($perm->have_perm_area_action($tmp_area,"str_newtree") || + $perm->have_perm_area_action($tmp_area,"str_newcat") || + $bAreaAddNewCategory) + && (int) $client > 0 && (int) $lang > 0) { + $tpl->set('s', 'NEWCAT', $string . " ".i18n('Create new category').""); + if ($perm->have_perm_area_action($tmp_area,"str_newtree")) { + if ($perm->have_perm_area_action($tmp_area,"str_newcat") || $bAreaAddNewCategory) { + $tpl->set('s', 'PERMISSION_NEWTREE', ''); + $oActionNew = new cHTMLHiddenField ('action', 'str_newcat', 'cat_new_action'); + } else { + $tpl->set('s', 'PERMISSION_NEWTREE', 'disabled checked'); + $oActionNew = new cHTMLHiddenField ('action', 'str_newcat', 'str_newtree'); + } + $tpl->set('s', 'INPUT_ACTION_NEW', $oActionNew->render()); + $tpl->set('s', 'PERMISSION_NEWTREE_DISPLAY', 'block'); + + } else { + $oActionNew = new cHTMLHiddenField ('action', 'str_newcat', 'cat_new_action'); + $tpl->set('s', 'PERMISSION_NEWTREE', 'disabled'); + $tpl->set('s', 'PERMISSION_NEWTREE_DISPLAY', 'none'); + $tpl->set('s', 'NEW_ACTION', 'str_newcat'); + $tpl->set('s', 'INPUT_ACTION_NEW', $oActionNew->render()); + } + + if ($perm->have_perm_area_action($tmp_area,"str_newcat") || $bAreaAddNewCategory) { + $tpl->set('s', 'CATEGORY_SELECT', $sCategorySelect); + $tpl->set('s', 'PERMISSION_NEWCAT_DISPLAY', 'block'); + } else { + $tpl->set('s', 'CATEGORY_SELECT', ''); + $tpl->set('s', 'PERMISSION_NEWCAT_DISPLAY', 'none'); + } + + if ($perm->have_perm_area_action("str_tplcfg", "str_tplcfg")) { + $tpl->set('s', 'TEMPLATE_BUTTON_NEW', ''.i18n('Configure category').''); + $tpl->set('s', 'SELECT_TEMPLATE', getTemplateSelect()); + } else { + $tpl->set('s', 'TEMPLATE_BUTTON_NEW', ''.i18n('Configure category').''); + $tpl->set('s', 'SELECT_TEMPLATE', ''); + } + + if ($perm->have_perm_area_action($tmp_area, "str_makevisible")) { + $tpl->set('s', 'MAKEVISIBLE_BUTTON_NEW', ''.i18n('Make online').''); + } else { + $tpl->set('s', 'MAKEVISIBLE_BUTTON_NEW', ''.i18n('Make online').''); + } + + if ($perm->have_perm_area_action($tmp_area, "str_makepublic")) { + $tpl->set('s', 'MAKEPUBLIC_BUTTON_NEW', ''.i18n('Protect category').''); + } else { + $tpl->set('s', 'MAKEPUBLIC_BUTTON_NEW', ''.i18n('Protect category').''); + } + } else { + $tpl->set('s', 'NEWCAT', $string); + + $tpl->set('s', 'PERMISSION_NEWTREE', 'disabled'); + $tpl->set('s', 'PERMISSION_NEWTREE_DISPLAY', 'none'); + + $tpl->set('s', 'CATEGORY_SELECT', ''); + $tpl->set('s', 'PERMISSION_NEWCAT_DISPLAY', 'none'); + + $tpl->set('s', 'TEMPLATE_BUTTON_NEW', ''); + $tpl->set('s', 'MAKEVISIBLE_BUTTON_NEW', ''); + $tpl->set('s', 'MAKEPUBLIC_BUTTON_NEW', ''); + + $tpl->set('s', 'NEW_ACTION', 'str_newcat'); + $tpl->set('s', 'SELECT_TEMPLATE', ''); + } + + # Generate template + $clang = new cApiLanguage($lang); + + if ( $movesubtreeidcat != 0 ) { + if ( strlen ( $sMoveSubtreeCatName ) > 30 ) { + $sLimiter = "..."; + } else { + $sLimiter = ""; + } + $sButtonDesc = sprintf( i18n( 'Cancel moving %s' ), '"' . substr( $sMoveSubtreeCatName, 0, 30) . $sLimiter . '"' ); + $tpl->set('s', 'CANCEL_MOVE_TREE', ''.$sButtonDesc.' '.$sButtonDesc.''); + } else { + $tpl->set('s', 'CANCEL_MOVE_TREE', ''); + } + + $tpl->setEncoding($clang->get("encoding")); + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['str_overview']); +} +?> diff --git a/conlite/includes/include.str_subnav.php b/conlite/includes/include.str_subnav.php new file mode 100644 index 0000000..6772a4d --- /dev/null +++ b/conlite/includes/include.str_subnav.php @@ -0,0 +1,108 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-01 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.str_subnav.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + if (!isset($path)) + { + $path = ""; + } + $area = $_GET['area']; + + $nav = new Contenido_Navigation; + + $sql = "SELECT + idarea + FROM + ".$cfg["tab"]["area"]." AS a + WHERE + a.name = '".Contenido_Security::escapeDB($area, $db)."' OR + a.parent_id = '".Contenido_Security::escapeDB($area, $db)."' + ORDER BY + idarea"; + + $db->query($sql); + + $in_str = ""; + + while ( $db->next_record() ) { + $in_str .= $db->f('idarea') . ','; + } + + $len = strlen($in_str)-1; + $in_str = substr($in_str, 0, $len); + $in_str = '('.$in_str.')'; + + $sql = "SELECT + b.location AS location, + a.name AS name + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.idarea IN ".$in_str." AND + b.idarea = a.idarea AND + b.level = 1 AND + b.online = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + + while ( $db->next_record() ) { + + /* Extract names from the XML document. */ + $caption = $nav->getName($db->f("location")); + + $tmp_area = $db->f("name"); + + if ($perm->have_perm_area_action($tmp_area)) + { + if ($tmp_area != "upl_edit") + { + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + } + + } + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . "template.subnav_noleft.html"); +?> diff --git a/conlite/includes/include.style_edit_form.php b/conlite/includes/include.style_edit_form.php new file mode 100644 index 0000000..f218f01 --- /dev/null +++ b/conlite/includes/include.style_edit_form.php @@ -0,0 +1,211 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-20 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-08-14, Timo Trautmann, Bilal Arslan - Functions for versionning and storing file meta data added + * + * $Id: include.style_edit_form.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("external", "edit_area/class.edit_area.php"); + +$sFileType = "css"; + +$sActionCreate = 'style_create'; +$sActionEdit = 'style_edit'; + +$page = new cPage; +$page->setEncoding("utf-8"); + +$tpl->reset(); + +if (!$perm->have_perm_area_action($area, $action)) +{ + $notification->displayNotification("error", i18n("Permission denied")); +} else if (!(int) $client > 0) { + #if there is no client selected, display empty page + $page->render(); +} else { + $path = $cfgClient[$client]["css"]["path"]; + if (stripslashes($_REQUEST['file'])) { + $sReloadScript = ""; + } else { + $sReloadScript = ""; + } + + $sTempFilename = stripslashes($_REQUEST['tmp_file']); + $sOrigFileName = $sTempFilename; + + if (getFileType($_REQUEST['file']) != $sFileType AND strlen(stripslashes(trim($_REQUEST['file']))) > 0) + { + $sFilename .= stripslashes($_REQUEST['file']).".$sFileType"; + }else + { + $sFilename .= stripslashes($_REQUEST['file']); + } + + if (stripslashes($_REQUEST['file'])) { + $sReloadScript = ""; + } else { + $sReloadScript = ""; + } + + // Content Type is css + $sTypeContent = "css"; + $aFileInfo = getFileInformation ($client, $sTempFilename, $sTypeContent, $db); + + # create new file + if ( $_REQUEST['action'] == $sActionCreate AND $_REQUEST['status'] == 'send') + { + $sTempFilename = $sFilename; + createFile($sFilename, $path); + $bEdit = fileEdit($sFilename, $_REQUEST['code'], $path); + updateFileInformation($client, $sFilename, 'css', $auth->auth['uid'], $_REQUEST['description'], $db); + $sReloadScript .= ""; + } + + # edit selected file + if ( $_REQUEST['action'] == $sActionEdit AND $_REQUEST['status'] == 'send') + { + if ($sFilename != $sTempFilename) + { + $sTempFilename = renameFile($sTempFilename, $sFilename, $path); + $sReloadScript .= ""; + }else + { + $sTempFilename = $sFilename; + } + + + updateFileInformation($client, $sOrigFileName, 'css', $auth->auth['uid'], $_REQUEST['description'], $db, $sFilename); + + /** + * START TRACK VERSION + **/ + // For read Fileinformation an get the id of current File + cInclude("includes", "functions.file.php"); + + if((count($aFileInfo) == 0) || ((int)$aFileInfo["idsfi"] == 0)) { + $aFileInfo = getFileInformation ($client, $sTempFilename, $sTypeContent, $db); + $aFileInfo['description'] = ''; + } + + if((count($aFileInfo) == 0) || ($aFileInfo["idsfi"] !="")) { + $oVersion = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFilename, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame, $sOrigFileName); + // Create new version + $oVersion->createNewVersion(); + } + + /** + * END TRACK VERSION + **/ + + + $bEdit = fileEdit($sFilename, $_REQUEST['code'], $path); + + } + + # generate edit form + if (isset($_REQUEST['action'])) { + + $sAction = ($bEdit) ? $sActionEdit : $_REQUEST['action']; + + if ($_REQUEST['action'] == $sActionEdit) + { + $sCode = getFileContent($sFilename, $path); + }else + { + $sCode = stripslashes($_REQUEST['code']); # stripslashes is required here in case of creating a new file + } + + $aFileInfo = getFileInformation ($client, $sTempFilename, "css", $db); + + + $form = new UI_Table_Form("file_editor"); + $form->addHeader(i18n("Edit file")); + $form->setWidth("100%"); + $form->setVar("area", $area); + $form->setVar("action", $sAction); + $form->setVar("frame", $frame); + $form->setVar("status", 'send'); + $form->setVar("tmp_file", $sTempFilename); + + $tb_name = new cHTMLTextbox("file", $sFilename, 60); + $ta_code = new cHTMLTextarea("code", clHtmlSpecialChars($sCode), 100, 35, "code"); + $descr = new cHTMLTextarea("description", clHtmlSpecialChars($aFileInfo["description"]), 100, 5); + + + $ta_code->setStyle("font-family: monospace;width: 100%;"); + $descr->setStyle("font-family: monospace;width: 100%;"); + $ta_code->updateAttributes(array("wrap" => getEffectiveSetting('style_editor', 'wrap', 'off'))); + + $form->add(i18n("Name"),$tb_name); + $form->add(i18n("Description"), $descr->render()); + $form->add(i18n("Code"),$ta_code); + + $page->setContent($form->render()); + + $oEditArea = new EditArea('code', 'css', substr(strtolower($belang), 0, 2), true, $cfg); + $page->addScript('editarea', $oEditArea->renderScript()); + + $page->addScript('reload', $sReloadScript); + $page->render(); + } +} + +?> \ No newline at end of file diff --git a/conlite/includes/include.style_files_overview.php b/conlite/includes/include.style_files_overview.php new file mode 100644 index 0000000..ecb205e --- /dev/null +++ b/conlite/includes/include.style_files_overview.php @@ -0,0 +1,161 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002-03-02 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.style_files_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.file.php"); + +$tpl->reset(); + +if (!(int) $client > 0) { + #if there is no client selected, display empty page + $oPage = new cPage; + $oPage->render(); + return; +} + +$path = $cfgClient[$client]["css"]["path"]; +$sFileType = "css"; + +$sSession = $sess->id; + +$sArea = 'style'; +$sActionDelete = 'style_delete'; +$sActionEdit = 'style_edit'; + +$sScriptTemplate = ' + + + +'; + +$tpl->set('s', 'JAVASCRIPT', $sScriptTemplate); + +# delete file +if ($action == $sActionDelete) +{ + if (!strrchr($_REQUEST['delfile'], "/")) + { + if (file_exists($path.$_REQUEST['delfile'])) + { + unlink($path.$_REQUEST['delfile']); + removeFileInformation($client, $_REQUEST['delfile'], 'css', $db); + } + } + +} + +if ($handle = opendir($path)) +{ + + $aFiles = array(); + + while ($file = readdir($handle)) + { + if(substr($file, (strlen($file) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType" AND is_readable($path.$file)) + { + $aFiles[] = $file; + }elseif (substr($file, (strlen($file) - (strlen($sFileType) + 1)), (strlen($sFileType) + 1)) == ".$sFileType" AND !is_readable($path.$file)) + { + $notification->displayNotification("error", $file." ".i18n("is not readable!")); + } + } + closedir($handle); + + // display files + if (is_array($aFiles)) + { + + sort($aFiles); + + foreach ($aFiles as $filename) + { + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + + $tmp_mstr = '%s'; + + $html_filename = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=$area&frame=3&file=$filename"), + 'right_bottom', + $sess->url("main.php?area=$area&frame=4&action=$sActionEdit&file=$filename&tmp_file=$filename"), + $filename, $filename, clHtmlSpecialChars($filename)); + + $tpl->set('d', 'FILENAME', $html_filename); + + $delTitle = i18n("Delete File"); + $delDescr = sprintf(i18n("Do you really want to delete the following file:

    %s
    "),$filename); + + if ($perm->have_perm_area_action('style', $sActionDelete)) + { + $tpl->set('d', 'DELETE', ''); + }else + { + $tpl->set('d', 'DELETE', ''); + } + + if (stripslashes($_REQUEST['file']) == $filename) { + $tpl->set('d', 'ID', 'id="marked"'); + } else { + $tpl->set('d', 'ID', ''); + } + + $tpl->next(); + + } + } +}else +{ + if ((int) $client > 0) { + $notification->displayNotification("error", i18n("Directory is not existing or readable!")."
    $path"); + } +} + +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['files_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.style_history.php b/conlite/includes/include.style_history.php new file mode 100644 index 0000000..d14a116 --- /dev/null +++ b/conlite/includes/include.style_history.php @@ -0,0 +1,188 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release >= 5.0 + * + * {@internal + * created 2008-08-05 + * $Id: include.style_history.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// For update current layout with Revision +cInclude("includes", "functions.lay.php"); + +// For read Fileinformation an get the id of current File +cInclude("includes", "functions.file.php"); + +// For Editor syntax highlighting +cInclude("external", "edit_area/class.edit_area.php"); + +$sFileName = ""; +$sFileName = $_REQUEST['file']; + +if($sFileName == ""){ + $sFileName = $_REQUEST['idstyle']; // Content Type is css +} + +$sType = "css"; + +$oPage = new cPage; +$oPage->addScript('messageBox', ''); +$oPage->addScript('messageBoxInit', ''); + +if (!$perm->have_perm_area_action($area, 'style_history_manage')) +{ + $notification->displayNotification("error", i18n("Permission denied")); + $oPage->render(); +} else if (!(int) $client > 0) { + $oPage->render(); +} else if (getEffectiveSetting('versioning', 'activated', 'false') == 'false') { + $notification->displayNotification("warning", i18n("Versioning is not activated")); + $oPage->render(); +} else { + + $sTypeContent = "css"; + + $aFileInfo = getFileInformation ($client, $sFileName , $sTypeContent, $db); + + // [action] => history_truncate delete all current history + if($_POST["action"] == "history_truncate") { + $oVersionStyle = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFileName ,$sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + $bDeleteFile = $oVersionStyle->deleteFile(); + unset($oVersionStyle); + } + + if ($_POST["style_send"] == true && $_POST["stylecode"] !="" && $sFileName != "" && $aFileInfo["idsfi"]!="") { // save button + // Get Post variables + $oVersionStyle = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFileName, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + + $sStyleCode = $_POST["stylecode"]; + $sStyleName = $_POST["stylename"]; + $sStyleDesc = $_POST["styledesc"]; + + $sPath = $oVersionStyle->getPathFile(); + + // Edit File + + // There is a need for renaming file + if($sFileName != $sStyleName){ + if (getFileType($sStyleName) != 'css' AND strlen(stripslashes(trim($sStyleName))) > 0) { + $sStyleName = stripslashes($sStyleName).".css"; + } + + renameFile($sFileName, $sStyleName, $oVersionStyle->getPathFile()); + $oPage->addScript("reload", $oVersionStyle->renderReloadScript('style', $sStyleName, $sess)); + } + + if(fileEdit($sStyleName, $sStyleCode, $sPath)) { + // make new revision File + $oVersionStyle->createNewVersion(); + + // Update File Information + updateFileInformation($client, $sFileName, $sType, $aFileInfo["author"], $sStyleDesc, $db, $sStyleName); + $sFileName = $sStyleName; + } + + unset($oVersionStyle); + } + + if($sFileName != "" && $aFileInfo["idsfi"]!="" && $_POST["action"] != "history_truncate") { + $oVersionStyle = new VersionFile($aFileInfo["idsfi"], $aFileInfo, $sFileName, $sTypeContent, $cfg, $cfgClient, $db, $client, $area, $frame); + + // Init Form variables of SelectBox + $sSelectBox = ""; + $oVersionStyle->setVarForm("area", $area); + $oVersionStyle->setVarForm("frame", $frame); + $oVersionStyle->setVarForm("idstyle", $sFileName); + $oVersionStyle->setVarForm("file", $sFileName); + + // create and output the select box, for params please look class.version.php + $sSelectBox = $oVersionStyle->buildSelectBox("style_history", "Style History", "Show History Entry", "idstylehistory"); + + // Generate Form + $oForm = new UI_Table_Form("style_display"); + $oForm->addHeader(i18n("Edit Style")); + $oForm ->setWidth("100%"); + $oForm->setVar("area", "style_history"); + $oForm->setVar("frame", $frame); + $oForm->setVar("idstyle", $sFileName); + $oForm->setVar("style_send", 1); + + + // if send form refresh button + if ($_POST["idstylehistory"] != "") { + $sRevision = $_POST["idstylehistory"]; + } else { + $sRevision = $oVersionStyle->getLastRevision(); + } + + if ($sRevision != '') { + $sPath = $oVersionStyle->getFilePath() . $sRevision; + + // Read XML Nodes and get an array + $aNodes = array(); + $aNodes = $oVersionStyle->initXmlReader($sPath); + + // Create Textarea and fill it with xml nodes + if (count($aNodes) > 1) { + // if choose xml file read value an set it + $sName = $oVersionStyle->getTextBox("stylename", $aNodes["name"], 60); + $sDescription = $oVersionStyle->getTextarea("styledesc", $aNodes["desc"], 100, 10); + $sCode = $oVersionStyle->getTextarea("stylecode", $aNodes["code"], 100, 30, "IdLaycode"); + + } + + } + + // Add new Elements of Form + $oForm->add(i18n("Name"), $sName); + $oForm->add(i18n("Description"), $sDescription); + $oForm->add(i18n("Code"), $sCode); + $oForm->setActionButton("apply", "images/but_ok.gif", i18n("Copy to current"), "c" /*, "mod_history_takeover"*/); //modified it + $oForm->unsetActionButton("submit"); + + // Render and handle History Area + $oPage->setEncoding("utf-8"); + + $oEditAreaOutput = new EditArea('IdLaycode', 'css', substr(strtolower($belang), 0, 2), true, $cfg, !$bInUse); + $oPage->addScript('IdLaycode', $oEditAreaOutput->renderScript()); + + if($sSelectBox !="") { + $oPage->setContent($sSelectBox . $oForm->render()); + + } else { + $notification->displayNotification("warning", i18n("No style history available")); + } + $oPage->render(); + + }else{ + if($bDeleteFile) { + $notification->displayNotification("warning", i18n("Version history was cleared")); + } else { + $notification->displayNotification("warning", i18n("No style history available")); + } + } +} +?> \ No newline at end of file diff --git a/conlite/includes/include.style_left_top.php b/conlite/includes/include.style_left_top.php new file mode 100644 index 0000000..0f90187 --- /dev/null +++ b/conlite/includes/include.style_left_top.php @@ -0,0 +1,57 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-09 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.style_left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->set('s', 'ID', 'oTplSel'); +$tpl->set('s', 'CLASS', 'text_medium'); +$tpl->set('s', 'OPTIONS', ''); +$tpl->set('s', 'CAPTION', ''); +$tpl->set('s', 'SESSID', $sess->id); + + +$tpl->set('s', 'ACTION', $select); + +$tmp_mstr = ''; +$area = "style"; +$mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=style&frame=3"), + 'right_bottom', + $sess->url("main.php?area=style&frame=4&action=style_create"), + i18n("Create style")); +if ((int) $client > 0) { + $tpl->set('s', 'NEWSTYLE', $mstr); +} else { + $tpl->set('s', 'NEWSTYLE', i18n('No Client selected')); +} +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['style_left_top']); +?> \ No newline at end of file diff --git a/conlite/includes/include.subnav.php b/conlite/includes/include.subnav.php new file mode 100644 index 0000000..9ba601f --- /dev/null +++ b/conlite/includes/include.subnav.php @@ -0,0 +1,83 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-25 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.subnav.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if ( isset($_GET['idcat']) ) { + + $nav = new Contenido_Navigation; + + $sql = "SELECT + b.location AS location, + a.name AS name, + a.relevant AS relevant + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.level = 1 AND + b.idarea = a.idarea AND + b.online = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + while ( $db->next_record() ) { + + /* Extract names from the XML document. */ + $caption = $nav->getName($db->f("location")); + + $tmp_area = $db->f("name"); + + if ($perm->have_perm_area_action($tmp_area) || ($db->f("relevant") == 0)) + { + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + } + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); + +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.symbolhelp.php b/conlite/includes/include.symbolhelp.php new file mode 100644 index 0000000..e0bd37d --- /dev/null +++ b/conlite/includes/include.symbolhelp.php @@ -0,0 +1,37 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-14 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.symbolhelp.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['symbolhelp']); +?> \ No newline at end of file diff --git a/conlite/includes/include.system_configuration.php b/conlite/includes/include.system_configuration.php new file mode 100644 index 0000000..ee7943d --- /dev/null +++ b/conlite/includes/include.system_configuration.php @@ -0,0 +1,196 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.8 + * + * {@internal + * created 2008-08-19 + * modified 2010-11-30, Dominik Ziegler, added check of minimum period time at update notifier check period [CON-372] + * + * }} + * + */ +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +function renderBooleanProperty($sName, $aPossValues, $sValue, $sLabel) { + $aReturn = array(); + + if ($aPossValues[0] == $sValue) { + $bChecked = false; + } else { + $bChecked = true; + } + + $oCheckbox = new cHTMLCheckbox($sName, $aPossValues[1], $sName, $bChecked); + $oCheckbox->setLabelText('  '.$sLabel); + $oCheckbox->setStyle('margin:0; padding:0px;margin-left:3px;'); + + $aReturn['input'] = $oCheckbox->toHtml(); + $aReturn['label'] = ''; + + return $aReturn; +} + +function renderLabel($sLabel, $sName, $iWidth = 250, $sSeperator = ':') { + $oLabel = new cHTMLLabel($sLabel.$sSeperator, $sName); + $oLabel->setStyle('padding:3px;display:block;float:left;width:'.$iWidth.'px;'); + return $oLabel->render(); +} + +function renderTextProperty($sName, $sValue, $sLabel) { + $oTextbox = new cHTMLTextbox($sName, $sValue, "50", "96"); + $oTextbox->setStyle('width:320px;'); + $aReturn['input'] = $oTextbox->render(); + $aReturn['label'] = renderLabel($sLabel, $sName); + return $aReturn; +} + +function getPostValue($aProperty) { + $sName = $aProperty['type'].'{_}'.$aProperty['name']; + if (isset($_POST[$sName])) { + if (is_array($aProperty['value'])) { + if (in_array($_POST[$sName], $aProperty['value'])) { + return $_POST[$sName]; + } else { + return $aProperty['value'][0]; + } + } else { + if ($aProperty['value'] == 'integer') { + return (int) $_POST[$sName]; + } else { + return $_POST[$sName]; + } + } + } + + if (is_array($aProperty['value'])) { + return $aProperty['value'][0]; + } else { + return ''; + } +} + +$aManagedProperties = array( + array('type' => 'versioning', 'name' => 'activated', 'value' => array('false', 'true'), 'label' => i18n('Versioning activated'), 'group' => i18n('Versioning')), + array('type' => 'versioning', 'name' => 'path', 'value' => '', 'label' => i18n('Serverpath to version files'), 'group' => i18n('Versioning')), + array('type' => 'versioning', 'name' => 'prune_limit', 'value' => 'integer', 'label' => i18n('Maximum number of stored versions'), 'group' => i18n('Versioning')), + array('type' => 'update', 'name' => 'check', 'value' => array('false', 'true'), 'label' => i18n('Check for updates'), 'group' => i18n('Update notifier')), + array('type' => 'update', 'name' => 'news_feed', 'value' => array('false', 'true'), 'label' => i18n('Get news from conlite.org'), 'group' => i18n('Update notifier')), + array('type' => 'update', 'name' => 'check_period', 'value' => 'integer', 'label' => i18n('Update check period (minutes)'), 'group' => i18n('Update notifier')), + array('type' => 'system', 'name' => 'clickmenu', 'value' => array('false', 'true'), 'label' => i18n('Clickable menu in backend'), 'group' => i18n('Backend')), + array('type' => 'pw_request', 'name' => 'enable', 'value' => array('false', 'true'), 'label' => i18n('Use passwordrequest in Backend'), 'group' => i18n('Backend')), + array('type' => 'maintenance', 'name' => 'mode', 'value' => array('disabled', 'enabled'), 'label' => i18n('Activate maintenance mode'), 'group' => i18n('Backend')), + array('type' => 'edit_area', 'name' => 'activated', 'value' => array('false', 'true'), 'label' => i18n('Use editarea for code highlighting'), 'group' => i18n('Backend')), + array('type' => 'system', 'name' => 'insight_editing_activated', 'value' => array('false', 'true'), 'label' => i18n('Use TinyMce as insight editor'), 'group' => i18n('Backend')), + array('type' => 'backend', 'name' => 'preferred_idclient', 'value' => 'integer', 'label' => i18n('Default client (ID)'), 'group' => i18n('Backend')), + array('type' => 'system', 'name' => 'mail_host', 'value' => '', 'label' => i18n('Mailserver host'), 'group' => i18n('Mailserver')), + array('type' => 'system', 'name' => 'mail_sender', 'value' => '', 'label' => i18n('Mailserver sender mail'), 'group' => i18n('Mailserver')), + array('type' => 'system', 'name' => 'mail_sender_name', 'value' => '', 'label' => i18n('Mailserver sender name'), 'group' => i18n('Mailserver')), + /*array('type' => 'generator', 'name' => 'xhtml', 'value' => array('false', 'true'), 'label' => i18n('Generate XHTML'), 'group' => i18n('Development')),*/ + array('type' => 'generator', 'name' => 'basehref', 'value' => array('false', 'true'), 'label' => i18n('Generate basehref'), 'group' => i18n('Development')), + array('type' => 'imagemagick', 'name' => 'available', 'value' => array('0', '1'), 'label' => i18n('Use image magic (if available)'), 'group' => i18n('Development')) + ); + +$aSettings = getSystemProperties(1); + +if (isset($_POST['action']) && $_POST['action'] == 'edit_sysconf' && $perm->have_perm_area_action($area, 'edit_sysconf')) { + $bStored = false; + foreach ($aManagedProperties as $aProperty) { + $sValue = getPostValue($aProperty); + $sStoredValue = $aSettings[$aProperty['type']][$aProperty['name']]['value']; + + if ($sStoredValue != $sValue && (is_array($aProperty['value']) && $sValue != '' || !is_array($aProperty['value']))) { + if ( $aProperty['type'] == 'update' && $aProperty['name'] == 'check_period' && (int) $sValue < 60 ) { + $sNotification = $notification->displayNotification("error", i18n("Update check period must be at least 60 minutes.")); + $bStored = false; + break; + } else { + setSystemProperty($aProperty['type'], $aProperty['name'], $sValue); + $bStored = true; + } + } + } + if ($bStored) { + $sNotification = $notification->displayNotification("info", i18n("Changes saved")); + } +} + + + +$aSettings = getSystemProperties(1); + +$oForm = new UI_Table_Form("system_configuration"); +$oForm->addHeader(i18n("System Configuration")); +$oForm ->setWidth("770"); +$oForm->setVar("area", $area); +$oForm->setVar("frame", $frame); +$oForm->setVar("action", 'edit_sysconf'); + +$sCurGroup = ''; +$sLeftContent = ''; + +$sRowTemplate = '

    %s

    '; + +foreach ($aManagedProperties as $aProperty) { + $sName = $aProperty['type'].'{_}'.$aProperty['name']; + if (isset($aSettings[$aProperty['type']][$aProperty['name']]['value'])) { + $sValue = $aSettings[$aProperty['type']][$aProperty['name']]['value']; + } else { + $sValue = ''; + } + + if (is_array($aProperty['value'])) { + $aHtmlElement = renderBooleanProperty($sName, $aProperty['value'], $sValue, $aProperty['label']); + } else { + $aHtmlElement = renderTextProperty($sName, $sValue, $aProperty['label']); + } + + if ($sCurGroup == '' || $sCurGroup == $aProperty['group']) { + if ($sCurGroup == '') { + $sCurGroup = $aProperty['group']; + } + $sLeftContent .= sprintf($sRowTemplate, $aHtmlElement['label']. $aHtmlElement['input']); + } else { + $oForm->add(renderLabel($sCurGroup, '', 150, ''), $sLeftContent); + $sCurGroup = $aProperty['group']; + $sLeftContent = sprintf($sRowTemplate, $aHtmlElement['label']. $aHtmlElement['input']); + } +} + +$oForm->add(renderLabel($sCurGroup, '', 150, ''), $sLeftContent); + +$sJs = ''; + +$oPage = new cPage; +if ($perm->have_perm_area_action($area, 'edit_sysconf')) { + $oPage->setContent($sNotification.$oForm->render()); +} else { + $oPage->setContent($notification->returnNotification("error", i18n('Access denied'), 1)); +} +$oPage->addScript('setMenu', $sJs); +$oPage->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.system_db_backup.php b/conlite/includes/include.system_db_backup.php new file mode 100644 index 0000000..dd3f4dd --- /dev/null +++ b/conlite/includes/include.system_db_backup.php @@ -0,0 +1,409 @@ + + * @copyright (c) 2012-2013, conlite.org + * + * $Id: include.system_db_backup.php 438 2016-05-17 17:31:24Z oldperl $ + */ +/* @var $sess Contenido_Session */ +/* @var $perm Contenido_Perm */ +/* @var $auth Contenido_Challenge_Crypt_Auth */ +/* @var $notification Contenido_Notification */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +define('CL_BACKUP_COUNT_LINES', 20000); +define('CL_BACKUP_MAX_RELOADS', 600); +define('CL_BACKUP_VERSION', 'CL DB-Backup 1.3.4'); +define('CL_BACKUP_PATH', $cfg['path']['conlite_backup']); +define('CL_BACKUP_LOGFILE', $cfg['path']['conlite_logs'] . "db-backup-log.txt"); +define('CL_BACKUP_START_IMG', $cfg['path']['contenido_html'] . $cfg['path']['images'] . "db_backup_start.png"); +define('CL_BACKUP_START_IMG_OFF', $cfg['path']['contenido_html'] . $cfg['path']['images'] . "db_backup_start_off.png"); + +$aMessage = array(); +$bNoBackup = false; +$bFinalStep = false; + +// check backup path +if (!is_dir(CL_BACKUP_PATH) || !is_writable(CL_BACKUP_PATH)) { + $notification->displayNotification("error", i18n("Backupfolder missing or not writable!")); + $bNoBackup = true; +} +$backup_action = (isset($_GET['cl_action']) ? $_GET['cl_action'] : ''); + +// check dbuser rights +/* +echo "
    ";
    +$oDb = new DB_ConLite();
    +//echo $sSql = "SHOW GRANTS FOR '".$cfg['db']['connection']['user']."'@'".$cfg['db']['connection']['host']."';";
    +echo $sSql = "SHOW GRANTS FOR '" . $cfg['db']['connection']['user'] . "';";
    +$oDb->query($sSql);
    +while ($oDb->next_record()) {
    +    print_r($oDb->toArray());
    +}
    +*/
    +
    +$sTable = "";
    +$bk_filename = str_replace(array("&cl_action=backupnow", "&"), array("", "&"), $sess->self_url()); // web28 - 2011-07-02 - Security Fix - PHP_SELF
    +$info_h1 = i18n("Start your Backup!");
    +$info_h2 = ' ';
    +$oImgButton = new cHTMLImage();
    +if ($bNoBackup) {
    +    $oImgButton->setSrc(CL_BACKUP_START_IMG_OFF);
    +    $oImgButton->setAlt(mi18n("Backup not possible!"));
    +} else {
    +    $oImgButton->setSrc(CL_BACKUP_START_IMG);
    +    $oImgButton->setAlt(mi18n("Click to start Backup!"));
    +}
    +$sImage = $oImgButton->render();
    +$oStartButton = new cHTMLLink($sess->self_url() . "&cl_action=backupnow");
    +$oStartButton->_setContent($sImage);
    +$button_back = ($bNoBackup) ? $sImage : $oStartButton->toHtml();
    +
    +//aktiviert die Ausgabepufferung
    +ob_start();
    +
    +//Start Session
    +session_name('dbdump');
    +if (!isset($_SESSION)) {
    +    session_start();
    +}
    +//unset($_SESSION['dump']);
    +//#### BACKUP ANFANG #######
    +if (isset($_SESSION['dump'])) {
    +    $dump = $_SESSION['dump'];
    +    $info_h2 = ' ';
    +    $button_back = ' ';
    +} else {
    +    $oUser = new User();
    +    $oUser->loadUserByUserID($auth->auth['uid']);
    +    $bHasPermission = ($oUser->getUserProperty("system", "cl_backup_allowed") == 'true') ? true : false;
    +    if (!$perm->isSysadmin() && !$bHasPermission) {
    +        $notification->displayNotification("error", i18n("Permission denied!"));
    +        exit();
    +    }
    +}
    +
    +cInclude("classes", "class.cl_db_backup.php");
    +
    +if ($backup_action == 'backupnow') {
    +    $oDB = new DB_ConLite();
    +    $oDB2 = new DB_ConLite();
    +
    +    $info_h1 = i18n("Starting Backup.");
    +    $info_h2 = ' ';
    +
    +    $restore = array();
    +    unset($_SESSION['restore']);
    +    $dump = array();
    +    unset($_SESSION['dump']);
    +
    +
    +    @set_time_limit(0);
    +
    +    //BOF Disable "STRICT" mode!
    +    $vers = $oDB->getClientInfo();
    +    if (substr($vers, 0, 1) > 4) {
    +        $oDB->query("SET SESSION sql_mode=''");
    +        //@mysql_query("SET SESSION sql_mode=''", $oDB->Link_ID);
    +    }
    +    //EOF Disable "STRICT" mode!
    +
    +    $mysql_version = '-- MySQL-Client-Version: ' . $oDB->getClientInfo() . "\n--\n";
    +
    +    $schema = '-- ConLite ' . $cfg['version'] . "\n" .
    +            '--' . "\n" .
    +            '-- ' . CL_BACKUP_VERSION . ' (c) 2012-' . date('Y') . ' php-backoffice.de' . "\n" .
    +            '--' . "\n" .
    +            '-- Database: ' . $cfg['db']['connection']['database'] . "\n" .
    +            '-- Database Server: ' . $oDB->getServerInfo() . "\n" .
    +            '--' . "\n" . $mysql_version .
    +            '-- Backup Date: ' . date("r") . "\n\n";
    +    $backup_file = 'dbd_' . $cfg['db']['connection']['database'] . '-' . date('YmdHis');
    +    $dump['file'] = CL_BACKUP_PATH . $backup_file;
    +
    +    if (!isset($dump['compress'])) {
    +        if (getEffectiveSetting("cl-backup", "use_gzip", false) == 'true') {
    +            $dump['compress'] = true;
    +            $dump['file'] .= '.sql.gz';
    +        } else {
    +            $dump['compress'] = false;
    +            $dump['file'] .= '.sql';
    +        }
    +    }
    +
    +    if (!isset($dump['complete_inserts'])) {
    +        if (getEffectiveSetting("cl-backup", "complete_inserts", false) == 'true') {
    +            $dump['complete_inserts'] = 'yes';
    +        }
    +    }
    +
    +    $oDB->query("SHOW TABLE STATUS FROM `" . $cfg['db']['connection']['database'] . "` LIKE '" . $cfg['sql']['sqlprefix'] . "_%'");
    +    $dump['num_tables'] = $oDB->num_rows();
    +
    +    //Tabellennamen in Array einlesen
    +    $dump['tables'] = Array();
    +    $dump['num_rows'] = -1;
    +    //echo "
    ";
    +    if ($dump['num_tables'] > 0) {
    +        $dump['num_rows'] = 0;
    +        for ($i = 0; $i < $dump['num_tables']; $i++) {
    +            $oDB->next_record();
    +            $row = $oDB->toArray(FETCH_ASSOC);
    +            $dump['tables'][$i] = $row['Name'];
    +            $oDB2->query("SELECT COUNT(*) FROM " . $row['Name']);
    +            $oDB2->next_record();
    +            //$result = mysql_query("SELECT COUNT(*) FROM ".$row['Name'], $oDB->Link_ID);
    +            $aTmp = $oDB2->toArray(FETCH_ASSOC);
    +            $dump['num_rows'] += $aTmp[0];
    +            //print_r($row);
    +        }
    +        $dump['nr'] = 0;
    +
    +        $dump['table_offset'] = 0;
    +        $_SESSION['dump'] = $dump;
    +        //echo '
    ';
    +        //print_r($dump);
    +        /*
    +         * Statuszeile kompatibel zu MySQLDumper (MSD)
    +         * AUFBAU der Statuszeile:
    +         *  -- Status:tabellenzahl:datensätze:Multipart:Datenbankname:script:scriptversion:Kommentar:MySQLVersion:Backupflags:SQLBefore:SQLAfter:Charset:EXTINFO
    +         *  Aufbau Backupflags (1 Zeichen pro Flag, 0 oder 1, 2=unbekannt)
    +         *  (complete inserts)(extended inserts)(ignore inserts)(delayed inserts)(downgrade)(lock tables)(optimize tables)
    +         */
    +        $statusline = array();
    +        $statusline['tables'] = $dump['num_tables'];
    +        $statusline['records'] = $dump['num_rows'];
    +        $statusline['part'] = 'MP_0';
    +        $statusline['dbname'] = $cfg['db']['connection']['database'];
    +        $statusline['script'] = 'php';
    +        $statusline['scriptversion'] = '1.24';
    +        $statusline['comment'] = 'Backup made by ' . CL_BACKUP_VERSION;
    +        $statusline['mysqlversion'] = $oDB->getServerInfo();
    +        $statusline['flags'] = '2222222';
    +        $statusline['sqlbefore'] = '';
    +        $statusline['sqlafter'] = '';
    +        $statusline['charset'] = $oDB->getClientEncoding();
    +        $statusline['extinfo'] = 'EXTINFO';
    +
    +        $sStatLine = "-- Status:";
    +        $sStatLine .= implode(":", $statusline) . "\n\n";
    +        ;
    +        $schema = $sStatLine . $schema;
    +        //die($schema);
    +        $oClBackup = new clDbBackup();
    +        $oClBackup->_writeToDumpFile($schema);
    +        $selbstaufruf = '';
    +    } else {
    +        $aMessage['level'] = Contenido_Notification::LEVEL_ERROR;
    +        $aMessage['text'] = "Error: Cannot read database!";
    +//else ERROR
    +    }
    +}
    +//Seite neu laden wenn noch nicht alle Tabellen ausgelesen sind
    +if ($dump['num_tables'] > 0 && $backup_action != 'backupnow') {
    +
    +    if (!is_object($oClBackup)) {
    +        $oClBackup = new clDbBackup();
    +    }
    +
    +    $info_h1 = i18n("Backup in Progress!");
    +
    +    @set_time_limit(0);
    +
    +    if ($dump['nr'] < $dump['num_tables']) {
    +        $nr = $dump['nr'];
    +        $dump['aufruf'] ++;
    +        $table_ok = i18n("Tables saved: ") . ($nr + 1) . '

    ' . i18n("Last processed: ") + . $dump['tables'][$nr] . '

    ' . i18n("Pageviews: ") . $dump['aufruf']; + + //Neue Tabelle + if ($dump['table_offset'] == 0) { + $dump['table_records'] = $oClBackup->_writeTableHeader($dump['tables'][$nr]); + $dump['anzahl_zeilen'] = CL_BACKUP_COUNT_LINES; + $dump['table_offset'] = 1; + $dump['zeilen_offset'] = 0; + } else { + //Daten aus Tabelle lesen + //GetTableData($dump['tables'][$nr]); + $oClBackup->_writeTableData($dump['tables'][$nr]); + } + + $_SESSION['dump'] = $dump; + + $selbstaufruf = ''; + //Verhindert Endlosschleife - Script wir nach MAX_RELOADS beendet + if ($dump['aufruf'] > CL_BACKUP_MAX_RELOADS) { + $selbstaufruf = ''; + } + } else { //Fertig + $info_h2 = ' '; + $info_h1 = i18n("Backup done!"); + $table_ok = i18n("Tables saved: ") . $dump['nr'] . '

    ' . i18n("Pageviews: ") . $dump['aufruf']; + $selbstaufruf = ''; + unset($_SESSION['dump']); + $oBackButton = new cHTMLLink($sess->self_url()); + $oBackButton->_setContent(i18n("Go Back to Overview")); + $button_back = $oBackButton->toHtml(); + $bFinalStep = true; + if (!is_object($oClBackup)) { + $oClBackup = new clDbBackup(); + } + $oClBackup->writeLog(); + } +} +//#### BACKUP ENDE ####### +// Let's build the file table +if (!isset($_SESSION['dump']) && !$bFinalStep) { + if (!is_object($oClBackup)) { + $oClBackup = new clDbBackup(); + } + $aFiles = $oClBackup->getDumpFiles(CL_BACKUP_PATH); + //print_r($aFiles); + $oFileList = new cScrollList(); + $oFileList->objTable->setID("files_tab"); + $oFileList->setHeader(mi18n("#"), mi18n("Date"), mi18n("Filename"), mi18n("Filesize"), mi18n("Tables/Entries"), "", mi18n("Actions")); + $oFileList->objHeaderItem->updateAttributes(array('style' => "width: 20px; padding: 0 4px;white-space:nowrap; border: 1px solid #B3B3B3; border-bottom: 0;")); + $oFileList->setSortable(1, true); + $oFileList->setSortable(2, true); + $iLoop = 0; + if (is_array($aFiles) && count($aFiles) > 0) { + foreach ($aFiles as $sKey => $aFile) { + // send file on request + if ($cl_action == 'download_file' && $fileid == $sKey) { + $oClBackup->sendFile(CL_BACKUP_PATH . $aFile['filename']); + die(); + } + + if ($cl_action == 'del_file' && $fileid == $sKey) { + if (unlink(CL_BACKUP_PATH . $aFile['filename'])) { + $notification->displayNotification('info', i18n("File successfully deleted.")); + continue; + } + } + + $oDelImg = new cHTMLImage(); + $oDelImg->setSrc($cfg['path']['contenido_html'] . $cfg['path']['images'] . "but_delete.gif"); + $oDelImg->setClass("img_but"); + $oDelImg->setAlt(i18n("Delete File")); + $oDelete = new cHTMLLink($sess->url($sess->self_url() . "&cl_action=del_file&fileid=$sKey"), "delete"); + $oDelete->setContent($oDelImg->render()); + + $oDownloadImg = new cHTMLImage(); + $oDownloadImg->setSrc($cfg['path']['contenido_html'] . $cfg['path']['images'] . "but_downloadlist.gif"); + $oDownloadImg->setClass("img_but"); + $oDownloadImg->setAlt(i18n("Download File")); + $oDownload = new cHTMLLink($sess->url($sess->self_url() . "&cl_action=download_file&fileid=$sKey"), "download"); + $oDownload->setContent($oDownloadImg->render()); + + $aFileStats = readStatusLineFromFile(CL_BACKUP_PATH . $aFile['filename']); + if (is_array($aFileStats)) { + $sFileStats = $aFileStats['tables'] . " / " . $aFileStats['records']; + } else { + $sFileStats = ''; + } + + $oFileList->setData($iLoop, $iLoop + 1, date("Y-m-d H:i", $aFile['ctime']), $aFile['filename'], human_readable_size($aFile['size']), $sFileStats, " ", $oDelete->render() . $oDownload->render()); + $iLoop++; + } + } + + $sFileList = $oFileList->render(true); +} + +function readStatusLineFromFile($sFile) { + $FileName = basename($sFile); + if (strtolower(substr($FileName, -2)) == 'gz') { + $fp = gzopen($sFile, "r"); + if ($fp === false) + die('Can\'t open file ' . $FileName); + $sline = gzgets($fp, 40960); + gzclose($fp); + } else { + $fp = fopen($sFile, "r"); + if ($fp === false) + die('Can\'t open file ' . $FileName); + $sline = fgets($fp, 5000); + fclose($fp); + } + $aStatusLine = clStatusLine2Array($sline); + return $aStatusLine; +} + +function clStatusLine2Array($sLine) { + + if (substr($sLine, 0, 9) != "-- Status") + return false; + + $aStatus = explode(":", $sLine); + + $aRet = array(); + $aRet['tables'] = $aStatus[1]; + $aRet['records'] = $aStatus[2]; + $aRet['dbname'] = $aStatus[4]; + if ((isset($aStatus[12])) && trim($aStatus[12]) != 'EXTINFO') { + $aRet['charset'] = $aStatus[12]; + } else { + $aRet['charset'] = '?'; + } + return $aRet; +} +?> + + + + + <?php echo TITLE; ?> + + + + '; + ?> +
    + +
    +

    +

    +

    +

    +

    +
    +
    + +
    + +
    + + + + + \ No newline at end of file diff --git a/conlite/includes/include.system_purge.php b/conlite/includes/include.system_purge.php new file mode 100644 index 0000000..99a91d3 --- /dev/null +++ b/conlite/includes/include.system_purge.php @@ -0,0 +1,226 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.8.12 + * + * $Id: include.system_purge.php 86 2012-06-01 16:46:19Z oldperl $: + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude('includes', 'functions.database.php'); + +$tpl->reset(); + +$iClientSelectSize = 4; +$oClient = new Client(); +$aAvailableClient = $oClient->getAvailableClients(); + +$sInfoMsg = ''; + +$action = 'do_purge'; +if (($action == "do_purge") && (!$perm->have_perm_area_action_anyitem($area, $action))) { + $notification->displayNotification("error", i18n("Permission denied")); +} else { + if (isset($_POST['send']) && $_POST['send'] == 'store') { + $aClientToClear = array(); + $aClientName = array(); + + if (isset($_POST['selectClient']) && $_POST['selectClient'] == 'all') { + // selected all clients + + foreach ($aAvailableClient as $iClientId => $aClient) { + $aClientToClear[] = $iClientId; + } + + } else if (isset($_POST['purge_clients']) && is_array($_POST['purge_clients']) && count($_POST['purge_clients']) > 0) { + // selected multiple clients + foreach ($_POST['purge_clients'] as $iClientId) { + $aClientToClear[] = (int)$iClientId; + } + + } else if (isset($_POST['purge_clients']) && (int)$_POST['purge_clients'] > 0) { + // selected single client + $aClientToClear[] = (int)$_POST['purge_clients']; + } + + $bError = false; + $sErrorMsg = ''; + $oPurge = new Purge($db, $cfg, $cfgClient); + + if (count($aClientToClear) > 0) { + // execute the selected actions + + foreach ($aAvailableClient as $iClientId => $aClient) { + $aClientName[$iClientId] = $aClient['name']; + } + + + foreach ($aClientToClear as $iClientId) { + $iClientId = (int) $iClientId; + if ($iClientId > 0) { + if (isset($_POST['conCode']) && $_POST['conCode'] == 1) { + if (!$oPurge->resetClientConCode($iClientId)) { + $bError = true; + $sErrorMsg .= i18n("Client ") . $aClientName[$iClientId] . ': ' . + sprintf(i18n("The entries of %s table are not deleted!"), $cfg['tab']['code']) . "
    "; + } + } + + if (isset($_POST['conCatArt']) && $_POST['conCatArt'] == 1) { + if (!$oPurge->resetClientConCatArt($iClientId)) { + $bError = true; + $sErrorMsg .= i18n("Client ") . $aClientName[$iClientId] . ': ' . + sprintf(i18n("The %s is not updated!"), $cfg['tab']['cat_art']) . "
    "; + } + } + + if (isset($_POST['clientCache']) && $_POST['clientCache'] == 1) { + if (!$oPurge->clearClientCache($iClientId)) { + $bError = true; + $sErrorMsg .= i18n("Client ") . $aClientName[$iClientId] . ': ' . + i18n("The cache is not deleted!") . "
    "; + } + } + + if (isset($_POST['clientLog']) && $_POST['clientLog'] == 1) { + if (!$oPurge->clearClientLog($iClientId)) { + $bError = true; + $sErrorMsg .= i18n("Client ") . $aClientName[$iClientId] . ': ' . + i18n("The log is not deleted!") . "
    "; + } + } + + if (isset($_POST['clientHistory']) && $_POST['clientHistory'] == 1) { + $bKeep = ($_POST['keepHistory'] == 1 && (int) $_POST['keepHistoryNumber'] > 0) ? true : false; + if (!$oPurge->clearClientHistory($iClientId, $bKeep, (int) $_POST['keepHistoryNumber'])) { + $bError = true; + $sErrorMsg .= i18n("Client ") . $aClientName[$iClientId] . ': ' . + i18n("The history is not deleted!") . "
    "; + } + } + + if ($sErrorMsg != '') { + $sErrorMsg .= "
    "; + } + + } + } + } + + if (isset($_POST['conInuse']) && $_POST['conInuse'] == 1) { + if (!$oPurge->resetConInuse()) { + $bError = true; + $sErrorMsg .= sprintf(i18n("The entries of %s table are not deleted!"), $cfg['tab']['inuse']) . "
    "; + } + } + + if (isset($_POST['conPHPLibActiveSession']) && $_POST['conPHPLibActiveSession'] == 1) { + if (!$oPurge->resetPHPLibActiveSession()) { + $bError = true; + $sErrorMsg .= sprintf(i18n("The entries of %s table are not deleted!"), $cfg['tab']['phplib_active_sessions']) . + "
    "; + } + } + + if (isset($_POST['conLog']) && $_POST['conLog'] == 1) { + if (!$oPurge->clearConLog()) { + $bError = true; + $sErrorMsg .= i18n("The contenido log is not cleaned!") . "
    "; + } + } + + if (isset($_POST['conCache']) && $_POST['conCache'] == 1) { + if (!$oPurge->clearConCache()) { + $bError = true; + $sErrorMsg .= i18n("The contenido cache is not deleted!") . "
    "; + } + } + + if (isset($_POST['conCronjobs']) && $_POST['conCronjobs'] == 1) { + if (!$oPurge->clearConCronjob()) { + $bError = true; + $sErrorMsg .= i18n("The contenido cronjobs are not cleaned!") . "
    "; + } + } + + if (isset($_POST['conSequence']) && $_POST['conSequence'] == 1) { + if (!$oPurge->updateConSequence()) { + $bError = true; + $sErrorMsg .= i18n("Update of sequence table not completed!") . "
    "; + } + } + + if ($bError === false) { + $sInfoMsg = $notification->returnNotification("info", i18n("The changes were successfully executed.")); + } else { + $sErrorComplete = i18n("The changes were not all successfully completed.") . "

    " . $sErrorMsg; + $sInfoMsg = $notification->returnNotification("error", $sErrorComplete); + } + } + + $oHtmlSelectHour = new cHTMLSelectElement ('purge_clients[]', '', 'client_select'); + + $i = 0; + foreach ($aAvailableClient as $iClientId => $aClient) { + $oHtmlSelectOption = new cHTMLOptionElement($aClient['name'], $iClientId, false); + $oHtmlSelectHour->addOptionElement($i, $oHtmlSelectOption); + $i++; + } + + $oHtmlSelectHour->setMultiselect(); + $oHtmlSelectHour->setSize($iClientSelectSize); + $sSelectClient = $oHtmlSelectHour->toHtml(); + $tpl->set('s', 'SELECT_CLIENT', $sSelectClient); + + $tpl->set('s', 'TITLE', i18n("System purge")); + $tpl->set('s', 'ERR_MSG_SELECT_CLIENT', i18n("No Client selected!")); + + $tpl->set('s', 'CONTENIDO', $contenido); + + $tpl->set('s', 'GROUP_CLIENT', i18n("Client")); + $tpl->set('s', 'CLIENT_SELECT_ALL', i18n("all clients")); + $tpl->set('s', 'CLIENT_SELECT', i18n("from list")); + $tpl->set('s', 'CLIENT_CHOOSE', i18n("Select clients")); + $tpl->set('s', 'CON_CODE', sprintf(i18n("Reset the table %s"), $cfg['tab']['code'])); + $tpl->set('s', 'CON_CAT_ART', sprintf(i18n("Activate the code generation in %s"), $cfg['tab']['code'], $cfg['tab']['cat_art'])); + $tpl->set('s', 'CON_INUSE', sprintf(i18n("Reset the table %s"), $cfg['tab']['inuse'])); + $tpl->set('s', 'CLIENT_CACHE', i18n("Clear client cache")); + $tpl->set('s', 'CLIENT_LOG', i18n("Clear client log file")); + $tpl->set('s', 'CLIENT_HISTORY', i18n("Clear client history")); + $tpl->set('s', 'NUMBER_OF_HISTORY', i18n("Keep last histories")); + + $tpl->set('s', 'GROUP_CONTENIDO', i18n("Contenido")); + $tpl->set('s', 'CON_LOG', i18n("Clear contenido log file")); + $tpl->set('s', 'CON_ACTIVE_SESSION', sprintf(i18n("Reset the table %s"), $cfg['tab']['phplib_active_sessions'])); + $tpl->set('s', 'CON_CACHE', i18n("Clear contenido cache")); + $tpl->set('s', 'CON_CRONJOB', i18n("Reset cronjobs")); + $tpl->set('s', 'CON_SEQUENCE', i18n("Update sequence table")); + + $tpl->set('s', 'BOX_TITLE', i18n("System purge")); + $tpl->set('s', 'BOX_MESSAGE', i18n("These changes can not be cancelled.") . '

    ' . i18n("Do you really want to complete it?")); + + $tpl->set('s', 'INFO_MSG_BOX', $sInfoMsg); + $tpl->set('s', 'ERR_MSG_BOX', $notification->returnNotification("error", '')); + + $tpl->set('s', 'ERR_MSG_NO_ACTION', i18n("No action selected!")); + + $tpl->set('s', 'SUBMIT_TEXT', i18n("Send")); + + $tpl->generate($cfg['path']['templates'] . $cfg['templates']['system_purge']); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.system_sysvalues.php b/conlite/includes/include.system_sysvalues.php new file mode 100644 index 0000000..896298d --- /dev/null +++ b/conlite/includes/include.system_sysvalues.php @@ -0,0 +1,139 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-08-15 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2011-05-18, Ortwin Pinke, clean url due to validate page + * + * $Id: include.system_sysvalues.php 378 2015-11-09 20:01:25Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl->reset(); + +/* + * print out tmp_notifications if any action has been done +*/ +if (isset($tmp_notification)) +{ + $tpl->set('s', 'TEMPNOTIFICATION', $tmp_notification); +} +else +{ + $tpl->set('s', 'TEMPNOTIFICATION', ''); +} + +/* get system variables for output */ +writeSystemValuesOutput($usage='output'); + +// error log +$sNewErrorLogPath = $cfg['path']['conlite_logs']."errorlog.txt"; +$sOldErrorLogPath = $cfg['path']['contenido']."logs/errorlog.txt"; +$sUseLog = ''; +$bHasLog = false; + +if(file_exists($sNewErrorLogPath)) { + $sUseLog = $sNewErrorLogPath; + $bHasLog = true; +} else if(file_exists($sOldErrorLogPath)) { + $sUseLog = $sOldErrorLogPath; + $bHasLog = true; +} +if($bHasLog) { + $errorLogHandle = fopen ($sUseLog, "rb"); + $txtAreaHeight = "200"; + + /* If the file is larger than 16KB, seek to the file's length - 16KB) */ + fseek($errorLogHandle, -16384,SEEK_END); + + while (!feof($errorLogHandle)) + { + $errorLogBuffer .= fgets($errorLogHandle, 16384); + } + fclose ($errorLogHandle); + if (strlen ($errorLogBuffer) == 0) { + $errorLogBuffer = i18n("No error log entries found"); + $txtAreaHeight = "20"; + } +} else { + $errorLogBuffer = i18n("No error log file found"); + $txtAreaHeight = "20"; +} +$tpl->set('s', 'TXTERRORLOGSIZE', $txtAreaHeight); +$tpl->set('s', 'ERRORLOG', $errorLogBuffer); + +// upgrade error log +$sNewErrorLogPath = $cfg['path']['conlite_logs']."install.log.txt"; +$sOldErrorLogPath = $cfg['path']['contenido']."logs/install.log.txt"; +$sUseLog = ''; +$bHasLog = false; + +if(file_exists($sNewErrorLogPath)) { + $sUseLog = $sNewErrorLogPath; + $bHasLog = true; +} else if(file_exists($sOldErrorLogPath)) { + $sUseLog = $sOldErrorLogPath; + $bHasLog = true; +} +if($bHasLog) { + $upgErrorLogHandle = fopen ($sUseLog, "rb"); + $txtAreaHeight = "200"; + + /* If the file is larger than 200KB, seek to the file's length - 200KB) */ + fseek($upgErrorLogHandle, -16384,SEEK_END); + + while (!feof($upgErrorLogHandle)) + { + $upgErrorLogBuffer.= fgets($upgErrorLogHandle, 16384); + } + fclose ($upgErrorLogHandle); + if (strlen ($upgErrorLogBuffer) == 0) + { + $upgErrorLogBuffer = i18n("No install error log entries found"); + $txtAreaHeight = "20"; + } + +} +else +{ + $upgErrorLogBuffer = i18n("No error log entries found"); + $txtAreaHeight = "20"; +} +$tpl->set('s', 'TXTUPGERRORLOGSIZE', $txtAreaHeight); +$tpl->set('s', 'UPGERRORLOG', $upgErrorLogBuffer); + +/* + * parameter which log shoult be cleared + * log = 1 clear /contenido/logs/errorlog.txt + * log = 2 clear /contenido/upgrade_errorlog.txt +*/ +$tpl->set('s', 'LOGEMPTYURL', clHtmlEntities($sess->url("main.php?area=$area&frame=$frame&action=emptyLog&log=1"))); +$tpl->set('s', 'UPGLOGEMPTYURL', clHtmlEntities($sess->url("main.php?area=$area&frame=$frame&action=emptyLog&log=2"))); + +// parse out template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['systam_variables']); +?> \ No newline at end of file diff --git a/conlite/includes/include.systemsettings.php b/conlite/includes/include.systemsettings.php new file mode 100644 index 0000000..67be896 --- /dev/null +++ b/conlite/includes/include.systemsettings.php @@ -0,0 +1,200 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-11-18 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-11-13, Timo Trautmann - Fixed wron escaping of chars + * + * $Id: include.systemsettings.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$aManagedValues = array('versioning_prune_limit', 'update_check', 'update_news_feed', 'versioning_path', 'versioning_activated', + 'update_check_period', 'system_clickmenu', 'system_mail_host', 'system_mail_sender', + 'system_mail_sender_name', 'pw_request_enable', 'maintenance_mode', 'edit_area_activated', + 'backend_preferred_idclient', 'generator_basehref', 'generator_xhtml', 'imagemagick_available', + 'system_insight_editing_activated'); + +if ($action == "systemsettings_save_item") +{ + if (!in_array($systype.'_'.$sysname, $aManagedValues)) { + setSystemProperty ($systype, $sysname, $sysvalue, $csidsystemprop); + } else { + $sWarning = $notification->returnNotification("warning", i18n('Please set this property in systemsettings directly'), 1).'
    '; + } +} + +if ($action == "systemsettings_delete_item") +{ + deleteSystemProperty($systype, $sysname); +} + +$settings = getSystemProperties(1); + +$list = new UI_List; +$list->setSolidBorder(true); +$list->setCell(1,1, i18n("Type")); +$list->setCell(1,2, i18n("Name")); +$list->setCell(1,3, i18n("Value")); +$list->setCell(1,4, " "); +$list->setBgColor(1,$cfg['color']['table_header']); +$list->setBorder(1); + +$count = 2; + +$oLinkEdit = new Link; +$oLinkEdit->setCLink($area, $frame, "systemsettings_edit_item"); +$oLinkEdit->setContent(''.i18n('); + +$oLinkForward = new Link; +$oLinkForward->setCLink('system_configuration', $frame, ""); +$oLinkForward->setContent(''.i18n('); + +$oLinkDelete = new Link; +$oLinkDelete->setCLink($area, $frame, "systemsettings_delete_item"); +$oLinkDelete->setContent(''.i18n('); + +$oLinkDeleteForward = ''.i18n('; + +$spacer = new cHTMLImage; +$spacer->setWidth(5); + +if (is_array($settings)) +{ + foreach ($settings as $key => $types) + { + foreach ($types as $type => $value) + { + $oLinkEdit->setCustom("sysname", urlencode($type)); + $oLinkEdit->setCustom("systype", urlencode($key)); + + $oLinkDelete->setCustom("sysname", urlencode($type)); + $oLinkDelete->setCustom("systype", urlencode($key)); + + $link = $oLinkEdit; + $dlink = $oLinkDelete->render(); + + if (in_array($key.'_'.$type, $aManagedValues)) { + #ignore record + + } else if (($action == "systemsettings_edit_item") && (stripslashes($systype) == $key) && (stripslashes($sysname) == $type)) { + $oInputboxValue = new cHTMLTextbox ("sysvalue", $value['value']); + $oInputboxValue->setStyle("border:1px;border-style:solid;border-color:black;width:200px;"); + + $oInputboxName = new cHTMLTextbox ("sysname", $type); + $oInputboxName->setStyle("border:1px;border-style:solid;border-color:black;width:200px;"); + + $oInputboxType = new cHTMLTextbox ("systype", $key); + $oInputboxType->setStyle("border:1px;border-style:solid;border-color:black;width:200px;"); + + $hidden = ''; + $sSubmit = ''; + + $list->setCell($count,1, $oInputboxType->render(true)); + $list->setCell($count,2, $oInputboxName->render(true)); + $list->setCell($count,3, $oInputboxValue->render(true).$hidden.$sSubmit); + + } else { + $sMouseoverTemplate = '%s'; + + if (strlen($type) > 35) { + $sShort = clHtmlSpecialChars(capiStrTrimHard($type, 35)); + $type = sprintf($sMouseoverTemplate, clHtmlSpecialChars(addslashes($type), ENT_QUOTES), $sShort); + } + + if (strlen($value['value']) > 35) { + $sShort = clHtmlSpecialChars(capiStrTrimHard($value['value'], 35)); + $value['value'] = sprintf($sMouseoverTemplate, clHtmlSpecialChars(addslashes($value['value']), ENT_QUOTES), $sShort); + } + + if (strlen($key) > 35) { + $sShort = clHtmlSpecialChars(capiStrTrimHard($key, 35)); + $key = sprintf($sMouseoverTemplate, clHtmlSpecialChars(addslashes($key), ENT_QUOTES), $sShort); + } + + !strlen(trim($value['value'])) ? $sValue = ' ' : $sValue = $value['value']; + + $list->setCell($count,1, $key); + $list->setCell($count,2, $type); + $list->setCell($count,3, $sValue); + } + + if (!in_array($key.'_'.$type, $aManagedValues)) { + $list->setCell($count,4, $spacer->render().$link->render().$spacer->render().$dlink.$spacer->render()); + $count++; + } + } + } +} + +if ($count == 2) +{ + $list->setCell($count, 4, ""); + $list->setCell($count, 1, i18n("No defined properties")); + $list->setCell($count, 2, ""); + $list->setCell($count, 3, ""); +} +unset($form); + +$form = new UI_Table_Form("systemsettings"); +$form->setVar("area",$area); +$form->setVar("frame", $frame); +$form->setVar("action", "systemsettings_save_item"); +$form->addHeader(i18n("Add new variable")); +$inputbox = new cHTMLTextbox ("systype"); +$inputbox->setStyle("border:1px;border-style:solid;border-color:black;"); +$form->add(i18n("Type"),$inputbox->render()); + +$inputbox = new cHTMLTextbox ("sysname"); +$inputbox->setStyle("border:1px;border-style:solid;border-color:black;"); +$form->add(i18n("Name"),$inputbox->render()); + +$inputbox = new cHTMLTextbox ("sysvalue"); +$inputbox->setStyle("border:1px;border-style:solid;border-color:black;"); +$form->add(i18n("Value"),$inputbox->render()); + +if ($action == "systemsettings_edit_item") +{ + $form2 = new UI_Form("systemsettings"); + $form2->setVar("area",$area); + $form2->setVar("frame", $frame); + $form2->setVar("action", "systemsettings_save_item"); + $form2->add('list', $list->render()); + $sListstring = $form2->render(); +} else { + $sListstring = $list->render(); +} + +$page = new UI_Page; +$sTooltippScript = ' + '; + +$page->addScript('tooltippstyle', ''); +$page->setContent($sWarning.$sTooltippScript."\n".$sListstring."
    ".$form->render()); +$page->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.todo.popup.php b/conlite/includes/include.todo.popup.php new file mode 100644 index 0000000..0a121ff --- /dev/null +++ b/conlite/includes/include.todo.popup.php @@ -0,0 +1,136 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * + * $Id: include.todo.popup.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$cpage = new cPage; + +if ($action == "todo_save_item") +{ + $todo = new TODOCollection; + + $subject = stripslashes($subject); + $message = stripslashes($message); + + if (is_array($userassignment)) { + foreach ($userassignment as $key => $value) { + $item = $todo->create($itemtype, $itemid, strtotime($reminderdate), $subject, $message, $notiemail, $notibackend, $auth->auth["uid"]); + $item->set("recipient", $value); + $item->setProperty("todo", "enddate", $enddate); + $item->store(); + } + } + + $cpage->setContent(""); +} else { + $ui = new UI_Table_Form("reminder"); + $ui->addHeader(i18n("Add TODO item")); + + $ui->setVar("area",$area); + $ui->setVar("frame", $frame); + $ui->setVar("action", "todo_save_item"); + $ui->setVar("itemtype", $itemtype); + $ui->setVar("itemid", $itemid); + + $subject = new cHTMLTextbox("subject", htmldecode(stripslashes(urldecode($subject))),60); + $ui->add(i18n("Subject"), $subject->render()); + + $message = new cHTMLTextarea("message", htmldecode(stripslashes(urldecode($message)))); + $ui->add(i18n("Description"), $message->render()); + + $reminderdate = new cHTMLTextbox("reminderdate", '', '', '', "reminderdate"); + + $datepopup = ' Endzeitpunkt w�hlen'; + $ui->add(i18n("Reminder date"),$reminderdate->render().$datepopup); + + $reminderdue = new cHTMLTextbox("enddate", '', '', '', "enddate"); + $duepopup = ' Endzeitpunkt w�hlen'; + $ui->add(i18n("End date"),$reminderdue->render().$duepopup); + $notiemail = new cHTMLCheckbox("notiemail", i18n("eMail notification")); + + $ui->add(i18n("Reminder options"), $notiemail->toHTML()); + $calscript = ''; + + $userselect = new cHTMLSelectElement("userassignment[]"); + + + $UsersClass = new Users; + foreach ($UsersClass->getAccessibleUsers(explode(',', $auth->auth['perm']), true) as $key => $value) + { + $acusers[$key] = $value["username"]." (".$value["realname"].")"; + } + + asort($acusers); + + $userselect->autoFill($acusers); + $userselect->setDefault($auth->auth["uid"]); + $userselect->setMultiselect(); + $userselect->setSize(5); + + $ui->add(i18n("Assigned to"), $userselect->render()); + $cpage->setcontent($ui->render().$calscript); + + + + $cpage->addScript("cal", ' + + + '); +} +$cpage->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.tpl_edit_form.php b/conlite/includes/include.tpl_edit_form.php new file mode 100644 index 0000000..ae7d9ae --- /dev/null +++ b/conlite/includes/include.tpl_edit_form.php @@ -0,0 +1,254 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2009-12-04, Dominik Ziegler, added notice for default module and removed auto select of module if there is no module set + * + * $Id: include.tpl_edit_form.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$tpl2 = new Template(); + +if (($action == "tpl_new") && (!$perm->have_perm_area_action_anyitem($area, $action))) { + $notification->displayNotification("error", i18n("Permission denied")); +} else { + + if ($action == "tpl_new") { + $tplname = i18n("- New Template -"); + } + + $sql = "SELECT + a.idtpl, a.name as name, a.description, a.idlay, b.description as laydescription, a.defaulttemplate + FROM + " . $cfg['tab']['tpl'] . " AS a + LEFT JOIN + " . $cfg['tab']['lay'] . " AS b + ON a.idlay=b.idlay + WHERE a.idtpl='" . Contenido_Security::toInteger($idtpl) . "' + ORDER BY name"; + + $db->query($sql); + + if ($db->next_record()) { + $idtpl = $db->f("idtpl"); + $tplname = $db->f("name"); + $description = $db->f("description"); + $idlay = $db->f("idlay"); + $laydescription = nl2br($db->f("laydescription")); + $vdefault = $db->f("defaulttemplate"); + } + + $sql = "SELECT + number, idmod + FROM + " . $cfg['tab']['container'] . " + WHERE + idtpl='" . Contenido_Security::toInteger($idtpl) . "'"; + + $db->query($sql); + while ($db->next_record()) { + $a_c[$db->f("number")] = $db->f("idmod"); + } + + //*************** List layouts **************** + $tpl2->set('s', 'NAME', 'idlay'); + $tpl2->set('s', 'CLASS', 'text_medium'); + $tpl2->set('s', 'OPTIONS', 'onchange="tplform.changelayout.value=1;tplform.submit();"'); + + if ($idlay != 0) { + $tpl2->set('d', 'VALUE', 0); + $tpl2->set('d', 'CAPTION', '--- ' . i18n("none") . ' ---'); + $tpl2->set('d', 'SELECTED', ''); + $tpl2->next(); + } else { + $tpl2->set('d', 'VALUE', 0); + $tpl2->set('d', 'CAPTION', '--- ' . i18n("none") . ' ---'); + $tpl2->set('d', 'SELECTED', 'selected'); + $tpl2->next(); + } + $sql = "SELECT + idlay, name + FROM + " . $cfg['tab']['lay'] . " + WHERE + idclient='" . Contenido_Security::toInteger($client) . "' + ORDER BY name"; + + $db->query($sql); + + while ($db->next_record()) { + if ($db->f("idlay") != $idlay) { + $tpl2->set('d', 'VALUE', $db->f("idlay")); + $tpl2->set('d', 'CAPTION', $db->f("name")); + $tpl2->set('d', 'SELECTED', ''); + $tpl2->next(); + } else { + $tpl2->set('d', 'VALUE', $db->f("idlay")); + $tpl2->set('d', 'CAPTION', $db->f("name")); + $tpl2->set('d', 'SELECTED', 'selected'); + $tpl2->next(); + } + } + + $select = $tpl2->generate($cfg['path']['templates'] . $cfg['templates']['generic_select'], true); + + $sql = "SELECT + idmod, name, type + FROM + " . $cfg['tab']['mod'] . " + WHERE + idclient='" . Contenido_Security::toInteger($client) . "' + ORDER BY name"; + + $db->query($sql); + + $modules = array(); + + while ($db->next_record()) { + $modules[$db->f("idmod")]["name"] = $db->f("name"); + $modules[$db->f("idmod")]["type"] = $db->f("type"); + } + + + $form = new UI_Table_Form("tplform"); + $form->setVar("area", $area); + $form->setVar("changelayout", 0); + $form->setVar("frame", $frame); + $form->setVar("action", "tpl_edit"); + $form->setVar("idtpl", $idtpl); + if (!$idlay) { + $form->setVar("createmode", 1); + } + $form->addHeader(i18n("Edit template")); + + $name = new cHTMLTextbox("tplname", $tplname, 35); + $form->add(i18n("Name"), $name->render()); + + $descr = new cHTMLTextarea("description", $description); + $form->add(i18n("Description"), $descr->render()); + + + $standardcb = new cHTMLCheckbox("vdefault", 1, "", $vdefault); + $form->add(i18n("Default"), $standardcb->toHTML(false)); + + $form->add(i18n("Layout"), $select); + $form->add(i18n("Layout description"), $laydescription); + + if ($idlay) { + $oLayout = new cApiLayout($idlay); + $raw_code = ($oLayout->virgin) ? "" : $oLayout->getLayout(); + tplPreparseLayout($idlay, $raw_code); + $tmp_returnstring = tplBrowseLayoutForContainers($idlay, $raw_code); + $a_container = explode("&", $tmp_returnstring); + foreach ($a_container as $key => $value) { + if ($value != 0) { + // Loop through containers **************** + $name = tplGetContainerName($idlay, $value); + $modselect = new cHTMLSelectElement("c[" . $value . "]"); + + if ($name != "") { + $caption = $name . " (Container $value)"; + } else { + $caption = 'Container ' . $value; + } + + $mode = tplGetContainerMode($idlay, $value); + $defaultModuleNotice = ''; + + if ($mode == "fixed") { + $default = tplGetContainerDefault($idlay, $value); + + foreach ($modules as $key => $val) { + + if ($val["name"] == $default) { + $option = new cHTMLOptionElement($val["name"], $key); + + if ($a_c[$value] == $key) { + $option->setSelected(true); + } + + $modselect->addOptionElement($key, $option); + } + } + } else { + $default = tplGetContainerDefault($idlay, $value); + + if ($mode == "optional" || $mode == "") { + $option = new cHTMLOptionElement("-- " . i18n("none") . " --", 0); + + if (isset($a_c[$value]) && $a_c[$value] != 0) { + $option->setSelected(false); + } else { + $option->setSelected(true); + } + + $modselect->addOptionElement(0, $option); + } + + $allowedtypes = tplGetContainerTypes($idlay, $value); + + foreach ($modules as $key => $val) { + $option = new cHTMLOptionElement($val["name"], $key); + + //if ($a_c[$value] == $key || ($a_c[$value] == 0 && $val["name"] == $default)) + if ($a_c[$value] == $key || (($a_c[$value] == 0 && $val["name"] == $default) && $createmode == 1)) { + $option->setSelected(true); + } + + if (count($allowedtypes) > 0) { + if (in_array($val["type"], $allowedtypes) || $val["type"] == "") { + $modselect->addOptionElement($key, $option); + } + } else { + $modselect->addOptionElement($key, $option); + } + } + + if ($default != "" && $modules[$a_c[$value]]["name"] != $default && $createmode != 1) { + $defaultModuleNotice = " (" . i18n('Default') . ": " . $default . ")"; + } + } + + $form->add($caption, $modselect->render() . $defaultModuleNotice); + } + } + } + + $page = new cPage; + $page->setReload(); + + $page->setSubnav("idtpl=$idtpl", "tpl"); + + if ($action != "tpl_duplicate") { + $page->setContent($form->render()); + } + + $page->render(); +} +?> \ No newline at end of file diff --git a/conlite/includes/include.tpl_new.php b/conlite/includes/include.tpl_new.php new file mode 100644 index 0000000..63b6781 --- /dev/null +++ b/conlite/includes/include.tpl_new.php @@ -0,0 +1,44 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-27 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.tpl_new.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$tpl->reset(); +if ((int) $client > 0) { + $tpl->set('s', 'ACTION', ''); +} else { + $tpl->set('s', 'ACTION', i18n('No Client selected')); +} +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['left_top']); +?> diff --git a/conlite/includes/include.tpl_overview.php b/conlite/includes/include.tpl_overview.php new file mode 100644 index 0000000..b8e1ab0 --- /dev/null +++ b/conlite/includes/include.tpl_overview.php @@ -0,0 +1,131 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-03-27 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * modified 2010-08-18, Munkh-Ulzii Balidar, added functionality to show the used information + * + * $Id: include.tpl_overview.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$sql = "SELECT + * + FROM + ".$cfg["tab"]["tpl"]." + WHERE + idclient = '".Contenido_Security::toInteger($client)."' + ORDER BY + name"; + +$db->query($sql); +$tpl->reset(); + +$tpl->set('s', 'SID', $sess->id); + +while ( $db->next_record() ) { + + if ( $perm->have_perm_item($area, $db->f("idtpl")) || + $perm->have_perm_area_action("tpl" , "tpl_delete") || + $perm->have_perm_area_action("tpl" , "tpl_duplicate") || + $perm->have_perm_area_action("tpl_edit" , "tpl_edit") || + $perm->have_perm_area_action("tpl_edit" , "tpl_new") || + $perm->have_perm_area_action("tpl_visual" , "tpl_visedit") + ) { + $name = $db->f('name'); + $descr = $db->f('description'); + $idtpl = $db->f("idtpl"); + + $bgcolor = ( is_int($tpl->dyn_cnt / 2) ) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + $tpl->set('d', 'BGCOLOR', $bgcolor); + + # create javascript multilink + $tmp_mstr = '%s'; + + if ($db->f("defaulttemplate") == 1) + { + $mstr = sprintf($tmp_mstr, clHtmlSpecialChars($descr), 'right_top', + $sess->url("main.php?area=tpl&frame=3&idtpl=$idtpl"), + 'right_bottom', + $sess->url("main.php?area=tpl_edit&frame=4&idtpl=$idtpl"), + "".$name.""); + } else { + $mstr = sprintf($tmp_mstr, clHtmlSpecialChars($descr), 'right_top', + $sess->url("main.php?area=tpl&frame=3&idtpl=$idtpl"), + 'right_bottom', + $sess->url("main.php?area=tpl_edit&frame=4&idtpl=$idtpl"), + $name); + + } + + if ($perm->have_perm_area_action_item("tpl_edit","tpl_edit",$db->f("idtpl"))) { + $tpl->set('d', 'NAME', $mstr); + } else { + $tpl->set('d', 'NAME', $name); + } + + /* Check if template is in use */ + $inUse = tplIsTemplateInUse($idtpl); + + $inUseString = i18n("Click for more information about usage"); + + if (!$inUse && ($perm->have_perm_area_action_item("tpl","tpl_delete",$db->f("idtpl")))) { + $delTitle = i18n("Delete template"); + $delDescr = sprintf(i18n("Do you really want to delete the following template:

    %s
    "),clHtmlSpecialChars($name)); + + $tpl->set('d', 'DELETE', ''.$delTitle.''); + $tpl->set('d', 'INUSE', ''); + } else { + $delDescription = i18n("Template in use, cannot delete"); + $tpl->set('d', 'DELETE',''.$delDescription.''); + $tpl->set('d', 'INUSE', ''.$inUseString.''); + } + + if ($perm->have_perm_area_action_item("tpl","tpl_dup", $db->f("idtpl"))) { + $copybutton = ''.i18n('; + + } else { + $copybutton = ''; + } + + $tpl->set('d', 'COPY', $copybutton); + $tpl->set('d', 'ID', 'tpl'.$tpl->dyn_cnt); + + $tpl->next(); + } +} + +//datas for show of used info per ajax +$tpl->set('s', 'AREA', $area); +$tpl->set('s', 'SESSION', $contenido); +$tpl->set('s', 'AJAXURL', $cfg['path']['contenido_fullhtml'].'ajaxmain.php'); +$tpl->set('s', 'BOX_TITLE', i18n("The template '%s' is used for following categories and articles") . ":"); +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['tpl_overview']); + +?> diff --git a/conlite/includes/include.tpl_visualedit.php b/conlite/includes/include.tpl_visualedit.php new file mode 100644 index 0000000..618673c --- /dev/null +++ b/conlite/includes/include.tpl_visualedit.php @@ -0,0 +1,233 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-15 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2009-01-08, Timo Trautmann fixed bug: Changes in Head Containers in visualedit were not stored + * modified 2009-10-13, Murat Purc, Fixed bug in visualedit replacements (see [#CON-273]) and othe improvements + * + * $Id: include.tpl_visualedit.php 316 2014-06-27 14:49:54Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude('includes', 'functions.tpl.php'); + +$idtpl = Contenido_Security::toInteger($idtpl); +$client = Contenido_Security::toInteger($client); + +$sql = "SELECT + a.idtpl, a.name as name, a.description, a.idlay, b.description as laydescription, defaulttemplate + FROM + " . $cfg['tab']['tpl'] . " AS a + LEFT JOIN + " . $cfg['tab']['lay'] . " AS b + ON a.idlay=b.idlay + WHERE a.idtpl='" . $idtpl . "' + ORDER BY name"; + +$db->query($sql); +$db->next_record(); + +$idtpl = (int) $db->f('idtpl'); +$tplname = $db->f('name'); +$description = $db->f('description'); +$idlay = (int) $db->f('idlay'); +$laydescription = nl2br($db->f('laydescription')); +$bIsDefault = $db->f('defaulttemplate'); + + +$sql = "SELECT number, idmod FROM " . $cfg['tab']['container'] . " WHERE idtpl='" . $idtpl . "'"; +$db->query($sql); +while ($db->next_record()) { + $a_c[$db->f('number')] = $db->f('idmod'); +} + +$modules = array(); +$sql = "SELECT idmod, name, type FROM " . $cfg['tab']['mod'] . " WHERE idclient='" . $client . "' ORDER BY name"; +$db->query($sql); +while ($db->next_record()) { + $modules[$db->f('idmod')]['name'] = $db->f('name'); + $modules[$db->f('idmod')]['type'] = $db->f('type'); +} + + +$sql = "SELECT code FROM " . $cfg['tab']['lay'] . " WHERE idlay='" . $idlay . "'"; +$db->query($sql); + +$oLayout = new cApiLayout(Contenido_Security::toInteger($idlay)); +if($oLayout->virgin) { + echo i18n("No such layout"); +} else { + $code = $oLayout->getLayout(); + + // get document version (html or xhtml) + $is_XHTML = getEffectiveSetting('generator', 'xhtml', 'false'); + $sElemClosing = ($is_XHTML == 'true') ? ' /' : ''; + + $base = ''; + $tags = $base; + $tags .= ' + +'; + + $code = str_replace('', "\n".$tags ."\n", $code); + + tplPreparseLayout($idlay, $code); + $containers = tplBrowseLayoutForContainers($idlay, $code); + + $a_container = explode('&',$containers); + $sContainerInHead = ''; + + foreach ($a_container as $key => $value) { + + if ($value != 0) { + //*************** Loop through containers **************** + $name = tplGetContainerName($idlay, $value); + + $modselect = new cHTMLSelectElement('c['.$value.']'); + $modselect->setAttribute('title', "Container $value ($name)"); + + $mode = tplGetContainerMode($idlay, $value); + + if ($mode == 'fixed') { + $default = tplGetContainerDefault($idlay, $value); + + foreach ($modules as $key => $val) { + if ($val['name'] == $default) { + if (strlen($val['name']) > 20) { + $short_name = capiStrTrimHard($val['name'], 20); + $option = new cHTMLOptionElement($short_name, $key); + $option->setAttribute('title', "Container $value ($name) " . $val['name']); + } else { + $option = new cHTMLOptionElement($val['name'], $key); + $option->setAttribute('title', "Container $value ($name)"); + } + + if ($a_c[$value] == $key) { + $option->setSelected(true); + } + + $modselect->addOptionElement($key, $option); + } + } + } else { + + $default = tplGetContainerDefault($idlay, $value); + + if ($mode == 'optional' || $mode == '') { + $option = new cHTMLOptionElement('-- ' . i18n("none") . ' --', 0); + + if (isset($a_c[$value]) && $a_c[$value] != '0') { + $option->setSelected(false); + } else { + $option->setSelected(true); + } + + $modselect->addOptionElement(0, $option); + } + + $allowedtypes = tplGetContainerTypes($idlay, $value); + + foreach ($modules as $key => $val) { + $short_name = $val['name']; + if (strlen($val['name']) > 20) { + $short_name = capiStrTrimHard($val['name'], 20); + } + + $option = new cHTMLOptionElement($short_name, $key); + + if (strlen($val['name']) > 20) { + $option->setAttribute('title', "Container $value ($name) " . $val['name']); + } + + if ($a_c[$value] == $key || ($a_c[$value] == 0 && $val['name'] == $default)) { + $option->setSelected(true); + } + + if (count($allowedtypes) > 0) { + if (in_array($val['type'], $allowedtypes) || $val['type'] == '') { + $modselect->addOptionElement($key, $option); + } + } else { + $modselect->addOptionElement($key, $option); + } + } + } + + // visual edit item container + $sLabelAndSelect = '' . $modselect->render(); + $sVisualEditItem = '
    ' . $sLabelAndSelect . '
    '; + + // collect containers in head for displaying them at the start of body + if (is_array($containerinf) && isset($containerinf[$idlay]) && isset($containerinf[$idlay][$value]) && + isset($containerinf[$idlay][$value]['is_body']) && $containerinf[$idlay][$value]['is_body'] == false) { + // replace container inside head with empty values and collect the container + $code = preg_replace("/(.*)<\/container>/Uis", "CMS_CONTAINER[$value]", $code); + $code = preg_replace("//i", "CMS_CONTAINER[$value]", $code); + $code = str_ireplace("CMS_CONTAINER[$value]", '', $code); + $sContainerInHead .= $sVisualEditItem . "\n"; + } else { + // replace other container + $code = preg_replace("/(.*)<\/container>/Uis", "CMS_CONTAINER[$value]", $code); + $code = preg_replace("//i", "CMS_CONTAINER[$value]", $code); + $code = str_ireplace("CMS_CONTAINER[$value]", $sVisualEditItem, $code); + } + } + } + + // Get rid of any forms + $code = preg_replace("//i", '', $code); + $code = preg_replace("/<\/form(.*)>/i", '', $code); + + $form = ' +
    + + + + + + + + + '; + $form .= $sContainerInHead; + + $sInput = ''; + $button = '
    ' . $sInput . '
    '; + $code = preg_replace("//i", "" . $form . $button, $code); + $code = preg_replace("/<\/body(.*)>/i", '', $code); + // remove all scripts, we just need a plain layout + $code = preg_replace("/]*>(.*?)<\/script>/is", '', $code); + + eval("?>\n".$code."\n \ No newline at end of file diff --git a/conlite/includes/include.tplcfg_edit.php b/conlite/includes/include.tplcfg_edit.php new file mode 100644 index 0000000..668f66d --- /dev/null +++ b/conlite/includes/include.tplcfg_edit.php @@ -0,0 +1,210 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002 + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.tplcfg_edit.php 367 2015-10-19 10:08:51Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if (!isset($idtpl)) { + $idtpl = 0; +} +if ($idtpl != 0 && $idtplcfg != 0) { + $sql = "SELECT number FROM " . $cfg["tab"]["container"] . " WHERE idtpl = '" . Contenido_Security::toInteger($idtpl) . "'"; + $db->query($sql); + + while ($db->next_record()) { + + $i = $db->f("number"); + $CiCMS_VAR = "C" . $i . "CMS_VAR"; + + if (isset($_POST[$CiCMS_VAR])) { + $tmp = $_POST[$CiCMS_VAR]; + } else { + unset($tmp); + } + + if (isset($tmp)) { + + foreach ($tmp as $key => $value) { + $value = urlencode($value); + if (!isset($varstring[$i])) + $varstring[$i] = ""; + $varstring[$i] = $varstring[$i] . $key . "=" . $value . "&"; + } + } + } + + // update/insert in container_conf + if (isset($varstring) && is_array($varstring)) { + + // delete all containers + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "'"; + $db->query($sql); + + foreach ($varstring as $col => $val) { + // insert all containers + $sql = "INSERT INTO " . $cfg["tab"]["container_conf"] . " (idcontainerc, idtplcfg, number, container) " . + "VALUES ('" . $db->nextid($cfg["tab"]["container_conf"]) . "', '" . Contenido_Security::toInteger($idtplcfg) . "', '" . Contenido_Security::toInteger($col) . "', '" . Contenido_Security::escapeDB($val, $db) . "') "; + + $db->query($sql); + } + } + + + if ($idart) { + + //echo "art: idart: $idart, idcat: $idcat"; + $sql = "UPDATE " . $cfg["tab"]["art_lang"] . " SET idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "' WHERE idart='$idart' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + } else { + + //echo "cat: idart: $idart, idcat: $idcat"; + $sql = "UPDATE " . $cfg["tab"]["cat_lang"] . " SET idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "' WHERE idcat='$idcat' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + } + + + if ($changetemplate == 1 && $idtplcfg != 0) { + + /* update template conf */ + $sql = "UPDATE " . $cfg["tab"]["tpl_conf"] . " SET idtpl='" . Contenido_Security::toInteger($idtpl) . "' WHERE idtplcfg='" . Contenido_Security::toInteger($idtplcfg) . "'"; + $db->query($sql); + + // delete old configured containers + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg='" . Contenido_Security::toInteger($idtplcfg) . "'"; + $db->query($sql); + $changetemplate = 0; + } else { + + // + } + + + if ($changetemplate != 1) { + + if (isset($idart) && 0 != $idart) { + conGenerateCode($idcat, $idart, $lang, $client); + //backToMainArea($send); + } else { + conGenerateCodeForAllartsInCategory($idcat); + if ($back == 'true') { + backToMainArea($send); + } + } + } +} elseif ($idtpl == 0) { + + /* template deselected */ + + if (isset($idtplcfg) && $idtplcfg != 0) { + + $sql = "DELETE FROM " . $cfg["tab"]["tpl_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "'"; + $db->query($sql); + + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "'"; + $db->query($sql); + } + + $idtplcfg = 0; + if (!isset($changetemplate)) { + $changetemplate = 0; + } + + if ($idcat != 0 && $changetemplate == 1 && !$idart) { + + /* Category */ + $sql = "SELECT idtplcfg FROM " . $cfg["tab"]["cat_lang"] . " WHERE idcat = '" . Contenido_Security::toInteger($idcat) . "' AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + $db->next_record(); + $tmp_idtplcfg = $db->f("idtplcfg"); + + $sql = "DELETE FROM " . $cfg["tab"]["tpl_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + + $sql = "UPDATE " . $cfg["tab"]["cat_lang"] . " SET idtplcfg = 0 WHERE idcat = '" . Contenido_Security::toInteger($idcat) . "' AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + conGenerateCodeForAllartsInCategory($idcat); + backToMainArea($send); + } elseif (isset($idart) && $idart != 0 && $changetemplate == 1) { + + /* Article */ + $sql = "SELECT idtplcfg FROM " . $cfg["tab"]["art_lang"] . " WHERE idart = '" . Contenido_Security::toInteger($idart) . "' AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + $db->next_record(); + $tmp_idtplcfg = $db->f("idtplcfg"); + + $sql = "DELETE FROM " . $cfg["tab"]["tpl_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + + $sql = "UPDATE " . $cfg["tab"]["art_lang"] . " SET idtplcfg = 0 WHERE idart = '" . Contenido_Security::toInteger($idart) . "' AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + conGenerateCodeForAllartsInCategory($idcat); + //backToMainArea($send); + } +} else { + + if ($changetemplate == 1) { + if (!$idart) { + $sql = "SELECT idtplcfg FROM " . $cfg["tab"]["cat_lang"] . " WHERE idcat = '" . Contenido_Security::toInteger($idcat) . "' AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + $db->next_record(); + $tmp_idtplcfg = $db->f("idtplcfg"); + + $sql = "DELETE FROM " . $cfg["tab"]["tpl_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + } else { + $sql = "SELECT idtplcfg FROM " . $cfg["tab"]["art_lang"] . " WHERE idart = '" . Contenido_Security::toInteger($idart) . "' AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + $db->next_record(); + $tmp_idtplcfg = $db->f("idtplcfg"); + + $sql = "DELETE FROM " . $cfg["tab"]["tpl_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + + $sql = "DELETE FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($tmp_idtplcfg) . "'"; + $db->query($sql); + } + } + conGenerateCodeForAllartsInCategory($idcat); +} +?> diff --git a/conlite/includes/include.tplcfg_edit_form.php b/conlite/includes/include.tplcfg_edit_form.php new file mode 100644 index 0000000..49af2f3 --- /dev/null +++ b/conlite/includes/include.tplcfg_edit_form.php @@ -0,0 +1,487 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2002 + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.tplcfg_edit_form.php 367 2015-10-19 10:08:51Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.pathresolver.php"); + +if (isset($idart)) { + + if ($idart > 0) { + $idartlang = getArtLang($idart, $lang); + $col = new InUseCollection; + + /* Remove all own marks */ + $col->removeSessionMarks($sess->id); + + if (($obj = $col->checkMark("article", $idartlang)) === false) { + $col->markInUse("article", $idartlang, $sess->id, $auth->auth["uid"]); + $inUse = false; + $disabled = ""; + } else { + + $vuser = new User; + $vuser->loadUserByUserID($obj->get("userid")); + $inUseUser = $vuser->getField("username"); + $inUseUserRealName = $vuser->getField("realname"); + + $message = sprintf(i18n("Article is in use by %s (%s)"), $inUseUser, $inUseUserRealName); + $notification->displayNotification("warning", $message); + $inUse = true; + $disabled = 'disabled="disabled"'; + } + } else { + $col = new InUseCollection; + $col->removeSessionMarks($sess->id); + if (($obj = $col->checkMark("categorytpl", $idcat)) === false) { + $col->markInUse("categorytpl", $idcat, $sess->id, $auth->auth["uid"]); + $inUse = false; + $disabled = ""; + } else { + + $vuser = new User; + $vuser->loadUserByUserID($obj->get("userid")); + $inUseUser = $vuser->getField("username"); + $inUseUserRealName = $vuser->getField("realname"); + + $message = sprintf(i18n("Category Template configuration is in use by %s (%s)"), $inUseUser, $inUseUserRealName); + $notification->displayNotification("warning", $message); + $inUse = true; + $disabled = 'disabled="disabled"'; + } + } +} + +if (!isset($idart)) + $idart = 0; +if (!isset($idlay)) + $idlay = 0; +if (!isset($db2) || !is_object($db2)) + $db2 = new DB_ConLite; +if (!isset($db3) || !is_object($db3)) + $db3 = new DB_ConLite; + +$tpl->reset(); + +if ($idart) { + + if ($perm->have_perm_area_action("con", "con_tplcfg_edit") || + $perm->have_perm_area_action_item("con", "con_tplcfg_edit", $idcat)) { + + /* Article is configured */ + $sql = "SELECT + c.idtpl AS idtpl, + b.idtplcfg AS idtplcfg, + b.locked AS locked + FROM + " . $cfg["tab"]["tpl_conf"] . " AS a, + " . $cfg["tab"]["art_lang"] . " AS b, + " . $cfg["tab"]["tpl"] . " AS c + WHERE + b.idart = '" . Contenido_Security::toInteger($idart) . "' AND + b.idlang = '" . Contenido_Security::toInteger($lang) . "' AND + b.idtplcfg = a.idtplcfg AND + c.idtpl = a.idtpl"; + + $db->query($sql); + + if ($db->next_record()) { + + /* template configuration found */ + $idtplcfg = $db->f("idtplcfg"); + $idtpl = $db->f("idtpl"); + if ($db->f("locked") == 1) { + $inUse = true; + $disabled = 'disabled="disabled"'; + } + } else { + + if ($idtpl) { + + /* create new configuration entry */ + $nextid = $db3->nextid($cfg["tab"]["tpl_conf"]); + + $sql = "INSERT INTO " . $cfg["tab"]["tpl_conf"] . " (idtplcfg, idtpl) VALUES ('" . Contenido_Security::toInteger($nextid) . "', '" . Contenido_Security::toInteger($idtpl) . "')"; + $db->query($sql); + + /* update art_lang */ + $sql = "UPDATE " . $cfg["tab"]["art_lang"] . " SET idtplcfg = '" . Contenido_Security::toInteger($nextid) . "' WHERE idart='" . Contenido_Security::toInteger($idart) . "' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + $idtplcfg = $nextid; + } + } + } else { + $notification->displayNotification("error", i18n("Permission denied")); + exit; + } +} elseif ($idcat) { + + /* Category is configured */ + $sql = "SELECT + c.idtpl AS idtpl, + b.idtplcfg AS idtplcfg + FROM + " . $cfg["tab"]["tpl_conf"] . " AS a, + " . $cfg["tab"]["cat_lang"] . " AS b, + " . $cfg["tab"]["tpl"] . " AS c + WHERE + b.idcat = '" . Contenido_Security::toInteger($idcat) . "' AND + b.idlang = '" . Contenido_Security::toInteger($lang) . "' AND + b.idtplcfg = a.idtplcfg AND + c.idtpl = a.idtpl AND + c.idclient = '" . Contenido_Security::toInteger($client) . "'"; + $db->query($sql); + + if ($db->next_record()) { + + /* template configuration found */ + $idtplcfg = $db->f("idtplcfg"); + $idtpl = $db->f("idtpl"); + } else { + if ($idtpl) { + + /* create new configuration entry */ + $nextid = $db3->nextid($cfg["tab"]["tpl_conf"]); + + $sql = "INSERT INTO " . $cfg["tab"]["tpl_conf"] . " (idtplcfg, idtpl) VALUES ('" . Contenido_Security::toInteger($nextid) . "', '" . Contenido_Security::toInteger($idtpl) . "')"; + $db->query($sql); + + /* update cat_lang */ + $sql = "UPDATE " . $cfg["tab"]["cat_lang"] . " SET idtplcfg = '" . Contenido_Security::toInteger($nextid) . "' WHERE idcat='" . Contenido_Security::toInteger($idcat) . "' AND idlang='" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + $idtplcfg = $nextid; + } + } +} + + +/* change template to '--- Nothing ---' */ +if ($idtpl == 0) { + $idtplcfg = 0; +} + +/* Check if a configuration for this $idtplcfg exists */ +$sql = "SELECT idcontainerc FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "'"; +$db->query($sql); + +if (!$db->next_record()) { + + /* There is no configuration for this $idtplcfg, + check if template has a pre-configuration */ + $sql = "SELECT idtplcfg FROM " . $cfg["tab"]["tpl"] . " WHERE idtpl = '" . Contenido_Security::toInteger($idtpl) . "'"; + + $db->query($sql); + $db->next_record(); + + if (0 != $db->f("idtplcfg")) { + + /* Template has a pre-configuration, + copy pre-configuration data to + category configuration with the + $idtplcfg from the category */ + $sql = "SELECT * FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($db->f("idtplcfg")) . "' ORDER BY number DESC"; + $db->query($sql); + + while ($db->next_record()) { + + /* get data */ + $nextid = $db3->nextid($cfg["tab"]["container_conf"]); + $number = $db->f("number"); + $container = $db->f("container"); + + /* write new entry */ + $sql = "INSERT INTO + " . $cfg["tab"]["container_conf"] . " + (idcontainerc, idtplcfg, number, container) + VALUES + ('" . Contenido_Security::toInteger($nextid) . "', '" . Contenido_Security::toInteger($idtplcfg) . "', '" . Contenido_Security::toInteger($number) . "', '" . Contenido_Security::escapeDB($container, $db2) . "')"; + + $db2->query($sql); + } + } +} + +/* Get template configuration from + 'con_container_conf' and create + configuration data array */ +$sql = "SELECT * FROM " . $cfg["tab"]["container_conf"] . " WHERE idtplcfg = '" . Contenido_Security::toInteger($idtplcfg) . "' ORDER BY number"; + +$db->query($sql); + +$a_c = array(); + +while ($db->next_record()) { + /* varstring is stored in array $a_c */ + $a_c[$db->f("number")] = $db->f("container"); +} + +$tmp_area = "tplcfg"; + + +//Form +$formaction = $sess->url("main.php"); +$hidden = ' + + + + + + + + '; + +$tpl->set('s', 'FORMACTION', $formaction); +$tpl->set('s', 'HIDDEN', $hidden); + +// Category Path for user +$oArticle = new Article($idart, $client, $lang); +$sArticleTitle = $oArticle->getField('title'); +$catString = ''; +prCreateURLNameLocationString($idcat, '/', $catString); +$tpl->set('s', 'CATEGORY', $catString . '/' . $sArticleTitle); + +//SELECT Box for Templates + +$tpl->set('s', 'TEMPLATECAPTION', i18n("Template")); + +$tpl2 = new Template; +$tpl2->set('s', 'NAME', 'idtpl'); +$tpl2->set('s', 'CLASS', 'text_medium'); + +if (!$perm->have_perm_area_action_item("con", "con_changetemplate", $idcat)) { + $disabled2 = 'disabled="disabled"'; +} + +$tpl2->set('s', 'OPTIONS', $disabled . ' ' . $disabled2 . ' onchange="tplcfgform.changetemplate.value=1;tplcfgform.send.value=0;tplcfgform.submit();"'); + +$sql = "SELECT + idtpl, + name + FROM + " . $cfg['tab']['tpl'] . " + WHERE + idclient = '" . Contenido_Security::toInteger($client) . "' + ORDER BY + name"; + +$db->query($sql); + +$tpl2->set('d', 'VALUE', 0); +$tpl2->set('d', 'CAPTION', '--- ' . i18n("none") . ' ---'); +$tpl2->set('d', 'SELECTED', ''); +$tpl2->next(); + +while ($db->next_record()) { + + if ($db->f("idtpl") != "$idtpl") { + $tpl2->set('d', 'VALUE', $db->f("idtpl")); + $tpl2->set('d', 'CAPTION', $db->f("name")); + $tpl2->set('d', 'SELECTED', ''); + $tpl2->next(); + } else { + $tpl2->set('d', 'VALUE', $db->f("idtpl")); + $tpl2->set('d', 'CAPTION', $db->f("name")); + $tpl2->set('d', 'SELECTED', 'selected="selected"'); + $tpl2->next(); + } +} + +$select = $tpl2->generate($cfg["path"]["templates"] . $cfg['templates']['generic_select'], true); +$tpl->set('s', 'TEMPLATESELECTBOX', $select); + +/* modul input bereich von allen + container anzeigen */ +$sql = "SELECT + * + FROM + " . $cfg["tab"]["container"] . " + WHERE + idtpl='" . Contenido_Security::toInteger($idtpl) . "' ORDER BY number ASC"; + +$db->query($sql); + +$a_d = array(); + +while ($db->next_record()) { + + /* liste der benutzten module generieren */ + $a_d[$db->f("number")] = $db->f("idmod"); +} + +if (isset($a_d) && is_array($a_d)) { + foreach ($a_d as $cnumber => $value) { + /* show only the containers which + contain a module */ + if (0 != $value) { + $oModule = new cApiModule($a_d[$cnumber]); + $input = $oModule->get('input') . "\n"; + + global $cCurrentModule; + $cCurrentModule = $oModule->get('idmod'); + $modulecaption = i18n("Module in container") . " " . $cnumber . ": "; + $modulename = $oModule->get('name'); + + $varstring = array(); + + if (isset($a_c[$cnumber])) { + $a_c[$cnumber] = preg_replace("/&$/", "", $a_c[$cnumber]); + $tmp1 = preg_split("/&/", $a_c[$cnumber]); + + foreach ($tmp1 as $key1 => $value1) { + $tmp2 = explode("=", $value1); + foreach ($tmp2 as $key2 => $value2) { + $varstring[$tmp2[0]] = $tmp2[1]; + } + } + } + + $CiCMS_Var = '$C' . $cnumber . 'CMS_VALUE'; + $CiCMS_VALUE = ''; + + foreach ($varstring as $key3 => $value3) { + $tmp = urldecode($value3); + $tmp = str_replace("\'", "'", $tmp); + $CiCMS_VALUE .= $CiCMS_Var . '[' . $key3 . ']="' . $tmp . '"; '; + $input = str_replace("\$CMS_VALUE[$key3]", $tmp, $input); + $input = str_replace("CMS_VALUE[$key3]", $tmp, $input); + } + + $input = str_replace("CMS_VALUE", $CiCMS_Var, $input); + $input = str_replace("\$" . $CiCMS_Var, $CiCMS_Var, $input); + $input = str_replace("CMS_VAR", "C" . $cnumber . "CMS_VAR", $input); + + ob_start(); + eval($CiCMS_VALUE . " \r\n " . $input); + + $modulecode = ob_get_contents(); + ob_end_clean(); + + + $tpl->set('d', 'MODULECAPTION', $modulecaption); + $tpl->set('d', 'MODULENAME', $modulename); + if ($inUse == false) { + $tpl->set('d', 'MODULECODE', $modulecode); + } else { + $tpl->set('d', 'MODULECODE', ' '); + } + $tpl->next(); + } + } +} + +$script = ' + + var sid = "' . $sess->id . '"; + + try { + obj = parent.parent.frames["left"].frames["left_top"].cfg; + } catch (e) { + // catch error exception + + } + + if ( obj ) { + + /* Format of the data-string + 0 -> category id + 1 -> category template id + 2 -> category online + 3 -> category public + 4 -> has right for: template + 5 -> has right for: online + 6 -> has right for: public + 7 -> idstring not splitted */ + + tmp_idtpl = ("' . $idtpl . '" == "") ? 0 : "' . $idtpl . '"; + + changed = (obj.tplId != tmp_idtpl); + + sData = "' . $idcat . '-' . $idtpl . '-"+obj.isOnline+"-"+obj.isPublic+"-"+obj.hasRight["template"]+"-"+obj.hasRight["online"]+"-"+obj.hasRight["public"]; + + if ( changed ) { + obj.load( "' . $idcat . '", "' . $idtpl . '", obj.isOnline, obj.isPublic, obj.hasRight["template"], obj.hasRight["online"], obj.hasRight["public"], sData ); + parent.parent.frames["left"].frames["left_bottom"].location.href = "' . $sess->url("main.php?area=con&force=1&frame=2") . '"; + + } + + } + + + // parent.parent.frames["right"].frames["right_top"].location.href = "main.php?area=con&frame=3&idcat=0&contenido=' . $sess->id . '"; + artObj = parent.parent.frames["left"].frames["left_top"].artObj; + artObj.disable();'; + +/* Change template select only + when configuring a category */ +if (!$idart && $area != "str_tplcfg") { + $tpl->set('s', 'SCRIPT', $script); +} else { + $tpl->set('s', 'SCRIPT', ''); +} + +if ($idart) { + $markscript = markSubMenuItem(2, true); + $tpl->set('s', 'MARKSUBMENU', $markscript); +} else { + $tpl->set('s', 'MARKSUBMENU', ""); +} + + + +if ($idart || $area == 'con_tplcfg') { + $buttons = '     + '; +} else { + $buttons = '     + '; +} +if ($idtpl != 0 && $inUse == false) { + $tpl->set('s', 'BUTTONS', $buttons); +} else { + $tpl->set('s', 'BUTTONS', ''); +} + +if ($area == 'str_tplcfg' || $area == 'con_tplcfg' && (int) $idart == 0) { + $tpl->set('s', 'HEADER', i18n('Categorytemplate configuration')); + $tpl->set('s', 'DISPLAY_HEADER', 'block'); +} else if ($area == 'con_tplcfg' && (int) $idart > 0) { + $tpl->set('s', 'HEADER', i18n('Articletemplate configuration')); + $tpl->set('s', 'DISPLAY_HEADER', 'block'); +} else { + $tpl->set('s', 'HEADER', ''); + $tpl->set('s', 'DISPLAY_HEADER', 'none'); +} +# Generate template +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['tplcfg_edit_form']); +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_artlist.php b/conlite/includes/include.upl_artlist.php new file mode 100644 index 0000000..8e36636 --- /dev/null +++ b/conlite/includes/include.upl_artlist.php @@ -0,0 +1,185 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.upl_artlist.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.con.php"); + +$page = new cPage; + +conCreateLocationString($idcat, "/", $cat_str); + +$mcatlink = ""; + +$_cecIterator = $_cecRegistry->getIterator("Contenido.Content.CreateCategoryLink"); +if ($_cecIterator->count() > 0) +{ + while ($chainEntry = $_cecIterator->next()) + { + $catlink = $chainEntry->execute($idcat); + + if ($catlink != "") + { + $mcatlink = $catlink; + } + } +} + +if ($mcatlink == "") +{ + $mcatlink = "front_content.php?idcat=$idcat"; +} + +$jslink = 'parent.parent.frames[\'left\'].frames[\'left_top\'].document.getElementById(\'selectedfile\').value= \''.$mcatlink.'\'; window.returnValue=\''.$mcatlink.'\'; window.close();'; +$content[] = '
    '; +$content[] = '
    '; +$content[] = ''.i18n('; +$content[] = $cat_str; +$content[] = '
    '; + +$cApiCategoryArticleCollection = new cApiCategoryArticleCollection; + +$cApiCategoryArticleCollection->link("cApiCategoryLanguageCollection"); +$cApiCategoryArticleCollection->link("cApiArticleCollection"); +$cApiCategoryArticleCollection->link("cApiArticleLanguageCollection"); +$cApiCategoryArticleCollection->link("cApiCategoryCollection"); +$cApiCategoryArticleCollection->setWhere("cApiCategoryLanguageCollection.idlang", $lang); +$cApiCategoryArticleCollection->setWhere("cApiArticleLanguageCollection.idlang", $lang); +$cApiCategoryArticleCollection->setWhere("cApiCategoryLanguageCollection.idcat", $idcat); +$cApiCategoryArticleCollection->query(); + +$headlines = array(i18n("Start"), i18n("Title"), i18n("Created"), i18n("Modified"), i18n("Sort Order"), i18n("Online")); +$fields = array("is_start", "title", "created", "lastmodified", "artsort", "online"); + +$content[] = ''; + +foreach ($headlines as $headline) +{ + $content[] = ''; +} + +$content[] = ''; + +$dateformat = getEffectiveSetting("backend", "timeformat", "Y-m-d H:i:s"); + +$odd = false; + +while ($cApiCategoryArticle = $cApiCategoryArticleCollection->next()) +{ + $obj = $cApiCategoryArticleCollection->fetchObject("cApiArticleLanguageCollection"); + + $odd = !$odd; + + if ($odd) + { + $mcol = $cfg['color']['table_light']; + } else { + $mcol = $cfg['color']['table_dark']; + } + + $content[] = ''; + + $martlink = ""; + $idart = $obj->get("idart"); + + $_cecIterator = $_cecRegistry->getIterator("Contenido.Content.CreateArticleLink"); + if ($_cecIterator->count() > 0) + { + while ($chainEntry = $_cecIterator->next()) + { + $artlink = $chainEntry->execute($idart, $idcat); + + if ($artlink != "") + { + $martlink = $artlink; + } + } + } + + if ($martlink == "") + { + $martlink = "front_content.php?idart=$idart"; + } + + $jslink = 'parent.parent.frames[\'left\'].frames[\'left_top\'].document.getElementById(\'selectedfile\').value= \''.$martlink.'\'; window.returnValue=\''.$martlink.'\'; window.close();'; + + foreach ($fields as $field) + { + switch ($field) + { + case "is_start": + $value = isStartArticle($obj->get("idartlang"), $idcat, $lang); + + if ($value == true) + { + $value = ''; + } else { + $value = ''; + } + break; + case "created": + case "modified": + $value = date($dateformat,strtotime($obj->get($field))); + break; + case "online": + if ($obj->get("online") == true) + { + $value = ''; + } else { + $value = ''; + } + break; + + default: + $value = $obj->get($field); + break; + } + + + if ($field == "title") + { + $xwidth = 'width="100%"'; + } else { + $xwidth = 'width="1%"'; + } + + $content[] = ''; + } + + $content[] = ''; +} + +$content[] = '
    '.$headline.'
    '.$value.'
    '; +$page->setContent(implode("", $content)); +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_dirs_overview.php b/conlite/includes/include.upl_dirs_overview.php new file mode 100644 index 0000000..ce2c925 --- /dev/null +++ b/conlite/includes/include.upl_dirs_overview.php @@ -0,0 +1,594 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-28 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.upl_dirs_overview.php 298 2014-01-22 13:10:17Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.con.php"); +cInclude("includes", "functions.str.php"); + +if (!(int) $client > 0) { + #if there is no client selected, display empty page + $oPage = new cPage; + $oPage->render(); + return; +} + +function getExpandCollapseButton($item) +{ + global $sess, $PHP_SELF, $frame, $area, $appendparameters; + $selflink = "main.php"; + + if (count($item->subitems) > 0) + { + if ($item->collapsed == true) + { + $expandlink = $sess->url($selflink."?area=$area&frame=$frame&appendparameters=$appendparameters&expand=".$item->id); + return (''); + } else + { + $collapselink = $sess->url($selflink."?area=$area&appendparameters=$appendparameters&frame=$frame&collapse=".$item->id); + return (''); + } + } else + { + if ($item->custom["lastitem"]) + { + return ''; + } else + { + return ''; + } + } +} + +################# +# Create Folder +################# +#Fixxed by Timo Trautmann double database entries also called by action upl_mkdir +// Use remembered path from upl_last_path (from session) +if (!isset($path) && $sess->is_registered("upl_last_path")) +{ + $path = $upl_last_path; +} + +$appendparameters = $_REQUEST["appendparameters"]; + +if (!isset ($action)) + $action = ""; + +if ($tmp_area == "") { + $tmp_area = $area; // $tmp_area used at two places for unknown reasons... +} + +$uplexpandedList = unserialize($currentuser->getUserProperty("system", "upl_expandstate")); +$upldbfsexpandedList = unserialize($currentuser->getUserProperty("system", "upl_dbfs_expandstate")); + +if (!is_array($uplexpandedList)) +{ + $uplexpandedList = array (); +} + +if (!is_array($upldbfsexpandedList)) +{ + $upldbfsexpandedList = array (); +} + +if ($action == "upl_renamedir") +{ + if ($perm->have_perm_area_action("upl", "upl_renamedir")) + { + uplRenameDirectory($oldname, $newname, $parent); + $path = $cfgClient[$client]['upl']['path'].$parent.$newname."/"; + if (in_array($cfgClient[$client]['upl']['path'].$parent.$oldname."/", $uplexpandedList)) + { + $uplexpandedList[] = $cfgClient[$client]['upl']['path'].$parent.$newname."/"; + } + } +} + +################### +# File System Tree +################### +$dbfs = new DBFSCollection; + +if ($action == "upl_delete") +{ + if (is_dbfs($path)) + { + $dbfs->remove($path."/."); + } else + { + /* Check for files */ + if (uplHasFiles($path)) + { + $failedFiles = array (); + + $directory = opendir($cfgClient[$client]["upl"]["path"].$path); + while (false !== ($dir_entry = readdir($directory))) + { + if ($dir_entry != "." && $dir_entry != "..") + { + $res = @ unlink($cfgClient[$client]["upl"]["path"].$path.$dir_entry); + + if ($res == false) + { + $failedFiles[] = $dir_entry; + } + } + } + } + + if (count($failedFiles) > 0) + { + $notification->displayNotification("warning", i18n("Failed to delete the following files:")."

    ".implode("
    ", $failedFiles)); + } else + { + $res = @ rmdir($cfgClient[$client]['upl']['path'].$path); + if ($res == false) + { + $notification->displayNotification("warning", sprintf(i18n("Failed to remove directory %s"), $path)); + } + } + } +} + +$tpl->reset(); + +$file = 'Upload'; +$pathstring = ''; +/* +$rootTreeItem = new TreeItem; +$rootTreeItem->custom["level"] = 0; +$rootTreeItem->name = i18n("Upload directory"); +*/ +$user_upload_path = getEffectiveSetting("upload","userpath"); + +if (is_string($user_upload_path) AND !empty($user_upload_path)) { + trim($user_upload_path); + $file = $user_upload_path; + if (substr($user_upload_path, -1) != "/") { + $user_upload_path .= "/"; + } + $pathstring = $user_upload_path; + if (substr($cfgClient[$client]["upl"]["path"], -1) != "/" AND substr($user_upload_path, 0, 1) == "/") { + $user_upload_path = substr($user_upload_path, 1); + } +} + +$rootTreeItem = new TreeItem; +$rootTreeItem->custom["level"] = 0; +$rootTreeItem->name = i18n("Upload directory"); +$aInvalidDirectories = uplRecursiveDirectoryList($cfgClient[$client]["upl"]["path"].$user_upload_path, $rootTreeItem, 2); + +if (count($aInvalidDirectories) > 0) { + $sWarningInfo = i18n('The following directories contains invalid characters and were ignored: '); + $sSeperator = '
    '; + $sFiles = implode(', ', $aInvalidDirectories); + $sRenameString = i18n('Please click here in order to rename automatically.'); + $sRenameHref = $sess->url("main.php?area=$area&frame=$frame&force_rename=true"); + $sRemameLink = ''.$sRenameString.''; + $sNotificationString = $sWarningInfo.$sSeperator.$sFiles.$sSeperator.$sSeperator.$sRemameLink; + + $sErrorString = $notification->returnNotification("warning", $sNotificationString, 1); + $tpl->set('s', 'WARNING', $sErrorString); +} else { + $tpl->set('s', 'WARNING', ''); +} + +/* Mark all items in the expandedList as expanded */ +foreach ($uplexpandedList as $key => $value) +{ + $rootTreeItem->markExpanded($value); +} + +/* Collapse and expand the tree */ +if (is_string($collapse)) +{ + $rootTreeItem->markCollapsed($collapse); +} + +if (is_string($expand)) +{ + $rootTreeItem->markExpanded($expand); +} + +$uplexpandedList = Array (); +$rootTreeItem->getExpandedList($uplexpandedList); + +$currentuser->setUserProperty("system", "upl_expandstate", serialize($uplexpandedList)); + +$objects = Array (); +$rootTreeItem->traverse($objects); +unset ($objects[0]); + +$bgcolor = (is_int($tpl->dyn_cnt / 2)) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + +if ($appendparameters == "filebrowser") +{ + $mtree = new cWidgetTreeView("b58f0ae3-8d4e-4bb3-a754-5f0628863364"); + $cattree = conFetchCategoryTree(); + $marray = array (); + + foreach ($cattree as $key => $catitem) + { + $no_start = true; + $no_online = true; + $no_start = !strHasStartArticle($catitem["idcat"], $lang); + + $no_online = !$catitem["visible"]; + + if ($catitem["visible"] == 1) + { + if ($catitem["public"] == 0) + { + if ($no_start || $no_online) + { + # Error found + $tmp_img = "folder_on_error_locked.gif"; + } else + { + # No error found + $tmp_img = "folder_on_locked.gif"; + } + } else + { + # Category is public + if ($no_start || $no_online) + { + # Error found + $tmp_img = "folder_on_error.gif"; + } else + { + # No error found + $tmp_img = "folder_on.gif"; + } + } + } else + { + # Category is offline + if ($catitem['public'] == 0) + { + # Category is locked + if ($no_start || $no_online) + { + # Error found + $tmp_img = "folder_off_error_locked.gif"; + + } else + { + # No error found + $tmp_img = "folder_off_locked.gif"; + + } + + } else + { + # Category is public + if ($no_start || $no_online) + { + # Error found + $tmp_img = "folder_off_error.gif"; + + } else + { + # No error found + $tmp_img = "folder_off.gif"; + + } + } + } + + $icon = "./images/".$tmp_img; + + $idcat = $catitem["idcat"]; + + $name = ' '.$catitem["name"].''; + $marray[] = array ("id" => $catitem["idcat"], "name" => $name, "level" => $catitem["level"], "attributes" => array ("icon" => $icon)); + } + + $mtree->setTreeName(i18n("Categories")); + $mtree->setIcon("images/grid_folder.gif"); + $mtree->importTable($marray); + + $baselink = new cHTMLLink; + $baselink->setCLink($area, $frame, ""); + $baselink->setCustom("appendparameters", $appendparameters); + + $mtree->setBaseLink($baselink); + $mtree->setBackgroundMode(TREEVIEW_BACKGROUND_SHADED); + $mtree->setMouseoverMode(TREEVIEW_MOUSEOVER_NONE); + $mtree->setCollapsed($collapsed); + $mtree->processParameters(); + + $collapsed = array (); + $mtree->getCollapsedList($collapsed); + + $tpl->set('s', 'CATBROWSER', $mtree->render()); + $tpl->set('s', 'APPENDPARAMETERS', 'url += \'&appendparameters='.$appendparameters.'\''); +} else +{ + $tpl->set('s', 'CATBROWSER', ''); + $tpl->set('s', 'APPENDPARAMETERS', 'url += \'&appendparameters='.$appendparameters.'\''); +} + +chdir($cfg['path']['contenido']); + +$tpl->set('s', 'SID', $sess->id); + +# create javascript multilink +$tmp_mstr = '%s'; +$mstr = sprintf($tmp_mstr, 'right_top', $sess->url("main.php?area=$area&frame=3&path=$pathstring&appendparameters=$appendparameters"), + 'right_bottom', $sess->url("main.php?area=$area&frame=4&path=$pathstring&appendparameters=$appendparameters"), + ''.$file); + +$tpl->set('d', 'PATH', $pathstring); +$tpl->set('d', 'BGCOLOR', $bgcolor); +$tpl->set('d', 'INDENT', 3); +$tpl->set('d', 'DIRNAME', $mstr); +$tpl->set('d', 'EDITBUTTON', ''); +$tpl->set('d', 'DELETEBUTTON', ''); +$tpl->set('d', 'COLLAPSE', ''); +$tpl->next(); + + +if (is_array($objects)) +{ + foreach ($objects as $a_file) + { + $file = $a_file->name; + $depth = $a_file->custom["level"] - 1; + $pathstring = str_replace($cfgClient[$client]['upl']['path'], "", $a_file->id); + $a_file->collapsed_icon = "images/grid_expand.gif"; + $a_file->expanded_icon = "images/grid_collapse.gif"; + $dlevels[$depth] = $a_file->custom["lastitem"]; + $imgcollapse = getExpandCollapseButton($a_file); + $fileurl = rawurlencode($path.$file.'/'); + $pathurl = rawurlencode($path); + + # Indent for every level + $cnt = $depth; + $indent = 18; + + for ($i = 0; $i < $cnt; $i ++) + { + $indent += 18; + } + + # create javascript multilink # -> better create meaningful comments + $tmp_mstr = '%s'; + $mstr = sprintf( + $tmp_mstr, + 'right_bottom', $sess->url("main.php?area=$area&frame=4&path=$pathstring&appendparameters=$appendparameters"), + 'right_top', $sess->url("main.php?area=$area&frame=3&path=$pathstring&appendparameters=$appendparameters"), + ''.$file); + + $hasFiles = uplHasFiles($pathstring); + $hasSubdirs = uplHasSubdirs($pathstring); + + if ((!$hasSubdirs) && (!$hasFiles) && $perm->have_perm_area_action($tmp_area, "upl_rmdir")) + { + $deletebutton = ''.$file.'\', \'deleteDirectory(\\\''.$pathstring.'\\\')\')">'.i18n('; + } else + { + if ($hasFiles) + { + $message = i18n("Directory contains files"); + } else + { + $message = i18n("Permission denied"); + } + + $deletebutton = "\"".$message."\""; + } + + $bgcolor = (is_int($tpl->dyn_cnt / 2)) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + + $tpl->set('d', 'PATH', $pathstring); + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'INDENT', 0); + + $gline = ""; + + for ($i = 1; $i < $depth; $i ++) + { + if ($dlevels[$i] == false && $i != 0) + { + $gline .= ''; + } else + { + $gline .= ''; + } + } + + $parent = str_replace($cfgClient[$client]['upl']['path'], "", $a_file->custom["parent"]); + + $tpl->set('d', 'DIRNAME', $mstr); + $tpl->set('d', 'EDITBUTTON', ''); + $tpl->set('d', 'DELETEBUTTON', $deletebutton); + + $tpl->set('d', 'COLLAPSE', $gline.$imgcollapse); + $tpl->next(); + + } +} + +$tpl->set('d', 'DELETEBUTTON', ' '); +$tpl->set('d', 'DIRNAME', ''); +$tpl->set('d', 'EDITBUTTON', ''); +$tpl->set('d', 'COLLAPSE', ""); +$tpl->next(); + +#################################### +# Database-based filesystem (DBFS) +#################################### +$file = i18n("Database Filesystem"); +$pathstring = 'dbfs:'; +$rootTreeItem = new TreeItem; +$rootTreeItem->custom["level"] = 0; + +uplRecursiveDBDirectoryList("", $rootTreeItem, 2); + +/* Mark all items in the expandedList as expanded */ +foreach ($upldbfsexpandedList as $key => $value) +{ + $rootTreeItem->markExpanded($value); +} + +/* Collapse and expand the tree */ +if (is_string($collapse)) +{ + $rootTreeItem->markCollapsed($collapse); +} + +if (is_string($expand)) +{ + $rootTreeItem->markExpanded($expand); +} + +$upldbfsexpandedList = Array (); +$rootTreeItem->getExpandedList($upldbfsexpandedList); + +$currentuser->setUserProperty("system", "upl_dbfs_expandstate", serialize($upldbfsexpandedList)); + +$objects = Array (); +$rootTreeItem->traverse($objects); + +unset ($objects[0]); + +$bgcolor = (is_int($tpl->dyn_cnt / 2)) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + +$tmp_mstr = '%s'; +$mstr = sprintf($tmp_mstr, 'right_top', $sess->url("main.php?area=$area&frame=3&path=$pathstring&appendparameters=$appendparameters"), + 'right_bottom', $sess->url("main.php?area=$area&frame=4&path=$pathstring&appendparameters=$appendparameters"), + ''.$file); + +$tpl->set('d', 'PATH', $pathstring); +$tpl->set('d', 'BGCOLOR', $bgcolor); +$tpl->set('d', 'INDENT', 3); +$tpl->set('d', 'DIRNAME', $mstr); +$tpl->set('d', 'EDITBUTTON', ''); +$tpl->set('d', 'DELETEBUTTON', ''); +$tpl->set('d', 'COLLAPSE', ''); +$tpl->next(); + +$dbfsc = new DBFSCollection; + +$dlevels = array (); + +if (is_array($objects)) +{ + foreach ($objects as $a_file) + { + $file = $a_file->name; + $depth = $a_file->custom["level"] - 1; + $pathstring = $a_file->id; + $a_file->collapsed_icon = "images/grid_expand.gif"; + $a_file->expanded_icon = "images/grid_collapse.gif"; + $dlevels[$depth] = $a_file->custom["lastitem"]; + $collapse = getExpandCollapseButton($a_file); + $fileurl = rawurlencode($path.$file.'/'); + $pathurl = rawurlencode($path); + + if($file == 'tmp') + { + echo 'tmp2
    '; + } + + # Indent for every level + $cnt = $depth; + $indent = 18; + + for ($i = 0; $i < $cnt; $i ++) + { + # 18 px for every level + $indent += 18; + } + + # create javascript multilink + $tmp_mstr = '%s'; + $mstr = sprintf($tmp_mstr, 'right_bottom', $sess->url("main.php?area=$area&frame=4&path=$pathstring&appendparameters=$appendparameters"), + 'right_top', $sess->url("main.php?area=$area&frame=3&path=$pathstring&appendparameters=$appendparameters"), + ''.$file); + + $hasFiles = $dbfsc->hasFiles($pathstring); + + if (!$hasFiles && $perm->have_perm_area_action($tmp_area, "upl_rmdir")) + { + $deletebutton = ''.$file.'\', \'deleteDirectory(\\\''.$pathstring.'\\\')\')">'.i18n('; + } else + { + if ($hasFiles) + { + $message = i18n("Directory contains files"); + } else + { + $message = i18n("Permission denied"); + } + + $deletebutton = "\"".$message."\""; + } + + $bgcolor = (is_int($tpl->dyn_cnt / 2)) ? $cfg["color"]["table_light"] : $cfg["color"]["table_dark"]; + + $tpl->set('d', 'PATH', $pathstring); + $tpl->set('d', 'BGCOLOR', $bgcolor); + $tpl->set('d', 'INDENT', 0); + + $gline = ""; + + for ($i = 1; $i < $depth; $i ++) + { + if ($dlevels[$i] == false && $i != 0) + { + $gline .= ''; + } else + { + $gline .= ''; + } + } + + $parent = str_replace($cfgClient[$client]['upl']['path'], "", $a_file->custom["parent"]); + $tpl->set('d', 'DIRNAME', $mstr); + $tpl->set('d', 'EDITBUTTON', ''); + $tpl->set('d', 'DELETEBUTTON', $deletebutton); + $tpl->set('d', 'COLLAPSE', $gline.$collapse); + $tpl->next(); + + } +} + +$tpl->set('s', 'ID_PATH', $path); +chdir($cfg["path"]["contenido"]); +$tpl->generate($cfg['path']['templates'].$cfg['templates']['upl_dirs_overview']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_edit.php b/conlite/includes/include.upl_edit.php new file mode 100644 index 0000000..aefa1fc --- /dev/null +++ b/conlite/includes/include.upl_edit.php @@ -0,0 +1,318 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-07-31, Oliver Lohkemper, add CEC + * modified 2008-08-11, Timo Trautmann, added urlencode for meta storage in database + * modified 2008-10-16, Oliver Lohkemper, add copyright in upl_meta - CON-212 + * modified 2010-09-20, Dominik Ziegler, implemented check for write permissions - CON-319 + * + * $Id: include.upl_edit.php 424 2016-02-25 06:28:41Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.upl.php"); + +$sFilename = Contenido_Security::escapeString($_REQUEST["file"]); +$sFilename = str_replace('"', '', $sFilename); +$sFilename = str_replace("'", '', $sFilename); + +$sPathname = Contenido_Security::escapeString($_REQUEST["path"]); +$sPathname = str_replace('"', '', $sPathname); +$sPathname = str_replace("'", '', $sPathname); + +$page = new UI_Page; +$page->addScript("cal1", ''); +$page->addScript("cal2", ''); +$page->addScript("cal3", ''); +$page->addScript("cal4", ''); + +$form = new UI_Table_Form("properties"); +$form->setVar("frame", $frame); +$form->setVar("area", "upl"); +$form->setVar("path", $sPathname); +$form->setVar("file", $sFilename); +$form->setVar("action", "upl_modify_file"); +$form->setVar("startpage", $_REQUEST["startpage"]); +$form->setVar("sortby", $_REQUEST["sortby"]); +$form->setVar("sortmode", $_REQUEST["sortmode"]); +$form->setVar("thumbnailmode", $_REQUEST["thumbnailmode"]); +$form->addHeader(i18n("Edit")); + +$properties = new PropertyCollection; +$uploads = new UploadCollection; + +if (is_dbfs($sPathname)) { + $qpath = $sPathname . "/"; +} else { + $qpath = $sPathname; +} + +if ((is_writable($cfgClient[$client]["upl"]["path"].$path) || is_dbfs($path)) && (int) $client > 0) { + $bDirectoryIsWritable = true; +} else { + $bDirectoryIsWritable = false; +} + +$uploads->select("idclient = '".$client."' AND dirname = '".$qpath."' AND filename='".$sFilename."'"); + +if ($upload = $uploads->next()) { + + /* + * Which rows to display? + */ + $aListRows = array(); + $aListRows["filename"] = i18n("File name"); + $aListRows["path"] = i18n("Path"); + $aListRows["replacefile"] = i18n("Replace file"); + $aListRows["medianame"] = i18n("Media name"); + $aListRows["description"] = i18n("Description"); + $aListRows["keywords"] = i18n("Keywords"); + $aListRows["medianotes"] = i18n("Internal notes"); + $aListRows["copyright"] = i18n("Copyright"); + $aListRows["protected"] = i18n("Protection"); + $aListRows["timecontrol"] = i18n("Time control"); + $aListRows["preview"] = i18n("Preview"); + $aListRows["author"] = i18n("Author"); + $aListRows["modified"] = i18n("Last modified by"); + + /* + * Delete dbfs specific rows + */ + if (!is_dbfs($sPathname)) { + unset($aListRows['protected']); + unset($aListRows['timecontrol']); + } + + /* + * Call chains to process the rows + */ + $_cecIterator = $_cecRegistry->getIterator("Contenido.Upl_edit.Rows"); + if ($_cecIterator->count() > 0) { + while ($chainEntry = $_cecIterator->next()) { + $newRowList = $chainEntry->execute($aListRows); + if (is_array($newRowList)) { + $aListRows = $newRowList; + } + } + } + + + $iIdupl = $upload->get("idupl"); + $sSql = "SELECT * FROM " . $cfg['tab']['upl_meta'] . " + WHERE idupl = '" . Contenido_Security::toInteger($iIdupl) . "' + AND idlang = '" . Contenido_Security::toInteger($lang) . "' + LIMIT 0, 1"; + $db->query($sSql); + + if ($db->num_rows() > 0) { + $db->next_record(); + } + + /* + * Add rows to $form + */ + foreach ($aListRows as $sListRow => $sTitle) + { + $sCell = ""; + switch ($sListRow) + { + case "filename": + $sCell = $sFilename; + break; + + case "path": + $sCell = generateDisplayFilePath($qpath, 65); + break; + + case "replacefile": + $uplelement = new cHTMLUpload("file",40); + $uplelement->setDisabled(!$bDirectoryIsWritable); + $sCell = $uplelement->render(); + + break; + + case "medianame": + if( $db->f('medianame') ) $medianame = Contenido_Security::unFilter($db->f('medianame')); + else $medianame = $properties->getValue("upload", $qpath.$sFilename, "file", "medianame"); + $mnedit = new cHTMLTextbox("medianame", $medianame, 60 ); + $sCell = $mnedit->render(); + break; + + case "description": + if( $db->f('description') ) $sDescription = Contenido_Security::unFilter($db->f('description')); + else $sDescription = $upload->get("description"); + $dsedit = new cHTMLTextarea("description", $sDescription ); + $sCell = $dsedit->render(); + break; + + case "keywords": + if( $db->f('keywords') ) $keywords = Contenido_Security::unFilter($db->f('keywords')); + else $keywords = $properties->getValue("upload", $qpath.$sFilename, "file", "keywords"); + $kwedit = new cHTMLTextarea("keywords", $keywords ); + $sCell = $kwedit->render(); + break; + + case "medianotes": + if( $db->f('internal_notice') ) $medianotes = Contenido_Security::unFilter($db->f('internal_notice')); + else $medianotes = $properties->getValue("upload", $qpath.$sFilename, "file", "medianotes"); + $moedit = new cHTMLTextarea("medianotes", $medianotes ); + $sCell = $moedit->render(); + break; + + case "copyright": + if( $db->f('copyright') ) $copyright = Contenido_Security::unFilter($db->f('copyright')); + else $copyright = $properties->getValue("upload", $qpath.$sFilename, "file", "copyright"); + $copyrightEdit = new cHTMLTextarea("copyright", $copyright); + $sCell = $copyrightEdit->render(); + break; + + case "protected": + $vprotected = $properties->getValue("upload", $qpath.$sFilename, "file", "protected"); + $protected = new cHTMLCheckbox("protected", "1" ); + $protected->setChecked($vprotected); + $protected->setLabelText(i18n("Protected for non-logged in users")); + $sCell = $protected->render(); + break; + + case "timecontrol": + $iTimeMng = (int)$properties->getValue("upload", $qpath.$sFilename, "file", "timemgmt"); + $sStartDate = $properties->getValue("upload", $qpath.$sFilename, "file", "datestart"); + $sEndDate = $properties->getValue("upload", $qpath.$sFilename, "file", "dateend"); + + $oTimeCheckbox = new cHTMLCheckbox("timemgmt", i18n("Use time control")); + $oTimeCheckbox->setChecked($iTimeMng); + + $sHtmlTimeMng = "\n"; + $sHtmlTimeMng .= "\n"; + + $sHtmlTimeMng .= "\n"; + $sHtmlTimeMng .= ''; + + $sHtmlTimeMng .= "\n"; + $sHtmlTimeMng .= ''; + + $sHtmlTimeMng .= "
    " . $oTimeCheckbox->render() . "
    ' . + ' 
    ' . + ' 
    \n"; + + $sHtmlTimeMng .= ''; + + $sHtmlTimeMng .= ''; + + $sCell = $sHtmlTimeMng; + break; + + case "preview": + if (is_dbfs($sPathname)) { + $sCell = ''; + } else { + $sCell = ''; + } + break; + + case "author": + $sCell = $classuser->getUserName($upload->get("author")) . " (". $upload->get("created").")"; + break; + + case "modified": + $sCell = $classuser->getUserName($upload->get("modifiedby")). " (". $upload->get("lastmodified").")"; + break; + + default: + /* + * Call chain to retrieve value + */ + $_cecIterator = $_cecRegistry->getIterator("Contenido.Upl_edit.RenderRows"); + + if ($_cecIterator->count() > 0) { + $contents = array(); + while ($chainEntry = $_cecIterator->next()) { + $contents[] = $chainEntry->execute( $iIdupl, $qpath, $sFilename, $sListRow ); + } } + $sCell = implode("", $contents); + } + $form->add($sTitle, $sCell ); + } + + + $sScript = ""; + if (is_dbfs($sPathname)) { + $sScript = "" . + "\n\n\n\n\n\n"; + } + /* + * Script must add in body-tag + */ + $sScriptinBody = ' + '; + $page->addScript('style', ''); + + if ( $bDirectoryIsWritable == false ) { + $sErrorMessage = $notification->returnNotification("error", i18n("Directory not writable") . ' (' . $cfgClient[$client]["upl"]["path"].$path . ')'); + $sErrorMessage .= '
    '; + } else { + $sErrorMessage = ''; + } + + $page->setContent( $sScriptinBody . $sErrorMessage . $form->render() . $sScript ); +} +else { + $page->setContent(sprintf(i18n("Could not load file %s"),$sFilename)); +} + +$page->render(); + +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_files_overview.php b/conlite/includes/include.upl_files_overview.php new file mode 100644 index 0000000..8f95b41 --- /dev/null +++ b/conlite/includes/include.upl_files_overview.php @@ -0,0 +1,931 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: include.upl_files_overview.php 374 2015-11-09 15:59:28Z oldperl $: + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "api/functions.frontend.list.php"); + +if (!(int) $client > 0) { + #if there is no client selected, display empty page + $oPage = new cPage; + $oPage->render(); + return; +} + +$appendparameters = $_REQUEST["appendparameters"]; +$file = $_REQUEST['file']; + +if (!is_array($browserparameters) && ($appendparameters != "imagebrowser" || $appendparameters != "filebrowser")) { + $browserparameters = array(); +} + +if (!$sess->is_registered("upl_last_path")) { + $upl_last_path = $path; + $sess->register("upl_last_path"); +} else if (!isset($path)) { + $path = $upl_last_path; +} +$upl_last_path = $path; + +$uploads = new UploadCollection; + +$dbfs = new DBFSCollection; + +if (is_dbfs($path)) { + $qpath = $path . "/"; +} else { + $qpath = $path; +} + +if ($path && $action != '') { + $sReloadScript = ""; +} else { + $sReloadScript = ""; +} + +$sErrorMessage = ''; + +if ((is_writable($cfgClient[$client]["upl"]["path"] . $path) || is_dbfs($path)) && (int) $client > 0) { + $bDirectoryIsWritable = true; +} else { + $bDirectoryIsWritable = false; + $sErrorMessage = $notification->returnNotification("error", i18n("Directory not writable") . ' (' . $cfgClient[$client]["upl"]["path"] . $path . ')'); + $sErrorMessage .= '
    '; +} + + +if ($action == "upl_modify_file") { + /* Did the user upload a new file? */ + if ($bDirectoryIsWritable == true && count($_FILES) == 1 && ($_FILES["file"]["size"] > 0) && ($_FILES["file"]["name"] != "")) { + if ($_FILES['file']['tmp_name'] != "") { + $tmp_name = $_FILES['file']['tmp_name']; + $_cecIterator = $_cecRegistry->getIterator("Contenido.Upload.UploadPreprocess"); + + if ($_cecIterator->count() > 0) { + /* Copy file to a temporary location */ + move_uploaded_file($tmp_name, $cfg["path"]["contenido"] . $cfg["path"]["temp"] . $file); + $tmp_name = $cfg["path"]["contenido"] . $cfg["path"]["temp"] . $file; + + while ($chainEntry = $_cecIterator->next()) { + if (is_dbfs($path)) { + $sPathPrepend = ''; + $sPathApppend = '/'; + } else { + $sPathPrepend = $cfgClient[$client]['upl']['path']; + $sPathApppend = ''; + } + + $modified = $chainEntry->execute($tmp_name, $sPathPrepend . $path . $sPathApppend . uplCreateFriendlyName($_FILES['file']['name'])); + + if ($modified !== false) { + $tmp_name = $modified; + } + } + } + + if (is_dbfs($path)) { + $dbfs->writeFromFile($tmp_name, $qpath . $file); + unlink($_FILES['file']['tmp_name']); + } else { + unlink($cfgClient[$client]['upl']['path'] . $path . $file); + + if (is_uploaded_file($tmp_name)) { + move_uploaded_file($tmp_name, $cfgClient[$client]['upl']['path'] . $path . $file); + } else { + rename($tmp_name, $cfgClient[$client]['upl']['path'] . $path . $file); + } + } + } + } + + $uploads->select("idclient = '$client' AND dirname = '$qpath' AND filename='$file'"); + $upload = $uploads->next(); + + $upload->set("description", stripslashes($description)); + $upload->store(); + + $properties = new PropertyCollection; + $properties->setValue("upload", $qpath . $file, "file", "protected", stripslashes($protected)); + + $bTimeMng = (isset($_REQUEST['timemgmt']) && strlen($_REQUEST['timemgmt']) > 1); + $properties->setValue("upload", $qpath . $file, "file", "timemgmt", ($bTimeMng) ? 1 : 0); + if ($bTimeMng) { + $properties->setValue("upload", $qpath . $file, "file", "datestart", $_REQUEST['datestart']); + $properties->setValue("upload", $qpath . $file, "file", "dateend", $_REQUEST['dateend']); + } + + $iIdupl = $upload->get("idupl"); + if (!empty($iIdupl) && $iIdupl > 0) { + // check for new entry: + $sSql = "SELECT id_uplmeta FROM " . $cfg['tab']['upl_meta'] . " WHERE idupl = $iIdupl AND idlang = $lang " . + "LIMIT 0, 1"; + $db->query($sSql); + if ($db->num_rows() == 0) { // new entry + $iNextId = $db->nextid($cfg['tab']['upl_meta']); + $sSql = "INSERT INTO " . $cfg['tab']['upl_meta'] . " " . + "SET id_uplmeta = $iNextId, idupl = $iIdupl, idlang = $lang, " . + "medianame = '" . Contenido_Security::filter($medianame, $db) . "', " . + "description = '" . Contenido_Security::filter($description, $db) . "', " . + "keywords = '" . Contenido_Security::filter($keywords, $db) . "', " . + "internal_notice = '" . Contenido_Security::filter($medianotes, $db) . "', " . + "copyright = '" . Contenido_Security::filter($copyright, $db) . "', " . + "author = '" . $auth->auth['uid'] . "', " . + "created = NOW(), modified = NOW(), modifiedby = '" . $auth->auth['uid'] . "'"; + } else { // update entry + $db->next_record(); + $iIduplmeta = $db->f('id_uplmeta'); + $sSql = "UPDATE " . $cfg['tab']['upl_meta'] . " " . + "SET " . + "medianame = '" . Contenido_Security::filter($medianame, $db) . "', " . + "description = '" . Contenido_Security::filter($description, $db) . "', " . + "keywords = '" . Contenido_Security::filter($keywords, $db) . "', " . + "internal_notice = '" . Contenido_Security::filter($medianotes, $db) . "', " . + "copyright = '" . Contenido_Security::filter($copyright, $db) . "', " . + "modified = NOW(), modifiedby = '" . $auth->auth['uid'] . "' " . + "WHERE id_uplmeta = " . $iIduplmeta; + } + $db->query($sSql); + } +} + +if ($action == "upl_multidelete" && $perm->have_perm_area_action($area, $action) && $bDirectoryIsWritable == true) { + if (is_array($fdelete)) { + /* Check if it is in the upload table */ + foreach ($fdelete as $file) { + $uploads->select("idclient = '$client' AND dirname='$qpath' AND filename='$file'"); + if ($item = $uploads->next()) { + if (is_dbfs($qpath)) { + $dbfs->remove($qpath . $file); + } else { + unlink($cfgClient[$client]['upl']['path'] . $qpath . $file); + } + + /* + * Call chain + */ + $_cecIterator = $_cecRegistry->getIterator("Contenido.Upl_edit.Delete"); + if ($_cecIterator->count() > 0) { + while ($chainEntry = $_cecIterator->next()) { + $chainEntry->execute($item->get('idupl'), $qpath, $file); + } + } + } + } + } +} + +if ($action == "upl_delete" && $perm->have_perm_area_action($area, $action) && $bDirectoryIsWritable == true) { + $uploads->select("idclient = '$client' AND dirname='$qpath' AND filename='$file'"); + if ($uploads->next()) { + if (is_dbfs($qpath)) { + $dbfs->remove($qpath . $file); + } else { + unlink($cfgClient[$client]['upl']['path'] . $qpath . $file); + } + + /* + * Call chain + */ + $_cecIterator = $_cecRegistry->getIterator("Contenido.Upl_edit.Delete"); + if ($_cecIterator->count() > 0) { + while ($chainEntry = $_cecIterator->next()) { + $chainEntry->execute($uploads->f('idupl'), $qpath, $file); + } + } + } +} + +if ($action == "upl_upload" && $bDirectoryIsWritable == true) { + //print_r($_FILES); + $bUplErr = false; + if (count($_FILES) == 1) { + foreach ($_FILES['file']['name'] as $key => $value) { + // new error handling + $iError = (int) $_FILES['file']['error'][$key]; + switch ($iError) { + case 1: + $bUplErr = true; + $sErrorMessage .= $notification->returnNotification("error", sprintf(i18n("The uploaded file (%s) exceeds the upload_max_filesize directive in php.ini."), $value)); + $sErrorMessage .= '
    '; + break; + case 2: + case 3: + case 5: + case 6: + case 7: + case 8: + $bUplErr = true; + $sErrorMessage .= $notification->returnNotification("error", sprintf(i18n("Error while uploading file (%s)."), $value)); + $sErrorMessage .= '
    '; + break; + default: + $bUplErr = false; + } + if ($_FILES['file']['tmp_name'][$key] != "") { + $tmp_name = $_FILES['file']['tmp_name'][$key]; + $_cecIterator = $_cecRegistry->getIterator("Contenido.Upload.UploadPreprocess"); + + if ($_cecIterator->count() > 0) { + /* Copy file to a temporary location */ + move_uploaded_file($tmp_name, $cfg["path"]["contenido"] . $cfg["path"]["temp"] . $_FILES['file']['name'][$key]); + $tmp_name = $cfg["path"]["contenido"] . $cfg["path"]["temp"] . $_FILES['file']['name'][$key]; + + while ($chainEntry = $_cecIterator->next()) { + if (is_dbfs($path)) { + $sPathPrepend = ''; + $sPathApppend = '/'; + } else { + $sPathPrepend = $cfgClient[$client]['upl']['path']; + $sPathApppend = ''; + } + + $modified = $chainEntry->execute($tmp_name, $sPathPrepend . $path . $sPathApppend . uplCreateFriendlyName($_FILES['file']['name'][$key])); + + if ($modified !== false) { + $tmp_name = $modified; + } + } + } + + if (is_dbfs($qpath)) { + $dbfs->writeFromFile($tmp_name, $qpath . uplCreateFriendlyName($_FILES['file']['name'][$key])); + unlink($tmp_name); + } else { + if (is_uploaded_file($tmp_name)) { + $final_filename = $cfgClient[$client]['upl']['path'] . $path . uplCreateFriendlyName($_FILES['file']['name'][$key]); + move_uploaded_file($tmp_name, $final_filename); + + $iterator = $_cecRegistry->getIterator("Contenido.Upload.UploadPostprocess"); + while ($chainEntry = $iterator->next()) { + $chainEntry->execute($final_filename); + } + } else { + rename($tmp_name, $cfgClient[$client]['upl']['path'] . $path . uplCreateFriendlyName($_FILES['file']['name'][$key])); + } + } + } + } + } + if ($bUplErr) { + $sTmpErrorMessage = $notification->returnNotification("warning", i18n("Errors while uploading file(s). Some or all files were not uploaded.")); + } + $sErrorMessage = $sTmpErrorMessage . "
    " . $sErrorMessage; +} + +if ($action == "upl_renamefile" && $bDirectoryIsWritable == true) { + $newname = str_replace("/", "", $newname); + rename($cfgClient[$client]['upl']['path'] . $path . $oldname, $cfgClient[$client]['upl']['path'] . $path . $newname); +} + +/** + * + */ +class UploadList extends FrontendList { + + var $dark; + var $size; + + public function convert($field, $data) { + global $cfg, $path, $sess, $cfgClient, $client, $appendparameters; + + switch ($field) { + case 1: + if ($this->dark) { + $data = $cfg["color"]["table_dark"]; + } else { + $data = $cfg["color"]["table_light"]; + } + $this->dark = !$this->dark; + break; + + case 2: + break; + + case 3: + /* If this file is an image, try to open */ + switch (getFileExtension($data)) { + case "png": + case "gif": + case "tiff": + case "bmp": + case "jpeg": + case "jpg": + case "bmp": + case "iff": + case "xbm": + case "wbmp": + $sCacheThumbnail = uplGetThumbnail($data, 150); + $sCacheName = substr($sCacheThumbnail, strrpos($sCacheThumbnail, "/") + 1, strlen($sCacheThumbnail) - (strrchr($sCacheThumbnail, '/') + 1)); + $sFullPath = $cfgClient[$client]['path']['frontend'] . 'cache/' . $sCacheName; + if (file_exists($sFullPath)) { + $aDimensions = getimagesize($sFullPath); + $iWidth = $aDimensions[0]; + $iHeight = $aDimensions[1]; + } else { + $iWidth = 0; + $iHeight = 0; + } + + if (is_dbfs($data)) { + $data = ' + + + '; + break; + } else { + $retValue = ' + + + '; + $retValue .= ''; + $data = $retValue; + } + break; + + default: + $sCacheThumbnail = uplGetThumbnail($data, 150); + return ''; + } + break; + + case 4: + if ($appendparameters == "imagebrowser" || $appendparameters == "filebrowser") { + if (is_dbfs($path . '/' . $data)) { + $mstr = ' ' . $data . ''; + } else { + $mstr = ' ' . $data . ''; + } + } else { + $tmp_mstr = '%s'; + $mstr = sprintf($tmp_mstr, 'right_bottom', $sess->url("main.php?area=upl_edit&frame=4&path=$path&file=$data&appendparameters=$appendparameters&startpage=" . $_REQUEST['startpage'] . "&sortby=" . $_REQUEST['sortby'] . "&sortmode=" . $_REQUEST['sortmode'] . "&thumbnailmode=" . $_REQUEST['thumbnailmode']), 'right_top', $sess->url("main.php?area=upl&frame=3&path=$path&file=$data"), $data); + } + $data = $mstr; + break; + + case 5: + $data = human_readable_size($data); + break; + + case 6: + $data = uplGetFileTypeDescription($data); + break; + } + return $data; + } + +} + +/** + * + * @global type $cfg + * @global type $client + * @global type $cfgClient + * @global type $area + * @global type $frame + * @global type $sess + * @global type $browserparameters + * @global type $appendparameters + * @global type $perm + * @global type $auth + * @global type $sReloadScript + * @global type $notification + * @global type $bDirectoryIsWritable + * @param type $path + * @param int $sortby + * @param string $sortmode + * @param type $startpage + * @param type $thumbnailmode + * @param type $sErrorMessage + * @return type + */ +function uplRender($path, $sortby, $sortmode, $startpage = 1, $thumbnailmode, $sErrorMessage) { + global $cfg, $client, $cfgClient, $area, $frame, $sess, $browserparameters, $appendparameters, $perm, $auth, $sReloadScript, $notification, $bDirectoryIsWritable; + + if ($sortby == "") { + $sortby = 3; + $sortmode = "ASC"; + } + + if ($startpage == "") { + $startpage = 1; + } + + $thisfile = $sess->url("main.php?idarea=$area&frame=$frame&path=$path&thumbnailmode=$thumbnailmode&appendparameters=$appendparameters"); + $scrollthisfile = $thisfile . "&sortmode=$sortmode&sortby=$sortby&appendparameters=$appendparameters"; + + if ($sortby == 3 && $sortmode == "DESC") { + $fnsort = '' . i18n("Filename / Description") . ''; + } else { + if ($sortby == 3) { + $fnsort = '' . i18n("Filename / Description") . ''; + } else { + $fnsort = '' . i18n("Filename / Description") . ''; + } + } + + if ($sortby == 5 && $sortmode == "DESC") { + $sizesort = '' . i18n("Size") . ''; + } else { + if ($sortby == 5) { + $sizesort = '' . i18n("Size") . ''; + } else { + $sizesort = '' . i18n("Size") . ""; + } + } + + if ($sortby == 6 && $sortmode == "DESC") { + $typesort = '' . i18n("Type") . ''; + } else { + if ($sortby == 6) { + $typesort = '' . i18n("Type") . ''; + } else { + $typesort = '' . i18n("Type") . ""; + } + } + + // Multiple deletes at top of table + if ($perm->have_perm_area_action("upl", "upl_multidelete") && $bDirectoryIsWritable == true) { + $sConfirmation = "box.confirm('" . i18n('Delete Files') . "', '" . i18n('Are you sure you want to delete the selected files?') . "', 'document.del.action.value = \\\\'upl_multidelete\\\\'; document.del.submit()');"; + $sDelete = '' . i18n(' . i18n("Delete selected files") . ''; + } else { + $sDelete = ''; + } + + if (is_dbfs($path)) { + $mpath = $path . "/"; + } else { + $mpath = "upload/" . $path; + } + + $sDisplayPath = generateDisplayFilePath($mpath, 85); + + $sToolsRow = ' + +
    + ' . i18n( ' . i18n("Flip Selection") . ' +   + ' . $sDelete . ' +
    + + ' . i18n("Path:") . " " . $sDisplayPath . ' + +
    + + '; + $sSpacedRow = ' + + '; + /* List wraps */ + + $pagerwrap = ' + +
    -C-SCROLLRIGHT-
    +
    -C-PAGE-
    +
    -C-SCROLLLEFT-
    + ' . i18n("Files per Page") . ' -C-FILESPERPAGE- +
    + + '; + + $startwrap = ' + ' . $pagerwrap . $sSpacedRow . $sToolsRow . $sSpacedRow . ' + + + + + + + + '; + $itemwrap = ' + + + + + + + '; + $endwrap = $sSpacedRow . $sToolsRow . $sSpacedRow . $pagerwrap . '
    ' . i18n("Mark") . '' . i18n("Preview") . '' . $fnsort . '' . $sizesort . '' . $typesort . '' . i18n("Actions") . '
    %s%s%s%s%s%s
    '; + + /* Object initializing */ + $page = new UI_Page; + $page->addScript('reloadscript', $sReloadScript); + $list2 = new UploadList($startwrap, $endwrap, $itemwrap); + + $uploads = new UploadCollection; + + /* Fetch data */ + if (substr($path, strlen($path) - 1, 1) != "/") { + if ($path != "") { + $qpath = $path . "/"; + } + } else { + $qpath = $path; + } + + $uploads->select("idclient = '$client' AND dirname = '$qpath'"); + + $user = new User; + $user->loadUserByUserID($auth->auth["uid"]); + + if ($thumbnailmode == '') { + $current_mode = $user->getUserProperty('upload_folder_thumbnailmode', md5($path)); + if ($current_mode != '') { + $thumbnailmode = $current_mode; + } else { + $thumbnailmode = getEffectiveSetting('backend', 'thumbnailmode', 100); + } + } + + switch ($thumbnailmode) { + case 25: $numpics = 25; + break; + case 50: $numpics = 50; + break; + case 100:$numpics = 100; + break; + case 200:$numpics = 200; + break; + default: $thumbnailmode = 100; + $numpics = 15; + break; + } + + # + $user->setUserProperty('upload_folder_thumbnailmode', md5($path), $thumbnailmode); + + $list2->setResultsPerPage($numpics); + + $list2->size = $thumbnailmode; + + $rownum = 0; + + $properties = new PropertyCollection; + + while ($item = $uploads->next()) { + $filename = $item->get("filename"); + + $bAddFile = true; + + + if ($appendparameters == "imagebrowser") { + $restrictvar = "restrict_" . $appendparameters; + if (array_key_exists($restrictvar, $browserparameters)) { + $extension = getFileExtension($filename); + if (count($browserparameters[$restrictvar]) > 0) { + $bAddFile = false; + if (in_array($extension, $browserparameters[$restrictvar])) { + $bAddFile = true; + } + } + } + } + + $dirname = $item->get("dirname"); + $filesize = $item->get("size"); + + if ($filesize == 0) { + if (file_exists($cfgClient[$client]["upl"]["path"] . $dirname . $filename)) { + $filesize = filesize($cfgClient[$client]["upl"]["path"] . $dirname . $filename); + } + } + + $actions = ""; + + $medianame = $properties->getValue("upload", $path . $filename, "file", "medianame"); + $medianotes = $properties->getValue("upload", $path . $filename, "file", "medianotes"); + + $todo = new TODOLink("upload", $path . $filename, "File $path$filename", ""); + + $proptitle = i18n("Display properties"); + + if ($appendparameters == "imagebrowser" || $appendparameters == "filebrowser") { + $mstr = ""; + } else { + $tmp_mstr = '%s'; + $mstr = sprintf($tmp_mstr, 'right_bottom', $sess->url("main.php?area=upl_edit&frame=4&path=$path&file=$filename&startpage=$startpage&sortby=$sortby&sortmode=$sortmode&thumbnailmode=$thumbnailmode"), 'right_top', $sess->url("main.php?area=upl&frame=3&path=$path&file=$filename"), '' . $proptitle . ''); + } + + $actions = $mstr . $actions; + + $showfilename = $filename; + + $check = new cHTMLCheckbox("fdelete[]", $filename); + + $mark = $check->toHTML(false); + + if ($bAddFile == true) { + // 'bgcolor' is just a placeholder... + $list2->setData($rownum, 'bgcolor', $mark, $dirname . $filename, $showfilename, $filesize, getFileExtension($filename), $todo->render() . $actions); + $rownum++; + } + } + + if ($rownum == 0) { + $markSubItem = markSubMenuItem(0, true); + $page->setContent($sErrorMessage . i18n("No files found") . $markSubItem); + $page->render(); + return; + } + + if ($sortmode == "ASC") { + $list2->sort($sortby, SORT_ASC); + } else { + $list2->sort($sortby, SORT_DESC); + } + + if ($startpage < 1) { + $startpage = 1; + } + + if ($startpage > $list2->getNumPages()) { + $startpage = $list2->getNumPages(); + } + + $list2->setListStart($startpage); + + /* Create scroller */ + if ($list2->getCurrentPage() > 1) { + $prevpage = '' . i18n("Previous Page") . ''; + } else { + $prevpage = ' '; + } + + if ($list2->getCurrentPage() < $list2->getNumPages()) { + $nextpage = '' . i18n("Next Page") . ''; + } else { + $nextpage = ' '; + } + + #$curpage = $list2->getCurrentPage() . " / ". $list2->getNumPages(); + + + + + if ($list2->getNumPages() > 1) { + $num_pages = $list2->getNumPages(); + + $paging_form.=""; + $paging_form.=""; + } else { + $paging_form = "1"; + } + $curpage = $paging_form . " / " . $list2->getNumPages(); + + $scroller = $prevpage . $nextpage; + $output = $list2->output(true); + $output = str_replace("-C-SCROLLLEFT-", $prevpage, $output); + $output = str_replace("-C-SCROLLRIGHT-", $nextpage, $output); + $output = str_replace("-C-PAGE-", i18n("Page") . " " . $curpage, $output); + + $select = new cHTMLSelectElement("thumbnailmode_input"); + + $values = Array( + 25 => "25", + 50 => "50", + 100 => "100", + 200 => "200"); + + foreach ($values as $key => $value) { + $option = new cHTMLOptionElement($value, $key); + $select->addOptionElement($key, $option); + } + + $select->setDefault($thumbnailmode); + $select->setEvent('change', "document.del.thumbnailmode.value = this.value;"); + + $topbar = $select->render() . ''; + + $output = str_replace("-C-FILESPERPAGE-", $topbar, $output); + + + $page->addScript('messagebox', ''); + + $sDelTitle = i18n("Delete file"); + $sDelDescr = i18n("Do you really want to delete the following file:
    "); + + $script = ' + '; + + $script = str_replace('{SID}', $sess->id, $script); + $script = str_replace('{RENAME}', i18n("Enter new filename"), $script); + + $page->addScript("script", $script); + $markSubItem = markSubMenuItem(0, true); + + + $delform = new UI_Form("del"); + $delform->setVar("area", $area); + $delform->setVar("action", ""); + $delform->setVar("startpage", $startpage); + $delform->setVar("thumbnailmode", $thumbnailmode); + $delform->setVar("sortmode", $sortmode); + $delform->setVar("sortby", $sortby); + $delform->setVar("appendparameters", $appendparameters); + $delform->setVar("path", $path); + $delform->setVar("frame", 4); + + + // Table with (preview) images + $delform->add("list", $output); + + + $page->addScript('iZoom', ''); + $page->addScript('style', ''); + + $sScriptinBody = ' + '; + $page->addScript('style', ''); + $page->setContent($sScriptinBody . $sErrorMessage . $delform->render()); + $page->render(); +} + +uplSyncDirectory($path); +uplRender($path, $sortby, $sortmode, $startpage, $thumbnailmode, $sErrorMessage); +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_files_upload.php b/conlite/includes/include.upl_files_upload.php new file mode 100644 index 0000000..f1759d5 --- /dev/null +++ b/conlite/includes/include.upl_files_upload.php @@ -0,0 +1,70 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-30 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-09-20, Dominik Ziegler, added path to error message when directory is not writable - CON-319 + * + * $Id: include.upl_files_upload.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.upl.php"); + +$page = new UI_Page; + +if ((is_writable($cfgClient[$client]["upl"]["path"].$path) || is_dbfs($path)) && (int) $client > 0) +{ + $form = new UI_Table_Form("properties"); + $form->setVar("frame", $frame); + $form->setVar("area", "upl"); + $form->setVar("path", $path); + $form->setVar("file", $file); + $form->setVar("action", "upl_upload"); + $form->setVar("appendparameters", $_REQUEST["appendparameters"]); + + $form->addHeader(i18n("Upload")); + + if (is_dbfs($path)) + $mpath = $path."/"; + else + $mpath = "upload/".$path; + + $sDisplayPath = generateDisplayFilePath($mpath, 85); + $form->add(i18n("Path:"), $sDisplayPath); + + $uplelement = new cHTMLUpload("file[]",40); + $num_upload_files = getEffectiveSetting('backend','num_upload_files',10); + $form->add(i18n("Upload files"), str_repeat($uplelement->render()."
    " ,$num_upload_files)); + + $page->setContent($form->render()); +} else { + $page->setContent($notification->returnNotification("error", i18n("Directory not writable") . ' (' . $cfgClient[$client]["upl"]["path"].$path . ')')); +} +$page->render(); +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_left_top.php b/conlite/includes/include.upl_left_top.php new file mode 100644 index 0000000..aa6e26f --- /dev/null +++ b/conlite/includes/include.upl_left_top.php @@ -0,0 +1,163 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-04-01 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.upl_left_top.php 283 2014-01-09 14:48:38Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.con.php"); +cInclude("includes", "functions.str.php"); +cInclude("includes", "functions.upl.php"); + +$tpl->set('s', 'FORMACTION', ''); +$sDisplayPath = ''; +if (isset($_REQUEST['path'])) { + $sDisplayPath = $_REQUEST['path']; +} else { + $sDisplayPath = $sCurrentPathInfo; +} + +$sDisplayPath = generateDisplayFilePath($sDisplayPath, 35); +$tpl->set('s', 'CAPTION2', $sDisplayPath); + +#display notification, if there is no client +if ((int) $client == 0) { + $sNoClientNotification = '
    '.i18n('No Client selected').'
    '; + $tpl->set('s', 'NOTIFICATION', $sNoClientNotification); +} else { + $tpl->set('s', 'NOTIFICATION', ''); +} + +##################### +# Form for 'Search' +##################### +if ($appendparameters != 'filebrowser' && (int) $client > 0) { + $search = new cHTMLTextbox("searchfor", $_REQUEST['searchfor'], 26); + $search->setStyle("width:170px;"); + $sSearch = $search->render(); + + $form = new UI_Form("search"); + $form->add("search", '
    '.$sSearch.'
    '); + $form->setVar("area", $area); + $form->setVar("frame", $frame); + $form->setVar("contenido", $sess->id); + $form->setVar("appendparameters", $appendparameters); + $tpl->set('s', 'SEARCHFORM', $form->render()); + $tpl->set('s', 'SEARCHTITLE', i18n("Search for")); + $tpl->set('s', 'DISPLAY_SEARCH', 'block'); +} else { + $tpl->set('s', 'SEARCHFORM', ''); + $tpl->set('s', 'SEARCHTITLE', ''); + $tpl->set('s', 'DISPLAY_SEARCH', 'none'); +} + +if ($perm->have_perm_area_action("upl", "upl_mkdir") && (int) $client > 0) +{ + $sCurrentPathInfo = ""; + if ($sess->is_registered("upl_last_path") && !isset($path)) + { + $path = $upl_last_path; + } + + if ($path == "" || is_dbfs($path)) + { + $sCurrentPathInfo = $path; + } + else + { + $sCurrentPathInfo = str_replace($cfgClient[$client]['upl']['path'], "", $path); + } + + ########################### + # Form for 'New Directory' + ########################### + $inputfield = ' + + + + '; + $tpl->set('s', 'ACTION', $inputfield); + $sessURL = $sess->url("main.php?area=upl_mkdir&frame=2&appendparameters=$appendparameters"); + $tpl->set('s', 'TARGET', 'onsubmit="parent.frames[2].location.href=\''.$sess->url("main.php?area=upl&action=upl_mkdir&frame=2&appendparameters=$appendparameters"). + '&path=\'+document.newdir.path.value+\'&foldername=\'+document.newdir.foldername.value;"'); + $tpl->set('s', 'SUBMIT', ''); + $tpl->set('s', 'CAPTION', i18n("Create directory in")); + $tpl->set('s', 'DEBUG', ''); + $tpl->set('s', 'DISPLAY_DIR', 'block'); +} +// No permission with current rights +else +{ + $tpl->set('s', 'CAPTION', ''); + $tpl->set('s', 'CAPTION2', ''); + $inputfield = ''; + $tpl->set('s', 'TARGET', ''); + $tpl->set('s', 'SUBMIT', ''); + $tpl->set('s', 'ACTION', ''); + $tpl->set('s', 'DISPLAY_DIR', 'none'); +} + +############# +# Searching +############# +if ($searchfor != "") +{ + $items = uplSearch($searchfor); + + $tmp_mstr = 'conMultiLink(\'%s\', \'%s\', \'%s\', \'%s\')'; + $mstr = sprintf($tmp_mstr, + 'right_bottom', + $sess->url("main.php?area=upl_search_results&frame=4&searchfor=$searchfor&appendparameters=$appendparameters"), + 'right_top', + $sess->url("main.php?area=$area&frame=3&appendparameters=$appendparameters")); + $refreshMenu = "\n".'if (top.content.left.left_bottom) top.content.left.left_bottom.refreshMenu()'; + $tpl->set('s', 'RESULT', $mstr.$refreshMenu); +} +else +{ + $tpl->set('s', 'RESULT', ''); +} + +# create javascript multilink +$tmp_mstr = '%s'; +$mstr = sprintf($tmp_mstr, 'right_top', $sess->url("main.php?area=$area&frame=3&path=$pathstring&appendparameters=$appendparameters"), 'right_bottom', $sess->url("main.php?area=$area&frame=4&path=$pathstring&appendparameters=$appendparameters"), ''.$file); + +$tpl->set('d', 'PATH', $pathstring); +$tpl->set('d', 'BGCOLOR', $bgcolor); +$tpl->set('d', 'INDENT', 3); +$tpl->set('d', 'DIRNAME', $mstr); +$tpl->set('d', 'EDITBUTTON', ''); +$tpl->set('d', 'DELETEBUTTON', ''); +$tpl->set('d', 'COLLAPSE', ''); +$tpl->next(); +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['upl_left_top']); + +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_search_results.php b/conlite/includes/include.upl_search_results.php new file mode 100644 index 0000000..5e7c8e0 --- /dev/null +++ b/conlite/includes/include.upl_search_results.php @@ -0,0 +1,632 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-12-29 + * modified 2008-06-27, Frederic Schneider, add security fix + * + * $Id: include.upl_search_results.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "api/functions.frontend.list.php"); +cInclude("includes", "functions.upl.php"); + +$appendparameters = $_REQUEST["appendparameters"]; + +class UploadList extends FrontendList +{ + var $dark; + var $size; + var $pathdata; + + function convert($field, $data) + { + global $cfg, $sess, $client, $cfgClient, $appendparameters; + + if ($field == 6) + { + if ($data == "") + { + return i18n("None"); + } + } + if ($field == 5) + { + return human_readable_size($data); + } + + if ($field == 4) + { + if ($data == "") + { + return " "; + } else + { + return $data; + } + } + + if ($field == 3) + { + $vpath = str_replace($cfgClient[$client]["upl"]["path"], "", $this->pathdata); + $slashpos = strrpos($vpath, "/"); + if ($slashpos === false) + { + $file = $vpath; + } else + { + $path = substr($vpath, 0, $slashpos +1); + $file = substr($vpath, $slashpos +1); + } + + if ($appendparameters == "imagebrowser" || $appendparameters == "filebrowser") + { + $mstr = ''.$data.''; + } else + { + $markLeftPane = "parent.parent.frames['left'].frames['left_bottom'].upl.click(parent.parent.frames['left'].frames['left_bottom'].document.getElementById('$path'));"; + + $tmp_mstr = '%s'; + $mstr = sprintf($tmp_mstr, 'right_bottom', $sess->url("main.php?area=upl_edit&frame=4&path=$path&file=$file"), 'right_top', $sess->url("main.php?area=upl&frame=3&path=$path&file=$file"), $data); + } + return $mstr; + } + + if ($field == 2) + { + $this->pathdata = $data; + + /* If this file is an image, try to open */ + switch (getFileExtension($data)) + { + case "png" : + case "psd" : + case "gif" : + case "tiff" : + case "bmp" : + case "jpeg" : + case "jpg" : + case "bmp" : + case "iff" : + case "xbm" : + case "wbmp" : + $sCacheThumbnail = uplGetThumbnail($data, 150); + $sCacheName = substr($sCacheThumbnail, strrpos($sCacheThumbnail, "/")+1, strlen($sCacheThumbnail)-(strrchr($sCacheThumbnail, '/')+1)); + $sFullPath = $cfgClient[$client]['path']['frontend'].'cache/'.$sCacheName; + if (file_exists($sFullPath)) { + $aDimensions = getimagesize($sFullPath); + $iWidth = $aDimensions[0]; + $iHeight = $aDimensions[1]; + } else { + $iWidth = 0; + $iHeight = 0; + } + + if (is_dbfs($data)) + { + $retValue = + ' + + + '; + return $retValue; + } else { + $retValue = + ' + + + '; + $retValue .= ''; + return $retValue; + } + break; + default: + $sCacheThumbnail = uplGetThumbnail($data, 150); + return ''; + } + } + + if ($field == 1) + { + if ($this->dark) + { + $data = $cfg["color"]["table_dark"]; + } else + { + $data = $cfg["color"]["table_light"]; + } + $this->dark = !$this->dark; + } + + return $data; + } +} + +function uplRender($searchfor, $sortby, $sortmode, $startpage = 1, $thumbnailmode) +{ + global $cfg, $client, $cfgClient, $area, $frame, $sess, $appendparameters; + + if ($sortby == "") + { + $sortby = 7; + $sortmode = "DESC"; + } + + if ($startpage == "") + { + $startpage = 1; + } + + $thisfile = $sess->url("main.php?idarea=$area&frame=$frame&appendparameters=$appendparameters&searchfor=$searchfor&thumbnailmode=$thumbnailmode"); + $scrollthisfile = $thisfile."&sortmode=$sortmode&sortby=$sortby"; + + if ($sortby == 3 && $sortmode == "DESC") + { + $fnsort = ''.i18n("Filename / Description").''; + } else + { + if ($sortby == 3) + { + $fnsort = ''.i18n("Filename / Description").''; + } else + { + $fnsort = ''.i18n("Filename / Description").''; + } + } + + if ($sortby == 4 && $sortmode == "DESC") + { + $pathsort = ''.i18n("Path").''; + } else + { + if ($sortby == 4) + { + $pathsort = ''.i18n("Path").''; + } else + { + $pathsort = ''.i18n("Path").""; + } + } + + if ($sortby == 5 && $sortmode == "DESC") + { + $sizesort = ''.i18n("Size").''; + } else + { + if ($sortby == 5) + { + $sizesort = ''.i18n("Size").''; + } else + { + $sizesort = ''.i18n("Size").""; + } + } + + if ($sortby == 6 && $sortmode == "DESC") + { + $typesort = ''.i18n("Type").''; + } else + { + if ($sortby == 6) + { + $typesort = ''.i18n("Type").''; + } else + { + $typesort = ''.i18n("Type").""; + } + } + + if ($sortby == 7 && $sortmode == "DESC") + { + $srelevance = ''.i18n("Relevance").''; + } else + { + if ($sortby == 7) + { + $srelevance = ''.i18n("Relevance").''; + } else + { + $srelevance = ''.i18n("Relevance").""; + } + } + + $sToolsRow = ' + +
    '.i18n("Searched for:")." ".$searchfor.'
    +
    + + '; + + /* List wraps */ + + $sSpacedRow = ' + + '; + + $pagerwrap = ' + +
    -C-SCROLLRIGHT-
    +
    -C-PAGE-
    +
    -C-SCROLLLEFT-
    + '.i18n("Files per Page").' -C-FILESPERPAGE- +
    + + '; + + $startwrap = + ' + + '.$pagerwrap.$sSpacedRow.$sToolsRow.$sSpacedRow.' + + + + + + + + '; + $itemwrap = ' + + + + + + + + '; + $endwrap = $sSpacedRow.$sToolsRow.$sSpacedRow.$pagerwrap.'
    '.i18n("Preview").''.$fnsort.''.$pathsort.''.$sizesort.''.$typesort.''.$srelevance.'
    %s%s%s%s%s%s
    '; + + /* Object initializing */ + $page = new UI_Page; + $list2 = new UploadList($startwrap, $endwrap, $itemwrap); + + $uploads = new UploadCollection; + + /* Fetch data */ + $files = uplSearch($searchfor); + + $user = new User; + $user->loadUserByUserID($auth->auth["uid"]); + + if ($thumbnailmode == '') + { + $current_mode = $user->getUserProperty('upload_folder_thumbnailmode', md5('search_results_num_per_page')); + if ($current_mode != '') + { + $thumbnailmode = $current_mode; + } + else + { + $thumbnailmode = getEffectiveSetting('backend','thumbnailmode',100); + } + } + + switch ($thumbnailmode) + { + case 25: $numpics = 25; break; + case 50: $numpics = 50; break; + case 100:$numpics = 100; break; + case 200:$numpics = 200; break; + default: $thumbnailmode = 100; + $numpics = 15; + break; + } + + $user->setUserProperty('upload_folder_thumbnailmode', md5('search_results_num_per_page'), $thumbnailmode); + + $list2->setResultsPerPage($numpics); + + $list2->size = $thumbnailmode; + + $rownum = 0; + if (!is_array($files)) + { + $files = array (); + } + + arsort($files, SORT_NUMERIC); + + $count = 0; + $properties = new PropertyCollection; + + foreach ($files as $file => $rating) + { + + $slashpos = strrpos($file, "/"); + + if ($slashpos === false) + { + $myfilename = $file; + $mydirname = ""; + } else + { + $myfilename = substr($file, $slashpos +1); + $mydirname = substr($file, 0, $slashpos +1); + } + $path = $mydirname; + + $filename = $myfilename; + $dirname = $cfgClient[$client]["upl"]["path"].$mydirname; + + $uploads->select("idclient = '$client' AND dirname = '$mydirname' AND filename = '$filename'"); + + if ($item = $uploads->next()) + { + $filesize = $item->get("size"); + + if ($filesize == 0) + { + if (file_exists($dirname.$filename)) + { + $filesize = filesize($dirname.$filename); + } + + } + + $description = $item->get("description"); + } else + { + if (file_exists($dirname.$filename)) + { + $filesize = filesize($dirname.$filename); + } + } + + $dark = !$dark; + + $count ++; + + $medianame = $properties->getValue("upload", $mydirname.$filename, "file", "medianame"); + $medianotes = $properties->getValue("upload", $mydirname.$filename, "file", "medianotes"); + + $showfilename = $filename; + $bgColor = false; + + $list2->setData($rownum, $bgColor, $mydirname.$filename, $showfilename, $mydirname, $filesize, getFileExtension($filename), $rating / 10); + + $rownum ++; + } + + if ($rownum == 0) + { + $page->setContent(i18n("No files found")); + $page->render(); + return; + } + + if ($sortmode == "ASC") + { + $list2->sort($sortby, SORT_ASC); + } else + { + $list2->sort($sortby, SORT_DESC); + } + + if ($startpage < 1) + { + $startpage = 1; + } + + if ($startpage > $list2->getNumPages()) + { + $startpage = $list2->getNumPages(); + } + + $list2->setListStart($startpage); + + /* Create scroller */ + if ($list2->getCurrentPage() > 1) + { + $prevpage = ''.i18n("Previous Page").''; + } else { + $nextpage = ' '; + } + + if ($list2->getCurrentPage() < $list2->getNumPages()) + { + $nextpage = ''.i18n("Next Page").''; + } else { + $nextpage = ' '; + } + + if ($list2->getNumPages()>1) { + $num_pages = $list2->getNumPages(); + + $paging_form.=""; + $paging_form.=""; + } else { + $paging_form="1"; + } + + $curpage = $paging_form . " / ". $list2->getNumPages(); + + $scroller = $prevpage.$nextpage; + + $output = $list2->output(true); + + $output = str_replace("-C-SCROLLLEFT-", $prevpage, $output); + $output = str_replace("-C-SCROLLRIGHT-", $nextpage, $output); + $output = str_replace("-C-PAGE-", i18n("Page")." ".$curpage, $output); + $output = str_replace("-C-THUMBNAILMODE-", $thumbnailmode, $output); + + $form = new UI_Form("options"); + $form->setVar("contenido", $sess->id); + $form->setVar("area", $area); + $form->setVar("frame", $frame); + $form->setVar("searchfor", $searchfor); + $form->setVar("sortmode", $sortmode); + $form->setVar("sortby", $sortby); + $form->setVar("startpage", $startpage); + $form->setVar("appendparameters", $appendparameters); + + $select = new cHTMLSelectElement("thumbnailmode_input"); + + $values = Array( + 25 => "25", + 50 => "50", + 100 => "100", + 200 => "200"); + + foreach ($values as $key => $value) + { + $option = new cHTMLOptionElement($value, $key); + $select->addOptionElement($key, $option); + } + + $select->setDefault($thumbnailmode); + $select->setEvent('change', "document.options.thumbnailmode.value = this.value"); + + $topbar = $select->render().''; + + $output = str_replace("-C-FILESPERPAGE-", $topbar, $output); + + $script = ' + '; + + $script = str_replace('{SID}', $sess->id, $script); + $script = str_replace('{RENAME}', i18n("Enter new filename"), $script); + + $page->addScript("script", $script); + $markSubItem = markSubMenuItem(0, true); + + $page->addScript("mark", $markSubItem); + $page->addScript('iZoom', ''); + $page->addScript('style', ''); + $form->add("", $output); + $page->setContent($form->render()); + $page->render(); +} + +uplRender($searchfor, $sortby, $sortmode, $startpage, $thumbnailmode); +?> \ No newline at end of file diff --git a/conlite/includes/include.upl_subnav.php b/conlite/includes/include.upl_subnav.php new file mode 100644 index 0000000..b5ce7e0 --- /dev/null +++ b/conlite/includes/include.upl_subnav.php @@ -0,0 +1,117 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-25 + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.upl_subnav.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// Use remembered path from upl_last_path (from session) +if (!isset($_GET['path']) && $sess->is_registered("upl_last_path")) +{ + $_GET['path'] = $upl_last_path; +} + +if ( isset($_GET['path']) ) +{ + $path = $_GET['path']; + $area = $_GET['area']; + + $nav = new Contenido_Navigation; + + $sql = "SELECT + idarea + FROM + ".$cfg["tab"]["area"]." AS a + WHERE + a.name = '".Contenido_Security::escapeDB($area, $db)."' OR + a.parent_id = '".Contenido_Security::escapeDB($area, $db)."' + ORDER BY + idarea"; + + $db->query($sql); + + $in_str = ""; + + while ( $db->next_record() ) { + $in_str .= $db->f('idarea') . ','; + } + + $len = strlen($in_str)-1; + $in_str = substr($in_str, 0, $len); + $in_str = '('.$in_str.')'; + + $sql = "SELECT + b.location AS location, + a.name AS name + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.idarea IN ".$in_str." AND + b.idarea = a.idarea AND + b.level = 1 AND + b.online = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + + while ( $db->next_record() ) + { + /* Extract names from the XML document. */ + $caption = $nav->getName($db->f("location")); + + $tmp_area = $db->f("name"); + + if ($perm->have_perm_area_action($tmp_area)) + { + if ($tmp_area != "upl_edit") + { + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + } + } + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third + # navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} +?> \ No newline at end of file diff --git a/conlite/includes/index.php b/conlite/includes/index.php new file mode 100644 index 0000000..ef8b776 --- /dev/null +++ b/conlite/includes/index.php @@ -0,0 +1,4 @@ + diff --git a/conlite/includes/main.login.php b/conlite/includes/main.login.php new file mode 100644 index 0000000..e09755c --- /dev/null +++ b/conlite/includes/main.login.php @@ -0,0 +1,291 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-21 + * modified 2008-06-26, Dominik Ziegler, update notifier class added + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2009-12-14, Dominik Ziegler, use User::getRealname() for user name output and provide username fallback + * modified 2010-05-20, Oliver Lohkemper, add param true for get active admins + * modified 2011-01-28, Dominik Ziegler, added missing notice in backend home when no clients are available [#CON-379] + * + * $Id: main.login.php 309 2014-05-19 11:21:16Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude('pear', 'XML/Parser.php'); +cInclude('pear', 'XML/RSS.php'); + +if(!isset($oTpl) || !is_object($oTpl)) { + $oTpl = new Template(); +} +$oTpl->reset(); + +if ($saveLoginTime == true) { + $sess->register("saveLoginTime"); + $saveLoginTime= 0; + + $vuser= new User(); + + $vuser->loadUserByUserID($auth->auth["uid"]); + + $lastTime= $vuser->getUserProperty("system", "currentlogintime"); + $timestamp= date("Y-m-d H:i:s"); + $vuser->setUserProperty("system", "currentlogintime", $timestamp); + $vuser->setUserProperty("system", "lastlogintime", $lastTime); + +} + +$vuser= new User(); +$vuser->loadUserByUserID($auth->auth["uid"]); +$lastlogin= $vuser->getUserProperty("system", "lastlogintime"); + +if ($lastlogin == "") { + $lastlogin= i18n("No Login Information available."); +} + +$aNotifications = array(); +// notification for requested password +if($vuser->getField('using_pw_request') == 1) { + //$sPwNoti = $notification->returnNotification("warning", i18n("You're logged in with a temporary password. Please change your password.")); + $aNotifications[] = i18n("You're logged in with a temporary password. Please change your password."); +} + +// Check, if setup folder is still available +if (file_exists(dirname(dirname(dirname(__FILE__)))."/setup")) { + $aNotifications[] = i18n("The setup directory still exists. Please remove the setup directory before you continue."); +} + +// Check, if sysadmin and/or admin accounts are still using well-known default passwords +$sDate = date('Y-m-d'); +$sSQL = "SELECT * FROM ".$cfg["tab"]["phplib_auth_user_md5"]." + WHERE (username = 'sysadmin' AND password = '48a365b4ce1e322a55ae9017f3daf0c0' + AND (valid_from <= '".Contenido_Security::escapeDB($sDate, $db)."' OR valid_from = '0000-00-00' OR valid_from is NULL) AND + (valid_to >= '".Contenido_Security::escapeDB($sDate, $db)."' OR valid_to = '0000-00-00' OR valid_to is NULL)) + OR (username = 'admin' AND password = '21232f297a57a5a743894a0e4a801fc3' + AND (valid_from <= '".Contenido_Security::escapeDB($sDate, $db)."' OR valid_from = '0000-00-00' OR valid_from is NULL) AND + (valid_to >= '".Contenido_Security::escapeDB($sDate, $db)."' OR valid_to = '0000-00-00' OR valid_to is NULL)) + "; +$db->query($sSQL); + +if ($db->num_rows() > 0) { + $aNotifications[] = i18n("The sysadmin and/or the admin account still contains a well-known default password. Please change immediately."); +} + +if (count($aNotifications) > 0) { + $oNotification = new Contenido_Notification(); + $sNotification = $oNotification->messageBox("warning", implode("
    ", $aNotifications), 1). "
    "; +} else { + $sNotification = ""; +} + +$oTpl->set('s', 'NOTIFICATION', $sNotification); + +$userid = $auth->auth["uid"]; + +$oTpl->set('s', 'WELCOME', "" . i18n("Welcome") . " " . $vuser->getRealname($userid, true) . "."); +$oTpl->set('s', 'LASTLOGIN', i18n("Last login") . ": " . $lastlogin); + +$clients= $classclient->getAccessibleClients(); + +$cApiClient= new cApiClient; +$warnings= array (); + +if (count($clients) > 1) { + $clientform= '
    '; + $select= new cHTMLSelectElement("changeclient"); + $choices= array (); + foreach ($clients as $key => $v_client) { + if ($perm->hasClientPermission($key)) { + + $cApiClient->loadByPrimaryKey($key); + if ($cApiClient->hasLanguages()) { + $choices[$key]= $v_client['name'] . " (" . $key . ')'; + } else { + $warnings[]= sprintf(i18n("Client %s (%s) has no languages"), $v_client['name'], $key); + } + + } + } + + $select->autoFill($choices); + $select->setDefault($client); + + $clientselect= $select->render(); + + $oTpl->set('s', 'CLIENTFORM', $clientform); + $oTpl->set('s', 'CLIENTFORMCLOSE', "
    "); + $oTpl->set('s', 'CLIENTSDROPDOWN', $clientselect); + + if ($perm->have_perm() && count($warnings) > 0) { + $oTpl->set('s', 'WARNINGS', "
    " . $notification->messageBox("warning", implode("
    ", $warnings), 0)); + } else { + $oTpl->set('s', 'WARNINGS', ''); + } + $oTpl->set('s', 'OKBUTTON', ''); +} else { + $oTpl->set('s', 'OKBUTTON', ''); + $sClientForm = ''; + if ( count($clients) == 0 ) { + $sClientForm = i18n('No clients available!'); + } + $oTpl->set('s', 'CLIENTFORM', $sClientForm); + $oTpl->set('s', 'CLIENTFORMCLOSE', ''); + + + foreach ($clients as $key => $v_client) { + if ($perm->hasClientPermission($key)) { + $cApiClient->loadByPrimaryKey($key); + if ($cApiClient->hasLanguages()) { + $name= $v_client['name'] . " (" . $key . ')'; + } else { + $warnings[]= sprintf(i18n("Client %s (%s) has no languages"), $v_client['name'], $key); + } + } + } + + if ($perm->have_perm() && count($warnings) > 0) { + $oTpl->set('s', 'WARNINGS', "
    " . $notification->messageBox("warning", implode("
    ", $warnings), 0)); + } else { + $oTpl->set('s', 'WARNINGS', ''); + } + + $oTpl->set('s', 'CLIENTSDROPDOWN', $name); +} + +$props= new PropertyCollection; +$props->select("itemtype = 'idcommunication' AND idclient='$client' AND type = 'todo' AND name = 'status' AND value != 'done'"); + +$todoitems= array (); + +while ($prop= $props->next()) { + $todoitems[]= $prop->get("itemid"); +} + +if (count($todoitems) > 0) { + $in= "idcommunication IN (" . implode(",", $todoitems) . ")"; +} else { + $in= 1; +} +$todoitems= new TODOCollection; +$recipient= $auth->auth["uid"]; +$todoitems->select("recipient = '$recipient' AND idclient='$client' AND $in"); + +while ($todo= $todoitems->next()) { + if ($todo->getProperty("todo", "status") != "done") { + $todoitems++; + } +} + +$sTaskTranslation = ''; +if ($todoitems->count() == 1) { + $sTaskTranslation = i18n("Reminder list: %d Task open"); +} else { + $sTaskTranslation = i18n("Reminder list: %d Tasks open"); +} + +$mycontenido_overview= '' . i18n("Overview") . ''; +$mycontenido_lastarticles= '' . i18n("Recently edited articles") . ''; +$mycontenido_tasks= '' . sprintf($sTaskTranslation, $todoitems->count()) . ''; +$mycontenido_settings= '' . i18n("Settings") . ''; + +$oTpl->set('s', 'MYCONTENIDO_OVERVIEW', $mycontenido_overview); +$oTpl->set('s', 'MYCONTENIDO_LASTARTICLES', $mycontenido_lastarticles); +$oTpl->set('s', 'MYCONTENIDO_TASKS', $mycontenido_tasks); +$oTpl->set('s', 'MYCONTENIDO_SETTINGS', $mycontenido_settings); +$admins= $classuser->getSystemAdmins(true); + +$sAdminTemplate = '
  • %s, %s
  • '; + +$sAdminName= ""; +$sAdminEmail = ""; +$sOutputAdmin = ""; + + +foreach ($admins as $key => $value) { + if ($value["email"] != "") { + $sAdminEmail= '' . $value["email"] . ''; + $sAdminName= $value['realname']; + $sOutputAdmin .= sprintf($sAdminTemplate, $sAdminName, $sAdminEmail); + } +} + +$oTpl->set('s', 'ADMIN_EMAIL', $sOutputAdmin); + +$oTpl->set('s', 'SYMBOLHELP', '' . i18n("Symbol help") . ''); + +if (isset($cfg["contenido"]["handbook_path"]) && file_exists($cfg["contenido"]["handbook_path"])) { + $oTpl->set('s', 'CONTENIDOMANUAL', '' . i18n("Contenido Manual") . ''); +} else { + $oTpl->set('s', 'CONTENIDOMANUAL', ''); +} + +// For display current online user in Contenido-Backend +$aMemberList= array (); +$oActiveUsers= new ActiveUsers($db, $cfg, $auth); +$iNumberOfUsers = 0; + +// Start() +$oActiveUsers->startUsersTracking(); + +//Currently User Online +$iNumberOfUsers = $oActiveUsers->getNumberOfUsers(); + +// Find all User who is online +$aMemberList= $oActiveUsers->findAllUser(); + +// Template for display current user +$sTemplate = ""; +$sOutput = ""; +$sTemplate= '
  • %s, %s
  • '; + +foreach ($aMemberList as $key) { + $sRealName= $key['realname']; + $aPerms['0']= $key['perms']; + $sOutput .= sprintf($sTemplate, $sRealName, $aPerms['0']); +} + +// set template welcome +$oTpl->set('s', 'USER_ONLINE', $sOutput); +$oTpl->set('s', 'Anzahl', $iNumberOfUsers); + +// rss feed +if($perm->isSysadmin($vuser) && isset($cfg["backend"]["newsfeed"]) && $cfg["backend"]["newsfeed"] == true){ + $newsfeed = 'some news'; + $oTpl->set('s', 'CONTENIDO_NEWS', $newsfeed); +} +else{ + $oTpl->set('s', 'CONTENIDO_NEWS', ''); +} + +// check for new updates +$oUpdateNotifier = new Contenido_UpdateNotifier($cfg, $vuser, $perm, $sess, $belang); +$sUpdateNotifierOutput = $oUpdateNotifier->displayOutput(); +$oTpl->set('s', 'UPDATENOTIFICATION', $sUpdateNotifierOutput); + +$oTpl->generate($cfg["path"]["templates"] . $cfg["templates"]["welcome"]); + +?> \ No newline at end of file diff --git a/conlite/includes/old.config.misc.php b/conlite/includes/old.config.misc.php new file mode 100755 index 0000000..f6c8dde --- /dev/null +++ b/conlite/includes/old.config.misc.php @@ -0,0 +1,302 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: config.misc.php 301 2014-02-03 22:30:20Z oldperl $: + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +global $cfg; + +/* IMPORTANT! Put your modifications into the file "config.local.php" + to prevent that your changes are overwritten during a system update. */ + +/* Misc settings + * ---------------------------------- + * + * Actually no variables, but important settings + * for error handling and logging. + */ + +/* Current Version. You shouldn't change this + value unless you know what you are doing. */ +$cfg['version'] = '2.0.0'; + +/* Login languages. Temporarly hardcoded due to recode of language selection */ +$cfg["login_languages"] = array("de_DE", "en_US"); + +/* SVN Date tag */ +$cfg['datetag'] = '$Date: 2014-02-03 23:30:20 +0100 (Mo, 03 Feb 2014) $'; + +/* Backend timeout */ +$cfg["backend"]["timeout"] = 60; + +$cfg["develop"]["show_errors"] = false; +$cfg["develop"]["show_deprecated"] = false; + +/* Use Pseudo-Cron? */ +$cfg["use_pseudocron"] = true; + +/* If you want to measure function timing set this to true */ +$cfg["debug"]["functiontiming"] = false; + +/* If you want to measure backend page rendering times, set this + to true */ + +$cfg["debug"]["rendering"] = false; + +/* To output the code when editing and browsing the frontend, set + this to true */ +$cfg["debug"]["codeoutput"] = false; + +/* If true, use the field "urlname" for resolving. "name" otherwise */ +$cfg["urlpathresolve"] = false; + +/* E-Mail-Address where bug reports will be sent to */ +$cfg['bugreport']['targetemail'] = 'bugs@conlite.org'; + +/* The available charsets */ +$cfg['AvailableCharsets'] = array( + 'iso-8859-1', + 'iso-8859-2', + 'iso-8859-3', + 'iso-8859-4', + 'iso-8859-5', + 'iso-8859-6', + 'iso-8859-7', + 'iso-8859-8', + 'iso-8859-8-i', + 'iso-8859-9', + 'iso-8859-10', + 'iso-8859-11', + 'iso-8859-12', + 'iso-8859-13', + 'iso-8859-14', + 'iso-8859-15', + 'iso-8859-16', + 'windows-1250', + 'windows-1251', + 'windows-1252', + 'windows-1253', + 'windows-1254', + 'windows-1255', + 'windows-1256', + 'windows-1257', + 'windows-1258', + 'koi8-r', + 'big5', + 'gb2312', + 'utf-8', + 'utf-7', + 'x-user-defined', + 'euc-jp', + 'ks_c_5601-1987', + 'tis-620', + 'SHIFT_JIS' +); + + +/* Error handling settings + * ---------------------------------- + * + * Actually no variables, but important settings + * for error handling and logging. + */ + +/* Don't display errors */ +@ini_set("display_errors",true); + +/* Log errors to a file */ +@ini_set("log_errors",true); + +/* The file in which we write the error log */ +@ini_set("error_log",$cfg["path"]["contenido"].$cfg['path']['logs']."errorlog.txt"); + +/* Report all errors except warnings */ +if($cfg["develop"]["show_errors"] && $_SERVER['SERVER_NAME'] == "localhost") { + error_reporting(E_ALL); +} else { + if($cfg["develop"]["show_deprecated"]) { + error_reporting (E_ALL ^E_NOTICE); + } else { + if(version_compare(PHP_VERSION, '5.3.0', '<')) { // remove unknown deprecated for PHP < 5.3 + error_reporting (E_ALL ^E_NOTICE); + } else if(version_compare(PHP_VERSION, '5.4.0', '>=')) { + error_reporting (E_ALL ^E_NOTICE ^E_DEPRECATED ^E_USER_DEPRECATED ^E_STRICT); + } else { + error_reporting (E_ALL ^E_NOTICE ^E_DEPRECATED ^E_USER_DEPRECATED); + } + } +} + + +/* Session data storage container (PHPLIB) + * ---------------------------------- + * + * Different session data storage containers are available. + * file = session data will be stored in a file on the file system + * sql = session data will be stored in a database table - as it is + */ + +/* default container is sql */ +$cfg["session_container"] = 'sql'; + +/* Use heap table to accelerate statitics (off by default) */ +$cfg["statistics_heap_table"] = false; + +/* HTTP parameter check + * + * This feature checks GET and POST parameters against a whitelist defined in + * $cfg['http_params_check']['config']. Depending on mode administrated in the + * same config as the whitelist contenido will stop processing in case of unknown + * or invalid GET parameter. + * + * For further informations and initial discussion see http://contenido.org/forum/viewtopic.php?p=113492! + * + * Special thx to kummer! + */ +// turns parameter checking on or off +$cfg['http_params_check']['enabled'] = false; + +// configuration file (whitelist and mode) +$cfg['http_params_check']['config'] = $cfg["path"]["contenido"] . $cfg["path"]["includes"] . '/config.http_check.php'; + +/* max file size for one session file */ +$cfg['session_line_length'] = 99999; + + +/** + * Cache settings + * ---------------------------------- + * + * Following cache settings don't affect the caching behaviour at frontend. + * + * Only enabling the caching ($cfg["cache"]["disable"] = false) will activate processing of + * caching at frontend. + * Everything else has to be configured in a client caching specific file which is available + * in clients frontend path, see cms/includes/concache.php. + * + * So, if you want do enable frontend caching, set $cfg["cache"]["disable"] to false and configure + * the rest in cms/includes/concache.php! + * + * @TODO: Need a caching solution with better integration in Contenido core + */ +// (bool) Enable/Disable caching +$cfg['cache']['disable'] = true; + +// (string) Directory, where to store cache files. +// NOTE: This setting doesn't affects frontend caching +$cfg['cache']['dir'] = 'cache/'; + +// (int) Lifetime of cached files in seconds. +// NOTE: This setting doesn't affects frontend caching +$cfg['cache']['lifetime'] = 3600; + + +/** + * GenericDB settings + * ---------------------------------- + */ +// (string) The GenericDB driver to use, at the moment only "mysql" is supported +$cfg['sql']['gdb_driver'] = 'mysql'; + +// (int) Number of GenericDB items per table to cache +$cfg['sql']['cache']['max_items_to_cache'] = 10; + +// (bool) Enable GenericDB item cache +$cfg['sql']['cache']['enable'] = true; + +// (bool) Enable mode to select all fields in GenericDB item collections. +$cfg['sql']['select_all_mode'] = true; + + + +/* Help system, currently not used */ +$cfg['help'] = false; + +/* Configure page if Contenido is unable to run (e.g. no database connection) + * It is wise to create a maintenance HTML page for redirection, so you won't + * confuse your customers. + * + * Note: The URL should be absolute with http:// in front of it. + */ +$cfg["contenido"]["errorpage"] = ""; + +/* Configure an email address to alert when Contenido is unable to run. */ +$cfg["contenido"]["notifyonerror"] = ""; + +/* Configure how often the notification email is sent, in minutes */ +$cfg["contenido"]["notifyinterval"] = 20; + + +/** + * UrlBuilder settings + * ---------------------------------- + * + * Configuration of UrlBuilder to use. + * + * Example setting for UrlBuilder 'front_content' (generates URLs like '/cms/front_content.php?idcat=2&lang=1'): + * $cfg['url_builder']['name'] = 'front_content'; + * $cfg['url_builder']['config'] = array(); + * + * Example setting for UrlBuilder 'custom_path' (generates URLs like '/cms/Was-ist-Contenido/rocknroll,a,2.4fb'): + * $cfg['url_builder']['name'] = 'custom_path'; + * $cfg['url_builder']['config'] = array('prefix' => 'rocknroll', 'suffix' => '.4fb', 'separator' => ','); + * + * See also http://forum.contenido.org/viewtopic.php?f=64&t=23280 + */ +// (string) Name of UrlBuilder to use. +// Feasible values are 'front_content', 'custom', 'custom_path' or a user defined name. +// Check out Contenido_UrlBuilderFactory::getUrlBuilder() in +// contenido/classes/UrlBuilder/Contenido_UrlBuilderFactory.class.php for more details +// about this setting. +$cfg['url_builder']['name'] = 'front_content'; + +// (array) Default UrlBuilder configuration. +// An associative configuration array which will be passed to the UrlBuilder instance. +// Values depend on used UrlBuilder. +$cfg['url_builder']['config'] = array(); + + +/** + * Password Settings + * For more comments please look in class.conuser.php file + */ +// Enable or disable checking password (true or false) +$cfg['password']['check_password_mask'] = false; + +// Minimum length of password (num characters). Default is 8. +$cfg['password']['min_length'] = 6; + +// If set to a value greater than 0 so many lower and upper case character must appear in the password. +// (e.g.: if set to 2, 2 upper and 2 lower case characters must appear) +$cfg['password']['mixed_case_mandatory'] = 3; + +// If 'symbols_mandatory' set to a value greater than 0, at least so many symbols has to appear in given password. +$cfg['password']['symbols_mandatory'] = 3; + +// If set to a value greater than 0, at least $cfg['password']['numbers_mandatory'] numbers must be in password +$cfg['password']['numbers_mandatory'] = 3; + +/** + * Content Type Settings + */ +// Define here all content types which includes special module translations (dont forget the prefix "CMS_"!) +$cfg['translatable_content_types'] = array('CMS_TEASER', 'CMS_FILELIST'); +?> diff --git a/conlite/includes/pseudo-cron.inc.php b/conlite/includes/pseudo-cron.inc.php new file mode 100644 index 0000000..9187c53 --- /dev/null +++ b/conlite/includes/pseudo-cron.inc.php @@ -0,0 +1,447 @@ +Configuration:"; + echo "\nPC_cronTab = ".$PC_cronTab; + echo "\nPC_writeDir = ".$PC_writeDir; + echo "\nPC_jobDir = ".$PC_jobDir; + echo "\nPC_reqDir = ".$PC_reqDir; + echo "\nPC_useLog = ".$PC_useLog; + echo "\n"; +} + +global $bJobRunned; + +$bJobRunned = false; + +chdir($PC_jobDir); +$PC_jobs = parseCronFile($PC_cronTab, $PC_debug); + +for ($i=0;$i"; + + +function logMessage($msg, $PC_writeDir, $PC_useLog, $PC_debug) { + + if ($PC_useLog==1) { + $logfile = $PC_writeDir."pseudo-cron.log"; + + if (is_writable($logfile)) + { + $file = fopen($logfile,"ab"); + if ($msg[strlen($msg)-1]!="\n") { + $msg.="\r\n"; + } + if ($PC_debug) echo $msg; + fputs($file,date("r",time())." ".$msg); + fclose($file); + } + } +} + +function lTrimZeros($number) { + + while ($number[0]=='0') { + $number = substr($number,1); + } + return $number; +} + +function parseElement($element, &$targetArray, $numberOfElements) { + + $subelements = explode(",",$element); + for ($i=0;$i<$numberOfElements;$i++) { + $targetArray[$i] = $subelements[0]=="*"; + } + + for ($i=0;$i$lastActual) { + logMessage("Running ".$job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); + logMessage(" Last run: ".date("r",$lastActual), $PC_writeDir, $PC_useLog, $PC_debug); + logMessage(" Last scheduled: ".date("r",$lastScheduled), $PC_writeDir, $PC_useLog, $PC_debug); + markLastRun($job[PC_CMD], $lastScheduled, $PC_writeDir); + + if ($PC_debug) { + echo getcwd(); + include($PC_jobDir.$job[PC_CMD]); // display errors only when debugging + } else { + if (is_object($sess)) + { + $sess->freeze(); + } + @include($PC_jobDir.$job[PC_CMD]); // any error messages are supressed + if (is_object($sess)) + { + $sess->thaw(); + } + } + logMessage("Completed ".$job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); + return true; + } else { + if ($PC_debug) { + logMessage("Skipping ".$job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); + logMessage(" Last run: ".date("r",$lastActual), $PC_writeDir, $PC_useLog, $PC_debug); + logMessage(" Last scheduled: ".date("r",$lastScheduled), $PC_writeDir, $PC_useLog, $PC_debug); + logMessage("Completed ".$job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); + } + return false; + } +} + +function parseCronFile($PC_cronTabFile, $PC_debug) { + + $file = @file($PC_cronTabFile); + $job = Array(); + $jobs = Array(); + for ($i=0;$i diff --git a/conlite/includes/rights.inc.php b/conlite/includes/rights.inc.php new file mode 100644 index 0000000..9c58e58 --- /dev/null +++ b/conlite/includes/rights.inc.php @@ -0,0 +1,374 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: rights.inc.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +function saverights() { + global $rights_list, $rights_list_old, $db; + global $cfg, $userid, $rights_client, $rights_lang; + global $perm, $sess, $notification; + + //if no checkbox is checked + if (!is_array($rights_list)) { + $rights_list = array (); + } + + //search all checks which are not in the new Rights_list for deleting + $arraydel = array_diff(array_keys($rights_list_old), array_keys($rights_list)); + //search all checks which are not in the Rights_list_old for saving + $arraysave = array_diff(array_keys($rights_list), array_keys($rights_list_old)); + + if (is_array($arraydel)) { + + foreach ($arraydel as $value) { + + $data = explode("|", $value); + $data[0] = $perm->getIDForArea($data[0]); + $data[1] = $perm->getIDForAction($data[1]); + + $sql = "DELETE FROM ".$cfg["tab"]["rights"]." WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND idarea='".Contenido_Security::toInteger($data[0])."' AND idcat='".Contenido_Security::toInteger($data[2])."' AND idaction='".Contenido_Security::toInteger($data[1])."' AND type=0"; + $db->query($sql); + } + } + + unset($data); + + //search for all mentioned checkboxes + if (is_array($arraysave)) { + foreach ($arraysave as $value) { + //explodes the key it consits areait+actionid+itemid + $data = explode("|", $value); + + // Since areas are stored in a numeric form in the rights table, we have + // to convert them from strings into numbers + + $data[0] = $perm->getIDForArea($data[0]); + $data[1] = $perm->getIDForAction($data[1]); + + if (!isset ($data[1])) { + $data[1] = 0; + } + // Insert new right + $sql = "INSERT INTO ".$cfg["tab"]["rights"]." + (idright, user_id,idarea,idaction,idcat,idclient,idlang,type) + VALUES ('".$db->nextid($cfg["tab"]["rights"])."', '".Contenido_Security::escapeDB($userid, $db)."','".Contenido_Security::toInteger($data[0])."','".Contenido_Security::toInteger($data[1])."','".Contenido_Security::toInteger($data[2])."','".Contenido_Security::toInteger($rights_client)."','".Contenido_Security::toInteger($rights_lang)."',0)"; + $db->query($sql); + } + } + + $rights_list_old = $rights_list; + //$notification->displayNotification("info", i18n("Changes saved"),0); +} + +function saverightsarea() +{ + global $db, $cfg,$userid,$rights_client,$rights_lang,$rights_admin,$rights_sysadmin,$rights_perms,$rights_list; + + if(!isset($rights_perms)){ + //search for the permissions of this user + $sql="SELECT perms FROM ".$cfg["tab"]["phplib_auth_user_md5"]." WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."'"; + $db->query($sql); + $db->next_record(); + $rights_perms=$db->f("perms"); + } + + //if there are no permissions, delete permissions for lan and client + if(!is_array($rights_list)){ + $rights_perms=preg_replace("/,+client\[$rights_client\]/","",$rights_perms); + $rights_perms=preg_replace("/,+lang\[$rights_lang\]/","",$rights_perms); + }else{ + if(!strstr($rights_perms,"client[$rights_client]")) + $rights_perms.=",client[$rights_client]"; + if(!strstr($rights_perms,"lang[$rights_lang]")) + $rights_perms.=",lang[$rights_lang]"; + } + + //if admin is checked + if($rights_admin==1){ + //if admin is not set + if(!strstr($rights_perms,"admin[$rights_client]")) + $rights_perms.=",admin[$rights_client]"; + }else{ + //cut admin from the string + $rights_perms=preg_replace("/,*admin\[$rights_client\]/","",$rights_perms); + } + + //if sysadmin is checked + if($rights_sysadmin==1){ + //if sysadmin is not set + if(!strstr($rights_perms,"sysadmin")) + $rights_perms.=",sysadmin"; + }else{ + //cat sysadmin from string + $rights_perms=preg_replace("/,*sysadmin/","",$rights_perms); + } + + + //cut ',' in front of the string + $rights_perms=preg_replace("/^,/","",$rights_perms); + + //update table + $sql="UPDATE ".$cfg["tab"]["phplib_auth_user_md5"]." SET perms='".Contenido_Security::escapeDB($rights_perms, $db)."' WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."'"; + + $db->query($sql); + + //save the other rights + saverights(); +} + +if (!is_object($oTpl)) { + $oTpl = new Template(); +} +$oTpl->reset(); + +if(!is_object($db2)) +$db2 = new DB_ConLite; + +if(!isset($rights_client)){ + $rights_client=$client; + $rights_lang=$lang; +} + +//set new right_list (=all possible rights) +if(!is_array($right_list)){ + # modified 2007-08-03, H. Librenz - this breaks, i do not know really know why, the session if storage container for session is other than database! + # PS: this is a hard, damn shit area of code -- ARRRGGGHHHH!!!!!!! + //register these list fore following sites +// $sess->register("right_list"); + + $plugxml=new XML_Doc(); + + //select all rights , actions an theeir locations without area login + $sql="SELECT A.idarea, A.parent_id, B.location,A.name FROM ".$cfg["tab"]["area"]." as A LEFT JOIN ".$cfg["tab"]["nav_sub"]." as B ON A.idarea = B.idarea WHERE A.name!='login' AND A.relevant='1' AND A.online='1' GROUP BY A.name ORDER BY A.idarea"; + $db->query($sql); + + while($db->next_record()) + { + if($db->f("parent_id")=="0"){ + $right_list[$db->f("name")][$db->f("name")]["perm"]=$db->f("name"); + + $right_list[$db->f("name")][$db->f("name")]["location"]=$db->f('location'); + }else{ + $right_list[$db->f("parent_id")][$db->f("name")]["perm"]=$db->f("name"); + $right_list[$db->f("parent_id")][$db->f("name")]["location"] = $db->f('location'); + } + + $sql="SELECT * FROM ".$cfg["tab"]["actions"]." WHERE idarea='".Contenido_Security::toInteger($db->f("idarea"))."' AND relevant='1'"; + $db2->query($sql); + while($db2->next_record()) + { + if($db->f("parent_id")=="0"){ + $right_list[$db->f("name")][$db->f("name")]["action"][]=$db2->f("name"); + }else{ + $right_list[$db->f("parent_id")][$db->f("name")]["action"][]=$db2->f("name"); + } + } + } +} + +$oTpl->set('s', 'SESS_ID', $sess->id); +$oTpl->set('s', 'ACTION_URL', $sess->url("main.php")); +// type id for user +$oTpl->set('s', 'TYPE_ID', 'userid'); +$oTpl->set('s', 'USER_ID', $userid); +$oTpl->set('s', 'AREA', $area); +$oTpl->set('s', 'TABLE_BORDER', $cfg["color"]["table_border"]); +$oTpl->set('s', 'TABLE_BGCOLOR', $cfg["color"]["table_dark"]); + +if(!isset($actionarea)){ + $actionarea="area"; +} + +$muser = new User; +$muser->loadUserByUserID($userid); + +$userperms = $muser->getField("perms"); + +ob_start(); + +$oTpl->set('s', 'RIGHTS_PERMS', $rights_perms); + + +//selectbox for clients +$oHtmlSelect = new cHTMLSelectElement ('rights_clientslang', "", "rights_clientslang"); + + $clientclass = new Client; + $clientList = $clientclass->getAccessibleClients(); + + $firstsel = false; + + $i = 0; + foreach ($clientList as $key=>$value) { + + $sql="SELECT * FROM ".$cfg["tab"]["lang"]." as A, ".$cfg["tab"]["clients_lang"]." as B WHERE B.idclient='".Contenido_Security::toInteger($key)."' AND A.idlang=B.idlang"; + $db->query($sql); + + while($db->next_record()) + { + if((strpos($userperms, "client[$key]") !== false) && + (strpos($userperms, "lang[".$db->f("idlang")."]") !== false) + && ($perm->have_perm("lang[".$db->f("idlang")."]"))){ + + if ($firstsel == false) + { + $firstsel = true; + $firstclientslang = $db->f("idclientslang"); + } + + if ($rights_clientslang == $db->f("idclientslang")) { + $oHtmlSelectOption = new cHTMLOptionElement($value["name"] . " -> ".$db->f("name"), $db->f("idclientslang"), true); + $oHtmlSelect->addOptionElement($i, $oHtmlSelectOption); + $i++; + + if(!isset($rights_client)) + { + $firstclientslang = $db->f("idclientslang"); + } + } else { + $oHtmlSelectOption = new cHTMLOptionElement($value["name"] . " -> ".$db->f("name"), $db->f("idclientslang"), false); + $oHtmlSelect->addOptionElement($i, $oHtmlSelectOption); + $i++; + } + } + } + } + + $oTpl->set('s', 'INPUT_SELECT_CLIENT', $oHtmlSelect->render()); + + if ($area == 'user_content') { + #filter for displaying rights + $oHtmlSelect = new cHTMLSelectElement ('filter_rights', '', "filter_rights"); + $oHtmlSelectOption = new cHTMLOptionElement('--- '.i18n("All").' ---', '', false); + $oHtmlSelect->addOptionElement(0, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Article rights"), 'article', false); + $oHtmlSelect->addOptionElement(1, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Category rights"), 'category', false); + $oHtmlSelect->addOptionElement(2, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Template rights"), 'template', false); + $oHtmlSelect->addOptionElement(3, $oHtmlSelectOption); + $oHtmlSelectOption = new cHTMLOptionElement(i18n("Plugin/Other rights"), 'other', false); + $oHtmlSelect->addOptionElement(4, $oHtmlSelectOption); + $oHtmlSelect->setEvent('change', "document.rightsform.submit();"); + $oHtmlSelect->setDefault($_POST['filter_rights']); + + #set global array which defines rights to display + $aArticleRights = array('con_syncarticle', 'con_lock', 'con_deleteart', 'con_makeonline', 'con_makestart', 'con_duplicate', 'con_editart', 'con_newart', 'con_edit'); + $aCategoryRights = array('con_synccat', 'con_makecatonline', 'con_makepublic'); + $aTempalteRights = array('con_changetemplate', 'con_tplcfg_edit'); + + $aViewRights = array(); + $bExclusive = false; + if (isset($_POST['filter_rights'])) { + switch($_POST['filter_rights']) { + case 'article': + $aViewRights = $aArticleRights; + break; + case 'category': + $aViewRights = $aCategoryRights; + break; + case 'template': + $aViewRights = $aTempalteRights; + break; + case 'other': + $aViewRights = array_merge($aArticleRights, $aCategoryRights, $aTempalteRights); + $bExclusive = true; + break; + default: + break; + } + } + $oTpl->set('s', 'INPUT_SELECT_RIGHTS', $oHtmlSelect->render()); + $oTpl->set('s', 'DISPLAY_RIGHTS', 'block'); + } else { + $oTpl->set('s', 'INPUT_SELECT_RIGHTS', ''); + $oTpl->set('s', 'DISPLAY_RIGHTS', 'none'); + } +//navigation + +if(!isset($rights_clientslang)) +{ + $rights_clientslang = $firstclientslang; +} + +$sql = "SELECT idclient, idlang FROM ".$cfg["tab"]["clients_lang"]." WHERE idclientslang = '".Contenido_Security::toInteger($rights_clientslang)."'"; +$db->query($sql); + +$bEndScript = false; + +if ($db->next_record()) +{ + $rights_client = $db->f("idclient"); + $rights_lang = $db->f("idlang"); + $oTpl->set('s', 'NOTIFICATION', ''); + $oTpl->set('s', 'DISPLAY_FILTER', 'block'); +} else { + $bEndScript = true; + ob_end_clean(); + + // Account is sysadmin + if (strpos($userperms, "sysadmin") !== false) + { + $oTpl->set('s', 'NOTIFICATION', $notification->messageBox("warning", i18n("The selected user is a system administrator. A system administrator has all rights for all clients for all languages and therefore rights can't be specified in more detail."),0)); + } + // Account is only assigned to clients with admin rights + else if (strpos($userperms, "admin[") !== false) + { + $oTpl->set('s', 'NOTIFICATION', $notification->messageBox("warning", i18n("The selected user is assigned to clients as admin, only. An admin has all rights for a client and therefore rights can't be specified in more detail."),0)); + } + else + { + $oTpl->set('s', 'NOTIFICATION', $notification->messageBox("error", i18n("Current user doesn't have any rights to any client/language."),0)); + } + $oTpl->set('s', 'DISPLAY_FILTER', 'none'); +} + +if ($bEndScript != true) { + $tmp = ob_get_contents(); + ob_end_clean(); + $oTpl->set('s', 'OB_CONTENT', $tmp); +} else { + $oTpl->set('s', 'OB_CONTENT', ''); +} + +if ($bEndScript == true) { + $oTpl->set('s', 'RIGHTS_CONTENT', ''); + $oTpl->set('s', 'JS_SCRIPT_BEFORE', ''); + $oTpl->set('s', 'JS_SCRIPT_AFTER', ''); + $oTpl->set('s', 'RIGHTS_CONTENT', ''); + $oTpl->set('s', 'EXTERNAL_SCRIPTS', ''); + $oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); + die(); +} +?> diff --git a/conlite/includes/rights_area.inc.php b/conlite/includes/rights_area.inc.php new file mode 100644 index 0000000..b94996c --- /dev/null +++ b/conlite/includes/rights_area.inc.php @@ -0,0 +1,195 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: rights_area.inc.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/rights.inc.php'); +$debug = 0; + +//set the areas which are in use for selecting these + +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND idcat='0' AND A.idaction = C.idaction AND A.idarea = B.idarea"; +$db->query($sql); + +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) +{ + saverights(); +} else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + +$sJsBefore .= "var areatree=new Array();\n"; + +if(!isset($rights_perms)||$action==""||!isset($action)){ + + //search for the permissions of this user + $sql="SELECT perms FROM ".$cfg["tab"]["phplib_auth_user_md5"]." WHERE user_id='$userid'"; + + $db->query($sql); + $db->next_record(); + $rights_perms=$db->f("perms"); + +} + +$table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $table->start_table(); + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(" ","left"); +$sTable .= $table->header_cell(" ","left"); +$sTable .= $table->header_cell(i18n("Check all"),"left"); +$sTable .= $table->end_row(); + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell("", "center", '', '', 0); +$sTable .= $table->end_row(); + +$nav = new Contenido_Navigation; +foreach($right_list as $key => $value){ + // look for possible actions in mainarea + foreach($value as $key2 =>$value2) + { + if($key==$key2){ + //does the user have the right + if(in_array($value2["perm"]."|fake_permission_action|0",array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + $darkRow = !$darkRow; + if ($darkRow) { + $bgColor = $cfg["color"]["table_dark"]; + } else { + $bgColor = $cfg["color"]["table_light"]; + } + + + /* Extract names from the XML document. */ + $main = $nav->getName(str_replace('/overview', '/main', $value2['location'])); + + if ($debug) + { + $locationString = $value2["location"] . " " . $value2["perm"]. "-->".$main; + } else { + $locationString = $main; + } + + $sTable .= $table->row(); + $sTable .= $table->cell($locationString,"", "", " class=\"td_rights1\"", false); + $sTable .= $table->cell("" ,"", "", " class=\"td_rights2\"", false); + $sTable .= $table->cell("","", "", " class=\"td_rights2\"", false); + $sTable .= $table->end_row(); + + //set javscript array for areatree + $sJsBefore .= " + areatree[\"$key\"]=new Array(); + areatree[\"$key\"][\"".$value2["perm"]."0\"]=\"rights_list[".$value2["perm"]."|fake_permission_action|0]\"\n"; + } + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + $idaction = $value3; + //does the user have the right + if(in_array($value2["perm"]."|$idaction|0",array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + $darkRow = !$darkRow; + if ($darkRow) { + $bgColor = $cfg["color"]["table_dark"]; + } else { + $bgColor = $cfg["color"]["table_light"]; + } + + //set the checkbox the name consits of areait+actionid+itemid + $sCellContent = ''; + if ($debug) + { + $sCellContent = "     " . $value2["perm"] . " | ". $value3 . "-->".$lngAct[$value2["perm"]][$value3]."    "; + } else { + if ($lngAct[$value2["perm"]][$value3] == "") + { + $sCellContent = "     " . $value2["perm"] . "|" .$value3 ."    "; + + } else { + $sCellContent = "     " . $lngAct[$value2["perm"]][$value3]."    "; + } + } + + $sTable .= $table->row(); + $sTable .= $table->cell($sCellContent,"left", "", " class=\"td_rights1\"", false); + $sTable .= $table->cell("", false); + $sTable .= $table->cell(" ", false); + $sTable .= $table->end_row(); + + //set javscript array for areatree + $sJsBefore .= "areatree[\"$key\"][\"".$value2["perm"]."$value3\"]=\"rights_list[".$value2["perm"]."|$value3|0]\"\n"; + + } + } + //checkbox for checking all actions fore this itemid +} + +$sTable .= $table->row(); +$sTable .= $table->sumcell("","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); +?> diff --git a/conlite/includes/rights_con.inc.php b/conlite/includes/rights_con.inc.php new file mode 100644 index 0000000..a3de1d2 --- /dev/null +++ b/conlite/includes/rights_con.inc.php @@ -0,0 +1,234 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: rights_con.inc.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/rights.inc.php'); +//set the areas which are in use fore selecting these + +$possible_area = "'".implode("','", $area_tree[$perm->showareas("con")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' AND idclient='".Contenido_Security::toInteger($rights_client)."' AND A.type = 0 AND idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) +{ + saverights(); +} else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + + $sJsExternal .= ''."\n"; + $sJsExternal .= ''; + // declare new javascript variables; + $sJsBefore .=" + var itemids=new Array(); + var actareaids=new Array();\n"; + + $colspan=0; + + $table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + + $sTable .= $table->start_table(); + $sTable .= $table->header_row(); + $sTable .= $table->header_cell(i18n("Category"),"left"); + $sTable .= $table->header_cell(" ","left"); + + $sCheckboxesRow = ''; + $possible_areas=array(); + $aSecondHeaderRow=array(); + // look for possible actions in mainarea [] in str and con + foreach($right_list["con"] as $value2) + { + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + if ((in_array($value3, $aViewRights) && !$bExclusive) || + (!in_array($value3, $aViewRights) && $bExclusive) || + (count($aViewRights) == 0)) { + //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + + $colspan++; + //set the possible areas and actions for this areas + + //checkbox for the whole action + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\"\n"; + + array_push($aSecondHeaderRow, ""); + } + + } + } + + //checkbox for all rights + $sTable .= $table->header_cell(i18n("Check all")); + array_push($aSecondHeaderRow, ""); + $sTable .= $table->end_row(); + $colspan++; + + $sTable .= $table->header_row(); + $sTable .= $table->header_cell(' ',"center", '', '', 0); + $sTable .= $table->header_cell(' ',"center", '', '', 0); + + foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); + } + $sTable .= $table->end_row(); + + $sql = "SELECT A.idcat, level, name,parentid FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND C.idlang='$rights_lang' AND B.idclient='$rights_client' ORDER BY idtree"; + + $db->query($sql); + $counter=array(); + $parentid="leer"; + + $aRowname = array(); + $iLevel = 0; + + while ($db->next_record()) { + $iCurrentIdCat = $db->f('idcat'); + + if ($db->f("level") == 0 && $db->f("preid") != 0) { + $sTable .= $table->row(); + $sTable .= $table->sumcell(" ","right"); + $sTable .= $table->end_row(); + }else { + if ($db->f("level") < $iLevel) { + $iDistance = $iLevel-$db->f("level"); + + for ($i = 0; $i < $iDistance; $i++) { + array_pop($aRowname); + } + $iLevel = $db->f("level"); + } + + if ($db->f("level") >= $iLevel) { + if ($db->f("level") == $iLevel) { + array_pop($aRowname); + } else { + $iLevel = $db->f("level"); + } + array_push($aRowname, $db->f("idcat")); + } + + //find out parentid for inheritance + //if parentid is the same increase the counter + if($parentid==$db->f("parentid")){ + + $counter[$parentid]++; + }else{ + $parentid=$db->f("parentid"); + // if these parentid is in use increase the counter + if(isset($counter[$parentid])){ + $counter[$parentid]++; + }else{ + $counter[$parentid]=0; + } + + + } + + $spaces = ''; + + $sTable .= $table->row("id=\"".implode('_', $aRowname)."\""); + $sTable .= $table->cell($spaces.$db->f("name"),"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell("f("idcat")."')\" class=\"action\">","", "", " class=\"td_rights1\"", false); + + $sJsAfter.="itemids[\"".$db->f("idcat")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + + foreach($right_list["con"] as $value2){ + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + if ((in_array($value3, $aViewRights) && !$bExclusive) || + (!in_array($value3, $aViewRights) && $bExclusive) || + (count($aViewRights) == 0)) { + //does the user have the right + if(isset($rights_list_old[$value2["perm"]."|$value3|".$iCurrentIdCat])) + $checked="checked=\"checked\""; + else + $checked=""; + + //set the checkbox the name consits of areaid+actionid+itemid the id = parebntid+couter for these parentid+areaid+actionid + $sTable .= $table->cell("f("idcat")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + } + } + } + + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idcat")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idcat")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $table->end_row(); + } +} + +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +$sJsAfter .= " + aTranslations = new Object(); + aTranslations['pfeil_links.gif'] = '".i18n("Apply rights for this category to all categories on the same level or above")."'; + aTranslations['pfeil_runter.gif'] = '".i18n("Apply rights for this category to all categories below the current category")."'; + setImageTags(aTranslations); + + init('".i18n("Open category")."', '".i18n("Close category")."');\n"; + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); +?> diff --git a/conlite/includes/rights_lay.inc.php b/conlite/includes/rights_lay.inc.php new file mode 100644 index 0000000..d47d4dc --- /dev/null +++ b/conlite/includes/rights_lay.inc.php @@ -0,0 +1,165 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * + * $Id: rights_lay.inc.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/rights.inc.php'); +// declare new javascript variables; + +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("lay")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' + AND idclient='".Contenido_Security::escapeDB($rights_client, $db)."' AND A.type = 0 AND idlang='".Contenido_Security::escapeDB($rights_lang, $db)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); + +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + +$sJsBefore .= "var itemids=new Array(); + var actareaids=new Array();\n"; + +$colspan=0; + +$table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $table->start_table(); +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(i18n("Layout name")); +$sTable .= $table->header_cell(i18n("Description")); + +$possible_areas=array(); +$sCheckboxesRow = ''; +$aSecondHeaderRow = array(); +// look for possible actions in mainarea [] +foreach($right_list["lay"] as $value2) +{ + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";\n"; + + //checkbox for the whole action + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + } +} +//checkbox for all rights +$sTable .= $table->header_cell(i18n('Check all')); +array_push($aSecondHeaderRow, ""); +$sTable .= $table->end_row(); +$colspan++; + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell(' ',"center", '', '', 0); + +foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); +} +$sTable .= $table->end_row(); + +//Select the itemid�s +$sql = "SELECT * FROM ".$cfg["tab"]["lay"]." WHERE idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY name"; +$db->query($sql); + +while ($db->next_record()) { + + $tplname = clHtmlEntities($db->f("name")); + $description = clHtmlEntities($db->f("description")); + + $sTable .= $table->row(); + $sTable .= $table->cell($tplname,"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell($description,"", "", " class=\"td_rights1\" style=\"white-space:normal; \"", false); + + $darkrow = !$darkrow; + + //set javscript array for itemids + $sJsBefore .= "itemids[\"".$db->f("idlay")."\"]=\"x\"\n"; + + // look for possible actions in mainarea[] + foreach($right_list["lay"] as $value2) + { + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idlay"),array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + $sTable .= $table->cell("f("idlay")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + } + } + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idlay")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idlay")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $table->end_row(); +} + +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); +?> \ No newline at end of file diff --git a/conlite/includes/rights_mod.inc.php b/conlite/includes/rights_mod.inc.php new file mode 100644 index 0000000..3561d7c --- /dev/null +++ b/conlite/includes/rights_mod.inc.php @@ -0,0 +1,163 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-07-03, Frederic Schneider, fixed wrong escape + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * + * $Id: rights_mod.inc.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/rights.inc.php'); +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("mod")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' + AND idclient='".Contenido_Security::escapeDB($rights_client, $db)."' AND A.type = 0 AND idlang='".Contenido_Security::escapeDB($rights_lang, $db)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); + +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) { + saverights(); +} else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + +// declare new javascript variables; +$sJsBefore = " + var itemids=new Array(); + var actareaids=new Array();"; + +$colspan=0; + +$table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $table->start_table(); +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(i18n("Module name")); +$sTable .= $table->header_cell(i18n("Description")); +$aSecondHeaderRow = array(); +$possible_areas=array(); +// look for possible actions in mainarea [] +foreach($right_list["mod"] as $value2) +{ + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";\n"; + + //checkbox for the whole action + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + } +} + +//checkbox for all rights +$sTable .= $table->header_cell(i18n('Check all')); +array_push($aSecondHeaderRow, ""); +$sTable .= $table->end_row(); +$colspan++; + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell(' ',"center", '', '', 0); + +foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); +} +$sTable .= $table->end_row(); + +//Select the itemid�s +$sql = "SELECT * FROM ".$cfg["tab"]["mod"]." WHERE idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY name"; +$db->query($sql); + +while ($db->next_record()) { + + $tplname = clHtmlEntities($db->f("name")); + $description = clHtmlEntities($db->f("description")); + + $sTable .= $table->row(); + $sTable .= $table->cell($tplname,"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell($description,"", "", " class=\"td_rights1\" style=\"white-space:normal; \"", false); + + //set javscript array for itemids + $sJsAfter.="itemids[\"".$db->f("idmod")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + foreach($right_list["mod"] as $value2) + { + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idmod"),array_keys($rights_list_old))) + $checked="checked=\"checked\""; + else + $checked=""; + + //set the checkbox the name consits of areait+actionid+itemid + $sTable .= $table->cell("f("idmod")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + } + } + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idmod")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idmod")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $table->end_row(); +} + +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); +?> \ No newline at end of file diff --git a/conlite/includes/rights_str.inc.php b/conlite/includes/rights_str.inc.php new file mode 100644 index 0000000..6b95abc --- /dev/null +++ b/conlite/includes/rights_str.inc.php @@ -0,0 +1,228 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * + * $Id: rights_str.inc.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/rights.inc.php'); +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("str")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' + AND idclient='".Contenido_Security::escapeDB($rights_client, $db)."' AND A.type = 0 AND idlang='".Contenido_Security::escapeDB($rights_lang, $db)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); + +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} +$sJsBefore = ''; +$sJsAfter = ''; +$sJsExternal = ''; +$sTable = ''; + + $sJsExternal .= ''."\n"; + $sJsExternal .= ''."\n"; + + // declare new javascript variables; + $sJsBefore .= " + var itemids=new Array(); \n + var actareaids=new Array(); \n"; + + $colspan=0; + + $table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + + $sTable .= $table->start_table(); + $sTable .= $table->header_row(); + $sTable .= $table->header_cell(i18n("Category"),"left"); + $sTable .= $table->header_cell(" ","left"); + $possible_areas=array(); + $aSecondHeaderRow = array(); + + // look for possible actions in mainarea [] in str and con + foreach($right_list["str"] as $value2) + { + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + + # HACK! + if ($value3 != "str_newtree") + { + $possible_areas[$value2["perm"]]=""; + + $colspan++; + //set the possible areas and actions for this areas + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\";\n"; + + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + } + } + } + + //checkbox for all rights + $sTable .= $table->header_cell(i18n("Check all")); + array_push($aSecondHeaderRow, ""); + $sTable .= $table->end_row(); + $colspan++; + + $sTable .= $table->header_row(); + $sTable .= $table->header_cell(' ',"center", '', '', 0); + $sTable .= $table->header_cell(' ',"center", '', '', 0); + + foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); + } + $sTable .= $table->end_row(); + + $sql = "SELECT A.idcat, level, name,parentid FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat + AND C.idlang='".Contenido_Security::toInteger($rights_lang)."' AND B.idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY idtree"; + $db->query($sql); + + $counter=array(); + $parentid="leer"; + + $aRowname = array(); + $iLevel = 0; + + while ($db->next_record()) { + + if ($db->f("level") == 0 && $db->f("preid") != 0) { + $sTable .= $table->row(); + $sTable .= $table->sumcell(" ","right"); + $sTable .= $table->end_row(); + }else { + if ($db->f("level") < $iLevel) { + $iDistance = $iLevel-$db->f("level"); + + for ($i = 0; $i < $iDistance; $i++) { + array_pop($aRowname); + } + $iLevel = $db->f("level"); + } + + if ($db->f("level") >= $iLevel) { + if ($db->f("level") == $iLevel) { + array_pop($aRowname); + } else { + $iLevel = $db->f("level"); + } + array_push($aRowname, $db->f("idcat")); + } + + //find out parentid for inheritance + //if parentid is the same increase the counter + if($parentid==$db->f("parentid")) { + $counter[$parentid]++; + }else{ + $parentid=$db->f("parentid"); + // if these parentid is in use increase the counter + if(isset($counter[$parentid])){ + $counter[$parentid]++; + }else{ + $counter[$parentid]=0; + } + + + } + //set javscript array for itemids + $sJsAfter.="itemids[\"".$db->f("idcat")."\"]=\"x\";\n"; + + $spaces=''; + + $sTable .= $table->row("id=\"".implode('_', $aRowname)."\""); + $sTable .= $table->cell(' '.$db->f("name"),"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell(" f("idcat")."')\" class=\"action\">","", "", " class=\"td_rights1\"", false); + + // look for possible actions in mainarea[] + + foreach($right_list["str"] as $value2){ + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + # HACK! + if ($value3 != "str_newtree") + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idcat"),array_keys($rights_list_old))) { + $checked="checked=\"checked\""; + } else { + $checked=""; + } + + //set the checkbox the name consits of areaid+actionid+itemid the id = parebntid+couter for these parentid+areaid+actionid + $sTable .= $table->cell("f("idcat")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + + } + } + } + + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idcat")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idcat")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $table->end_row(); + } +} +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +$sJsAfter .= " + aTranslations = new Object(); + aTranslations['pfeil_links.gif'] = '".i18n("Apply rights for this category to all categories on the same level or above")."'; + aTranslations['pfeil_runter.gif'] = '".i18n("Apply rights for this category to all categories below the current category")."'; + setImageTags(aTranslations); + + init('".i18n("Open category")."', '".i18n("Close category")."');\n"; + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); +?> \ No newline at end of file diff --git a/conlite/includes/rights_tpl.inc.php b/conlite/includes/rights_tpl.inc.php new file mode 100644 index 0000000..e0f50d8 --- /dev/null +++ b/conlite/includes/rights_tpl.inc.php @@ -0,0 +1,166 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-27, Frederic Schneider, add security fix + * modified 2008-07-03, Timo Trautmann, moved inline html to template + * + * $Id: rights_tpl.inc.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +//notice $oTpl is filled and generated in file rights.inc.php this file renders $oTpl to browser +include_once($cfg['path']['contenido'].'includes/rights.inc.php'); +//set the areas which are in use fore selecting these +$possible_area = "'".implode("','", $area_tree[$perm->showareas("tpl")])."'"; +$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='".Contenido_Security::escapeDB($userid, $db)."' + AND idclient='".Contenido_Security::escapeDB($rights_client, $db)."' AND A.type = 0 AND idlang='".Contenido_Security::escapeDB($rights_lang, $db)."' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea"; +$db->query($sql); + +$rights_list_old = array (); +while ($db->next_record()) { //set a new rights list fore this user + $rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x"; +} + +if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) +{ + saverights(); +}else { + if (!$perm->have_perm_area_action($area, $action)) + { + $notification->displayNotification("error", i18n("Permission denied")); + } +} + +$sJsBefore = ''; +$sJsAfter = ''; +$sTable = ''; + +$sJsBefore .= "var itemids=new Array();\n + var actareaids=new Array();\n"; + +// declare new javascript variables; +$colspan=0; + +$table = new Table($cfg["color"]["table_border"], "solid", 0, 2, $cfg["color"]["table_header"], $cfg["color"]["table_light"], $cfg["color"]["table_dark"], 0, 0); + +$sTable .= $table->start_table(); +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(i18n("Template name")); +$sTable .= $table->header_cell(i18n("Description")); + +$aSecondHeaderRow = array(); +$possible_areas=array(); + +// look for possible actions in mainarea [] +foreach($right_list["tpl"] as $value2) +{ + //if there are some actions + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { //set the areas that are in use + $possible_areas[$value2["perm"]]=""; + + $colspan++; + //set the possible areas and actions for this areas + + $sJsBefore .= "actareaids[\"$value3|".$value2["perm"]."\"]=\"x\"\n"; + + //checkbox for the whole action + $sTable .= $table->header_cell($lngAct[$value2["perm"]][$value3]); + array_push($aSecondHeaderRow, ""); + } +} + +//checkbox for all rights +$sTable .= $table->header_cell(i18n('Check all')); +array_push($aSecondHeaderRow, ""); +$sTable .= $table->end_row(); +$colspan++; + +$sTable .= $table->header_row(); +$sTable .= $table->header_cell(' ',"center", '', '', 0); +$sTable .= $table->header_cell(' ',"center", '', '', 0); + +foreach ($aSecondHeaderRow as $value) { + $sTable .= $table->header_cell($value,"center", '', '', 0); +} +$sTable .= $table->end_row(); + + +//Select the itemid�s +$sql = "SELECT * FROM ".$cfg["tab"]["tpl"]." WHERE idclient='".Contenido_Security::toInteger($rights_client)."' ORDER BY name"; +$db->query($sql); + +while ($db->next_record()) { + + $tplname = clHtmlEntities($db->f("name")); + $description = clHtmlEntities($db->f("description")); + + $sTable .= $table->row(); + $sTable .= $table->cell($tplname,"", "", " class=\"td_rights0\"", false); + $sTable .= $table->cell($description,"", "", " class=\"td_rights1\" style=\"white-space:normal;\"", false); + + //set javscript array for itemids + $sJsAfter.="itemids[\"".$db->f("idtpl")."\"]=\"x\";\n"; + + // look for possible actions in mainarea[] + foreach($right_list["tpl"] as $value2) + { + + //if there area some + if(is_array($value2["action"])) + foreach($value2["action"] as $key3 => $value3) + { + //does the user have the right + if(in_array($value2["perm"]."|$value3|".$db->f("idtpl"),array_keys($rights_list_old))) { + $checked="checked=\"checked\""; + } else { + $checked=""; + } + + //set the checkbox the name consits of areait+actionid+itemid + $sTable .= $table->cell("f("idtpl")."]\" value=\"x\" $checked>","", "", " class=\"td_rights2\"", false); + + } + } + //checkbox for checking all actions fore this itemid + $sTable .= $table->cell("f("idtpl")."\" value=\"\" onClick=\"setRightsFor('".$value2["perm"]."','$value3','".$db->f("idtpl")."')\">","", "", " class=\"td_rights3\"", false); + $sTable .= $table->end_row(); +} +$sTable .= $table->end_row(); +$sTable .= $table->row(); +$sTable .= $table->sumcell(" ","right"); +$sTable .= $table->end_row(); +$sTable .= $table->end_table(); + +$oTpl->set('s', 'JS_SCRIPT_BEFORE', $sJsBefore); +$oTpl->set('s', 'JS_SCRIPT_AFTER', $sJsAfter); +$oTpl->set('s', 'RIGHTS_CONTENT', $sTable); +$oTpl->set('s', 'EXTERNAL_SCRIPTS', $sJsExternal); +$oTpl->generate('templates/standard/'.$cfg['templates']['rights_inc']); +?> \ No newline at end of file diff --git a/conlite/includes/startup.php b/conlite/includes/startup.php new file mode 100644 index 0000000..0391f1b --- /dev/null +++ b/conlite/includes/startup.php @@ -0,0 +1,224 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * $Id: startup.php 374 2015-11-09 15:59:28Z oldperl $: + */ + + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/* + * Do not edit this value! + * + * If you want to set a different enviroment value please define it in your .htaccess file + * or in the server configuration. + * + * SetEnv CL_ENVIRONMENT development + * + * You may also use a php-file in conlite folder named enviroment.php with content + * + */ +if (!defined('CL_ENVIRONMENT')) { + if (getenv('CONLITE_ENVIRONMENT')) { + $sEnvironment = getenv('CONLITE_ENVIRONMENT'); + } elseif (getenv('CL_ENVIRONMENT')) { + $sEnvironment = getenv('CL_ENVIRONMENT'); + } else { + if(file_exists(dirname(dirname(__FILE__))."/environment.php")) { + include_once dirname(dirname(__FILE__))."/environment.php"; + } + + if(!isset($sEnvironment) || empty($sEnvironment)) { + $sEnvironment = 'production'; + } + } + define('CL_ENVIRONMENT', $sEnvironment); + unset($sEnvironment); +} + +/* + * SetEnv CL_VERSION + */ +if (!defined('CL_VERSION')) { + + define('CL_VERSION', '2.0.0RC3'); + +} + +// fixed functions for PHP 5.4 and later +include_once(str_replace('\\', '/', realpath(dirname(__FILE__) . '/..')) . '/includes/functions.php54.php'); + +// 1. security check: Include security class and invoke basic request checks +include_once(str_replace('\\', '/', realpath(dirname(__FILE__) . '/..')) . '/classes/class.security.php'); +try { + Contenido_Security::checkRequests(); +} catch (Exception $e) { + die($e->getMessage()); +} + + +// "Workaround" for register_globals=off settings. +require_once(dirname(__FILE__) . '/globals_off.inc.php'); +$sPathCfgDir = dirname(dirname(dirname(__FILE__))).'/data/config/'.CL_ENVIRONMENT.'/'; +$sClConfigFile = $sPathCfgDir.'config.php'; +// Check if configuration file exists, this is a basic indicator to find out, if Contenido is installed +if (!file_exists(dirname(__FILE__) . '/config.php') && !file_exists($sClConfigFile)) { + $msg = "

    Fatal Error


    "; + $msg .= "Could not open the configuration file config.php.

    "; + $msg .= "Please make sure that you saved the file in the setup program. If you had to place the file manually on your webserver, make sure that it is placed in your contenido/includes directory."; + die($msg); +} + + +// Include some basic configuration files +if(file_exists($sClConfigFile)) { + include_once($sClConfigFile); +} else { + include_once(dirname(__FILE__) . '/config.php'); +} +include_once($sPathCfgDir.'config.path.php'); +include_once($sPathCfgDir. 'config.misc.php'); +include_once($sPathCfgDir . 'config.colors.php'); +include_once($sPathCfgDir . 'config.path.php'); +include_once($sPathCfgDir . 'config.templates.php'); +include_once($sPathCfgDir . 'cfg_sql.inc.php'); + +$cfg['path']['config'] = $sPathCfgDir; + +// Include userdefined configuration (if available), where you are able to +// extend/overwrite core settings from included configuration files above +if(file_exists($sPathCfgDir.'config.local.php')) { + include_once($sPathCfgDir.'config.local.php'); +} else if(file_exists($cfg['path']['contenido'].$cfg['path']['includes'] . '/config.local.php')) { + include_once($cfg['path']['contenido'] . $cfg['path']['includes'] . '/config.local.php'); +} + +// check $belang and set default +if(!isset($belang) || empty($belang)) { + $belang = "de_DE"; +} + +$I18N_EMULATE_GETTEXT = false; + +// Various base API functions +require_once($cfg['path']['contenido'] . $cfg['path']['includes'] . '/api/functions.api.general.php'); + + +// Initialization of autoloader +include_once($cfg['path']['contenido'] . $cfg['path']['classes'] . 'class.autoload.php'); +cAutoload::initialize($cfg); + + +// 2. security check: Check HTTP parameters, if requested +if ($cfg['http_params_check']['enabled'] === true) { + $oHttpInputValidator = + new HttpInputValidator($cfg['path']['contenido'] . $cfg['path']['includes'] . '/config.http_check.php'); +} + +/* Generate arrays for available login languages + * --------------------------------------------- + * Author: Martin Horwath + */ + +global $cfg; + +$handle = opendir($cfg['path']['contenido'] . $cfg['path']['locale']); + +while ($locale = readdir($handle)) { + if (is_dir($cfg['path']['contenido'] . $cfg['path']['locale'] . $locale) && $locale != '..' && $locale != '.') { + if (file_exists($cfg['path']['contenido'] . $cfg['path']['locale'] . $locale . '/LC_MESSAGES/conlite.po') && + file_exists($cfg['path']['contenido'] . $cfg['path']['locale'] . $locale . '/LC_MESSAGES/conlite.mo') && + file_exists($cfg['path']['contenido'] . $cfg['path']['xml'] . 'lang_'.$locale.'.xml') ) { + + $cfg['login_languages'][] = $locale; + $cfg['lang'][$locale] = 'lang_'.$locale.'.xml'; + } + } +} + + +// Some general includes +cInclude('includes', 'functions.general.php'); +cInclude('conlib', 'prepend.php'); +cInclude('includes', 'functions.i18n.php'); + + +// Initialization of CEC +$_cecRegistry = cApiCECRegistry::getInstance(); +cInclude('config', 'config.chains.php'); + +// fallback to old db-connection settings +if(!isset($cfg['db']) || !is_array($cfg['db'])) { + $cfg['db'] = array( + 'connection' => array( + 'host' => $contenido_host, + 'database' => $contenido_database, + 'user' => $contenido_user, + 'password' => $contenido_password, + ), + 'nolock' => false, // (bool) Flag to not lock tables + 'sequenceTable' => '', // (string) will be set later in startup! + 'haltBehavior' => 'report', // (string) Feasible values are 'yes', 'no' or 'report' + 'haltMsgPrefix' => (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] . ' ' : '', + 'enableProfiling' => false, // (bool) Flag to enable profiling +); +} +// Set default database connection parameter +$cfg['db']['sequenceTable'] = $cfg['tab']['sequence']; +DB_ConLite::setDefaultConfiguration($cfg['db']); + +// @TODO: This should be done by instantiating a DB_ConLite class, creation of DB_ConLite object +checkMySQLConnectivity(); + + +// Initialize UrlBuilder, configuration is set in /contenido/includes/config.misc.php +Contenido_UrlBuilderConfig::setConfig($cfg['url_builder']); + +// set global encoding array +if (!isset($encoding) || !is_array($encoding) || count($encoding) == 0) { + // get encodings of all languages + $db = new DB_ConLite(); + $encoding = array(); + $sql = "SELECT idlang, encoding FROM " . $cfg["tab"]["lang"]; + $db->query($sql); + while ($db->next_record()) { + $encoding[$db->f('idlang')] = $db->f('encoding'); + } +} + +if($cfg['debug']['sendnocacheheader']) { + header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1. + header("Pragma: no-cache"); // HTTP 1.0. + header("Expires: 0"); // Proxies. +} +?> \ No newline at end of file diff --git a/conlite/index.php b/conlite/index.php new file mode 100644 index 0000000..3e923d7 --- /dev/null +++ b/conlite/index.php @@ -0,0 +1,145 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-20 + * modified 2008-06-16, Holger Librenz, Hotifx: added check for invalid calls + * modified 2008-06-16, Rudi Bieller, Hotifx: added check for XSS at "contenido" and "belang" + * modified 2008-06-25, Timo Trautmann, Contenido Framework Constand added + * modified 2008-07-02, Frederic Schneider, add security fix and include security class + * modified 2009-10-16, Ortwin Pinke, added rewrite of ampersand in frameset url + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: index.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + +page_open(array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +/** + * Bugfix + * @see http://contenido.org/forum/viewtopic.php?t=18291 + * + * added by H. Librenz (2007-12-07) + */ +//includePluginConf(); +require_once $cfg['path']['contenido'] . $cfg['path']['includes'] . 'functions.includePluginConf.php'; +cInclude ("includes", 'cfg_language_de.inc.php'); +cInclude ("includes", 'functions.forms.php'); + +$sess->register("belang"); + +// Create Contenido classes +$db = new DB_ConLite; +$tpl = new Template; + +// Sprache wechseln +if (isset($changelang) && is_numeric($changelang)) +{ + $lang = $changelang; +} + +// Change Client +if (isset($changeclient) && is_numeric($changeclient)) +{ + $client = $changeclient; + unset($lang); +} + +// Preselect client, if definied +if (!$sess->is_registered("client")) { // only check at first login into backend + $iTmpClient = getEffectiveSetting ("backend", "preferred_idclient", false); + + if ($iTmpClient && ($perm->have_perm_client("admin[".$iTmpClient."]") || $perm->have_perm_client("client[".$iTmpClient."]"))) { + $client = $iTmpClient; + unset($lang); + } + unset($iTmpClient); + + /* Remove unused sessions and locks */ + cleanupSessions(); +} + +if (!is_numeric($client) || $client == "") { + $sess->register("client"); + $sql = "SELECT idclient FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC"; + $db->query($sql); + $db->next_record(); + $client = $db->f("idclient"); +} else { + $sess->register("client"); +} + +if (!is_numeric($lang) || $lang == "") { + $sess->register("lang"); + // search for the first language of this client + $sql = "SELECT * FROM ".$cfg["tab"]["lang"]." AS A, ".$cfg["tab"]["clients_lang"]." AS B WHERE A.idlang=B.idlang AND idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idlang ASC"; + $db->query($sql); + $db->next_record(); + $lang = $db->f("idlang"); + + if (!$perm->have_perm_client_lang($client, $lang)) { + $lang = ''; + + while ($db->next_record() && ($lang == '')) { + if ($perm->have_perm_client_lang($client, $db->f('idlang'))) { + $lang = $db->f("idlang"); + } + } + } +} else { + $sess->register("lang"); +} + +$perm->load_permissions(); + +if (isset($area)) +{ + $sess_area = $area; +} else { + $area = (isset($sess_area)) ? $sess_area : 'login'; +} + +$tpl->reset(); + +$tpl->set('s', 'HEADER', str_replace("&", "&", $sess->url('header.php?changelang='.$lang.'&changeclient='.$client))); +$tpl->set('s', 'CONTENT', str_replace("&", "&", $sess->url('frameset.php?area=mycontenido&frame=1&menuless=1&changelang='.$changelang.'&lang='.$lang.'&client='.$client))); +$tpl->set('s', 'VERSION', $cfg["version"]); +$tpl->set('s', 'LOCATION', $cfg['path']['contenido_fullhtml']); +$tpl->set('s', 'CONTENIDOPATH', $cfg["path"]["contenido_fullhtml"]."favicon.ico"); +$tpl->generate($cfg['path']['templates'] . $cfg['templates']['frameset']); + +$db->disconnect(); +page_close(); + +?> \ No newline at end of file diff --git a/conlite/locale/conlite.pot b/conlite/locale/conlite.pot new file mode 100644 index 0000000..07179ac --- /dev/null +++ b/conlite/locale/conlite.pot @@ -0,0 +1,5239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-01 20:24+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: includes/include.system_configuration.php:93 +msgid "Versioning activated" +msgstr "" + +#: includes/include.system_configuration.php:93 +#: includes/include.system_configuration.php:94 +#: includes/include.system_configuration.php:95 +msgid "Versioning" +msgstr "" + +#: includes/include.system_configuration.php:94 +msgid "Serverpath to version files" +msgstr "" + +#: includes/include.system_configuration.php:95 +msgid "Maximum number of stored versions" +msgstr "" + +#: includes/include.system_configuration.php:96 +msgid "Check for updates" +msgstr "" + +#: includes/include.system_configuration.php:96 +#: includes/include.system_configuration.php:97 +#: includes/include.system_configuration.php:98 +msgid "Update notifier" +msgstr "" + +#: includes/include.system_configuration.php:97 +msgid "Get news from conlite.org" +msgstr "" + +#: includes/include.system_configuration.php:98 +msgid "Update check period (minutes)" +msgstr "" + +#: includes/include.system_configuration.php:99 +msgid "Clickable menu in backend" +msgstr "" + +#: includes/include.system_configuration.php:99 +#: includes/include.system_configuration.php:100 +#: includes/include.system_configuration.php:101 +#: includes/include.system_configuration.php:102 +#: includes/include.system_configuration.php:103 +#: includes/include.system_configuration.php:104 +msgid "Backend" +msgstr "" + +#: includes/include.system_configuration.php:100 +msgid "Use passwordrequest in Backend" +msgstr "" + +#: includes/include.system_configuration.php:101 +msgid "Activate maintenance mode" +msgstr "" + +#: includes/include.system_configuration.php:102 +msgid "Use editarea for code highlighting" +msgstr "" + +#: includes/include.system_configuration.php:103 +msgid "Use TinyMce as insight editor" +msgstr "" + +#: includes/include.system_configuration.php:104 +msgid "Default client (ID)" +msgstr "" + +#: includes/include.system_configuration.php:105 +msgid "Mailserver host" +msgstr "" + +#: includes/include.system_configuration.php:105 +#: includes/include.system_configuration.php:106 +#: includes/include.system_configuration.php:107 +msgid "Mailserver" +msgstr "" + +#: includes/include.system_configuration.php:106 +msgid "Mailserver sender mail" +msgstr "" + +#: includes/include.system_configuration.php:107 +msgid "Mailserver sender name" +msgstr "" + +#: includes/include.system_configuration.php:109 +msgid "Generate basehref" +msgstr "" + +#: includes/include.system_configuration.php:109 +#: includes/include.system_configuration.php:110 +msgid "Development" +msgstr "" + +#: includes/include.system_configuration.php:110 +msgid "Use image magic (if available)" +msgstr "" + +#: includes/include.system_configuration.php:123 +msgid "Update check period must be at least 60 minutes." +msgstr "" + +#: includes/include.system_configuration.php:133 +#: includes/include.lang_edit.php:140 includes/include.client_edit.php:172 +#: includes/grouprights.inc.php:335 +#: includes/include.grouprights_overview.php:65 +#: includes/include.rights_overview.php:141 +msgid "Changes saved" +msgstr "" + +#: includes/include.system_configuration.php:142 +msgid "System Configuration" +msgstr "" + +#: includes/include.system_configuration.php:192 +msgid "Access denied" +msgstr "" + +#: includes/include.lang_edit.php:84 includes/include.lang_overview.php:103 +msgid "New language" +msgstr "" + +#: includes/include.lang_edit.php:127 includes/include.logs.php:46 +#: includes/grouprights_lay.inc.php:55 includes/grouprights_lay.inc.php:74 +#: includes/include.tpl_edit_form.php:39 includes/include.js_edit_form.php:50 +#: includes/include.grouprights_create.php:42 +#: includes/include.html_tpl_history.php:59 includes/rights_lay.inc.php:57 +#: includes/rights_mod.inc.php:55 includes/include.client_artspec.php:40 +#: includes/include.client_artspec.php:50 +#: includes/include.client_artspec.php:60 +#: includes/include.client_artspec.php:70 +#: includes/include.con_edit_form.php:764 includes/grouprights_str.inc.php:54 +#: includes/include.upl_dirs_overview.php:408 +#: includes/include.upl_dirs_overview.php:555 +#: includes/include.tplcfg_edit_form.php:144 +#: includes/include.con_art_overview.php:1013 +#: includes/grouprights_tpl.inc.php:53 includes/rights_con.inc.php:56 +#: includes/include.client_edit.php:48 includes/include.mod_history.php:52 +#: includes/include.js_history.php:55 includes/include.lay_history.php:46 +#: includes/include.grouprights_overview.php:42 +#: includes/include.lay_edit_form.php:43 includes/include.lay_edit_form.php:52 +#: includes/include.rights_overview.php:49 +#: includes/grouprights_area.inc.php:65 includes/grouprights_mod.inc.php:54 +#: includes/grouprights_members.inc.php:41 +#: includes/include.html_tpl_edit_form.php:50 +#: includes/include.style_history.php:57 +#: includes/include.style_edit_form.php:51 includes/grouprights_con.inc.php:56 +#: includes/include.rights_create.php:43 includes/rights_str.inc.php:55 +#: includes/rights_area.inc.php:58 includes/rights_tpl.inc.php:55 +#: includes/include.system_purge.php:37 +msgid "Permission denied" +msgstr "" + +#: includes/include.lang_edit.php:228 +msgid "Left to right" +msgstr "" + +#: includes/include.lang_edit.php:228 +msgid "Right to left" +msgstr "" + +#: includes/include.lang_edit.php:242 includes/cfg_language_de.inc.php:191 +msgid "Edit language" +msgstr "" + +#: includes/include.lang_edit.php:244 +msgid "Language name" +msgstr "" + +#: includes/include.lang_edit.php:245 +#: includes/include.frontend.user_edit.php:188 +msgid "Active" +msgstr "" + +#: includes/include.lang_edit.php:247 includes/include.lang_edit.php:249 +#: includes/include.con_editcontent.php:392 main.loginform.php:156 +msgid "Language" +msgstr "" + +#: includes/include.lang_edit.php:248 +msgid "Encoding" +msgstr "" + +#: includes/include.lang_edit.php:250 includes/include.rights_overview.php:260 +#: includes/include.rights_create.php:204 +msgid "Country" +msgstr "" + +#: includes/include.lang_edit.php:251 +msgid "Text direction" +msgstr "" + +#: includes/include.lang_edit.php:253 includes/include.lang_edit.php:256 +#: includes/include.mycontenido_settings.php:143 +msgid "Time format" +msgstr "" + +#: includes/include.lang_edit.php:254 +#: includes/include.mycontenido_settings.php:141 +msgid "Date/Time format" +msgstr "" + +#: includes/include.lang_edit.php:255 +#: includes/include.mycontenido_settings.php:142 +msgid "Date format" +msgstr "" + +#: includes/include.CMS_SIMPLELINK.php:139 includes/include.CMS_LINK.php:142 +#, php-format +msgid "Edit link for container %s" +msgstr "" + +#: includes/include.CMS_SIMPLELINK.php:150 scripts/langref.php:31 +msgid "Link" +msgstr "" + +#: includes/include.CMS_SIMPLELINK.php:153 includes/include.CMS_IMG.php:278 +#: includes/grouprights_lay.inc.php:86 includes/include.tpl_edit_form.php:154 +#: includes/include.js_edit_form.php:176 includes/include.CMS_LINK.php:341 +#: includes/include.grouprights_create.php:112 +#: includes/include.html_tpl_history.php:164 includes/rights_lay.inc.php:76 +#: includes/include.todo.popup.php:70 includes/rights_mod.inc.php:76 +#: includes/include.mycontenido.tasks.edit.php:71 +#: includes/grouprights_tpl.inc.php:73 includes/include.mod_edit_form.php:385 +#: includes/include.mod_history.php:132 includes/include.js_history.php:156 +#: includes/include.lay_history.php:121 includes/include.upl_edit.php:95 +#: includes/include.grouprights_overview.php:118 +#: includes/include.lay_edit_form.php:205 includes/grouprights_mod.inc.php:74 +#: includes/include.html_tpl_edit_form.php:214 +#: includes/include.style_history.php:161 +#: includes/include.style_edit_form.php:198 includes/include.mod_new.php:109 +#: includes/rights_tpl.inc.php:74 +#: templates/standard/template.tpl_edit_form.html:29 +#: templates/standard/template.upl_files_overview.html:84 +#: templates/standard/template.mod_edit_form.html:33 +#: templates/standard/template.lay_edit_form.html:32 scripts/langref.php:28 +msgid "Description" +msgstr "" + +#: includes/functions.upl.php:791 +msgid "OpenOffice.org Presentation" +msgstr "" + +#: includes/functions.upl.php:792 +msgid "OpenOffice.org Presentation Template" +msgstr "" + +#: includes/functions.upl.php:793 +msgid "Microsoft PowerPoint Screen Presentation" +msgstr "" + +#: includes/functions.upl.php:794 includes/functions.upl.php:796 +msgid "Microsoft PowerPoint Presentation Template" +msgstr "" + +#: includes/functions.upl.php:795 +msgid "KDE KPresenter Document" +msgstr "" + +#: includes/functions.upl.php:799 +msgid "Microsoft Word Document or regular text file" +msgstr "" + +#: includes/functions.upl.php:800 +msgid "Microsoft Word Template" +msgstr "" + +#: includes/functions.upl.php:801 +msgid "OpenOffice.org Text Document" +msgstr "" + +#: includes/functions.upl.php:802 +msgid "OpenOffice.org Text Document Template" +msgstr "" + +#: includes/functions.upl.php:803 +msgid "StarOffice 5.0 Text Document" +msgstr "" + +#: includes/functions.upl.php:804 +msgid "KDE KWord Document" +msgstr "" + +#: includes/functions.upl.php:807 +msgid "Microsoft Excel Worksheet" +msgstr "" + +#: includes/functions.upl.php:808 +msgid "OpenOffice.org Table" +msgstr "" + +#: includes/functions.upl.php:809 +msgid "OpenOffice.org Table Template" +msgstr "" + +#: includes/functions.upl.php:810 +msgid "Microsoft Excel File" +msgstr "" + +#: includes/functions.upl.php:811 +msgid "Microsoft Excel Template" +msgstr "" + +#: includes/functions.upl.php:812 +msgid "Comma Seperated Value File" +msgstr "" + +#: includes/functions.upl.php:813 +msgid "KDE KSpread Document" +msgstr "" + +#: includes/functions.upl.php:814 +msgid "StarOffice 5.0 Table" +msgstr "" + +#: includes/functions.upl.php:817 +msgid "Plain Text" +msgstr "" + +#: includes/functions.upl.php:818 +msgid "Rich Text Format" +msgstr "" + +#: includes/functions.upl.php:821 +msgid "GIF Image" +msgstr "" + +#: includes/functions.upl.php:822 +msgid "PNG Image" +msgstr "" + +#: includes/functions.upl.php:823 includes/functions.upl.php:824 +msgid "JPEG Image" +msgstr "" + +#: includes/functions.upl.php:825 +msgid "TIFF Image" +msgstr "" + +#: includes/functions.upl.php:826 +msgid "Adobe Photoshop Image" +msgstr "" + +#: includes/functions.upl.php:829 includes/functions.upl.php:830 +msgid "Hypertext Markup Language Document" +msgstr "" + +#: includes/functions.upl.php:831 +msgid "Cascading Style Sheets" +msgstr "" + +#: includes/functions.upl.php:834 +msgid "LHA Archive" +msgstr "" + +#: includes/functions.upl.php:835 +msgid "RAR Archive" +msgstr "" + +#: includes/functions.upl.php:836 +msgid "ARJ Archive" +msgstr "" + +#: includes/functions.upl.php:837 +msgid "bz2-compressed File" +msgstr "" + +#: includes/functions.upl.php:838 +msgid "bzip-compressed File" +msgstr "" + +#: includes/functions.upl.php:839 +msgid "ZIP Archive" +msgstr "" + +#: includes/functions.upl.php:840 +msgid "TAR Archive" +msgstr "" + +#: includes/functions.upl.php:841 +msgid "GZ Compressed File" +msgstr "" + +#: includes/functions.upl.php:844 +msgid "C Program Code" +msgstr "" + +#: includes/functions.upl.php:847 +msgid "C++ Program Code" +msgstr "" + +#: includes/functions.upl.php:849 +msgid "C or C++ Program Header" +msgstr "" + +#: includes/functions.upl.php:852 +msgid "PHP Program Code" +msgstr "" + +#: includes/functions.upl.php:853 +msgid "PHP Source File" +msgstr "" + +#: includes/functions.upl.php:855 +msgid "Adobe Acrobat Portable Document" +msgstr "" + +#: includes/functions.upl.php:858 +msgid "QuickTime Movie" +msgstr "" + +#: includes/functions.upl.php:859 +msgid "avi Movie" +msgstr "" + +#: includes/functions.upl.php:861 +msgid "MPEG Movie" +msgstr "" + +#: includes/functions.upl.php:862 +msgid "Windows Media Video" +msgstr "" + +#: includes/functions.upl.php:864 +msgid "-File" +msgstr "" + +#: includes/include.frontend.user_edit.php:50 +#: includes/include.frontend.user_edit.php:70 +#: includes/include.frontend.user_edit.php:107 +msgid "-- new user --" +msgstr "" + +#: includes/include.frontend.user_edit.php:110 +msgid "Username empty or not set! Please choose one." +msgstr "" + +#: includes/include.frontend.user_edit.php:115 +msgid "Password not set right now!" +msgstr "" + +#: includes/include.frontend.user_edit.php:121 +msgid "Could not set new username: Username already exists" +msgstr "" + +#: includes/include.frontend.user_edit.php:128 +msgid "Could not set new password: Passwords don't match" +msgstr "" + +#: includes/include.frontend.user_edit.php:177 +#: includes/cfg_language_de.inc.php:176 +msgid "Edit user" +msgstr "" + +#: includes/include.frontend.user_edit.php:185 +#: includes/include.rights_left_top.php:115 +msgid "User name" +msgstr "" + +#: includes/include.frontend.user_edit.php:186 +#: includes/include.mycontenido_settings.php:116 +#: includes/include.rights_overview.php:217 +#: includes/include.rights_create.php:162 +msgid "New password" +msgstr "" + +#: includes/include.frontend.user_edit.php:187 +msgid "New password (again)" +msgstr "" + +#: includes/include.frontend.user_edit.php:215 +msgid "WARNING" +msgstr "" + +#: includes/include.frontend.user_edit.php:215 +#, php-format +msgid "" +"The plugin %s delivered an array for the displayed titles, but did not " +"return an array for the contents." +msgstr "" + +#: includes/include.frontend.user_edit.php:237 +#: includes/include.tpl_visualedit.php:146 +#: includes/include.tpl_edit_form.php:86 includes/include.tpl_edit_form.php:91 +#: includes/include.tpl_edit_form.php:203 +#: includes/include.tplcfg_edit_form.php:301 +#: includes/include.con_left_top.php:374 +#: includes/include.rights_overview.php:455 +#: includes/include.str_overview.php:188 includes/include.str_overview.php:656 +msgid "none" +msgstr "" + +#: includes/include.frontend.user_edit.php:240 +#: includes/include.rights_overview.php:458 +msgid "Group membership" +msgstr "" + +#: includes/include.frontend.user_edit.php:241 +#: includes/include.con_left_top.php:275 includes/include.upl_edit.php:102 +msgid "Author" +msgstr "" + +#: includes/include.frontend.user_edit.php:242 +#: includes/include.upl_edit.php:103 +msgid "Last modified by" +msgstr "" + +#: includes/include.lay_preview.php:29 includes/include.tpl_visualedit.php:84 +msgid "No such layout" +msgstr "" + +#: includes/rights.inc.php:273 includes/functions.stat.php:992 +#: includes/functions.stat.php:1018 +#: includes/include.grouprights_left_top.php:59 +#: includes/include.con_art_overview.php:866 +#: includes/include.rights_left_top.php:76 includes/grouprights.inc.php:157 +msgid "All" +msgstr "" + +#: includes/rights.inc.php:275 includes/grouprights.inc.php:159 +msgid "Article rights" +msgstr "" + +#: includes/rights.inc.php:277 includes/grouprights.inc.php:161 +msgid "Category rights" +msgstr "" + +#: includes/rights.inc.php:279 includes/grouprights.inc.php:163 +msgid "Template rights" +msgstr "" + +#: includes/rights.inc.php:281 includes/grouprights.inc.php:165 +msgid "Plugin/Other rights" +msgstr "" + +#: includes/rights.inc.php:343 +msgid "" +"The selected user is a system administrator. A system administrator has all " +"rights for all clients for all languages and therefore rights can't be " +"specified in more detail." +msgstr "" + +#: includes/rights.inc.php:348 +msgid "" +"The selected user is assigned to clients as admin, only. An admin has all " +"rights for a client and therefore rights can't be specified in more detail." +msgstr "" + +#: includes/rights.inc.php:352 +msgid "Current user doesn't have any rights to any client/language." +msgstr "" + +#: includes/include.grouprights_menu.php:178 +#, php-format +msgid "Do you really want to delete the group %s?" +msgstr "" + +#: includes/include.grouprights_menu.php:196 +#: includes/cfg_language_de.inc.php:182 +msgid "Delete group" +msgstr "" + +#: includes/include.grouprights_menu.php:197 +#, php-format +msgid "Do you really want to delete the following group:

    %s
    " +msgstr "" + +#: includes/include.upl_left_top.php:53 includes/include.tpl_new.php:41 +#: includes/include.lay_new.php:40 includes/include.js_left_top.php:54 +#: includes/include.lang_left_top.php:82 +#: includes/include.style_left_top.php:54 +#: includes/include.frontend.left_top.php:181 +#: includes/include.frontend.left_top.php:445 includes/include.mod_new.php:76 +#: includes/include.html_tpl_left_top.php:54 +msgid "No Client selected" +msgstr "" + +#: includes/include.upl_left_top.php:74 +#: includes/include.rights_left_top.php:159 +#: includes/include.frontend.left_top.php:265 includes/include.mod_new.php:169 +msgid "Search for" +msgstr "" + +#: includes/include.upl_left_top.php:112 +msgid "Create directory in" +msgstr "" + +#: includes/include.mod_sync.php:39 +msgid "Syncing Modules!" +msgstr "" + +#: includes/include.mod_sync.php:44 includes/include.mod_sync.php:56 +msgid "Module " +msgstr "" + +#: includes/include.mod_sync.php:44 +msgid "nothing to do" +msgstr "" + +#: includes/include.mod_sync.php:56 +msgid "synchronized" +msgstr "" + +#: includes/include.mod_sync.php:61 +msgid "No modules to sync!" +msgstr "" + +#: includes/include.mod_sync.php:66 +msgid "Nothing to do!" +msgstr "" + +#: includes/include.logs.php:64 +msgid "Submit query" +msgstr "" + +#: includes/include.logs.php:75 +msgid "All users" +msgstr "" + +#: includes/include.logs.php:77 +msgid "All actions" +msgstr "" + +#: includes/include.logs.php:199 +msgid "Unlimited" +msgstr "" + +#: includes/include.logs.php:200 includes/include.logs.php:201 +#: includes/include.logs.php:202 includes/include.logs.php:203 +#: includes/include.logs.php:204 +msgid "Entries" +msgstr "" + +#: includes/include.logs.php:275 +msgid "No results" +msgstr "" + +#: includes/include.frontend.group_rights.php:47 +msgid "Invalid plugin" +msgstr "" + +#: includes/include.frontend.group_rights.php:96 +#, php-format +msgid "Permissions for plugin '%s'" +msgstr "" + +#: includes/include.frontend.group_rights.php:101 +msgid "(All)" +msgstr "" + +#: includes/include.frontend.group_rights.php:109 +msgid "Global rights" +msgstr "" + +#: includes/include.frontend.group_rights.php:131 +msgid "No items found" +msgstr "" + +#: includes/include.style_files_overview.php:104 +#: includes/include.js_files_overview.php:104 +#: includes/include.mod_package.php:111 +#: includes/include.html_tpl_files_overview.php:105 +msgid "is not readable!" +msgstr "" + +#: includes/include.style_files_overview.php:131 +#: includes/include.js_files_overview.php:131 +#: includes/include.system_db_backup.php:294 +#: includes/include.html_tpl_files_overview.php:132 +msgid "Delete File" +msgstr "" + +#: includes/include.style_files_overview.php:132 +#: includes/include.js_files_overview.php:132 +#: includes/include.html_tpl_files_overview.php:133 +#, php-format +msgid "Do you really want to delete the following file:

    %s
    " +msgstr "" + +#: includes/include.style_files_overview.php:155 +#: includes/include.js_files_overview.php:155 +#: includes/include.mod_package.php:123 +#: includes/include.html_tpl_files_overview.php:156 +msgid "Directory is not existing or readable!" +msgstr "" + +#: includes/include.CMS_IMG.php:186 includes/include.CMS_EASYIMG.php:146 +#, php-format +msgid "Edit image for container %s" +msgstr "" + +#: includes/include.CMS_IMG.php:235 includes/include.CMS_LINK.php:180 +#: includes/include.CMS_LINK.php:182 includes/include.CMS_SWF.php:80 +#: includes/include.con_left_top.php:449 +#: includes/include.con_art_overview.php:523 +#: includes/include.upl_search_results.php:55 +#: includes/include.mod_package.php:180 +#: includes/include.mycontenido_lastarticles.php:183 +#: includes/cfg_language_de.inc.php:370 backend_search.php:669 +msgid "None" +msgstr "" + +#: includes/include.CMS_IMG.php:275 +msgid "Directory / File" +msgstr "" + +#: includes/include.CMS_IMG.php:283 +#: includes/include.upl_files_overview.php:526 +#: includes/include.upl_search_results.php:286 +#: includes/include.upl_edit.php:101 +msgid "Preview" +msgstr "" + +#: includes/include.tpl_new.php:39 +msgid "New template" +msgstr "" + +#: includes/functions.stat.php:44 +msgid "Info about article" +msgstr "" + +#: includes/functions.stat.php:46 +msgid "Info about directory" +msgstr "" + +#: includes/functions.stat.php:285 +msgid "Category is online" +msgstr "" + +#: includes/functions.stat.php:287 +msgid "Category is offline" +msgstr "" + +#: includes/functions.stat.php:313 includes/functions.stat.php:314 +#: includes/functions.stat.php:644 includes/functions.stat.php:645 +#: includes/grouprights_str.inc.php:215 +#: includes/include.upl_dirs_overview.php:56 includes/rights_con.inc.php:227 +#: includes/include.str_overview.php:169 includes/grouprights_con.inc.php:241 +#: includes/rights_str.inc.php:221 +msgid "Open category" +msgstr "" + +#: includes/functions.stat.php:478 +msgid "Sum" +msgstr "" + +#: includes/functions.stat.php:989 includes/functions.stat.php:1015 +#: includes/include.stat_overview.php:50 +msgid "Top 10" +msgstr "" + +#: includes/functions.stat.php:990 includes/functions.stat.php:1016 +#: includes/include.stat_overview.php:53 +msgid "Top 20" +msgstr "" + +#: includes/functions.stat.php:991 includes/functions.stat.php:1017 +#: includes/include.stat_overview.php:56 +msgid "Top 30" +msgstr "" + +#: includes/include.upl_files_overview.php:84 +#: includes/include.upl_edit.php:304 includes/include.upl_files_upload.php:67 +msgid "Directory not writable" +msgstr "" + +#: includes/include.upl_files_overview.php:240 +#, php-format +msgid "" +"The uploaded file (%s) exceeds the upload_max_filesize directive in php.ini." +msgstr "" + +#: includes/include.upl_files_overview.php:250 +#, php-format +msgid "Error while uploading file (%s)." +msgstr "" + +#: includes/include.upl_files_overview.php:302 +msgid "Errors while uploading file(s). Some or all files were not uploaded." +msgstr "" + +#: includes/include.upl_files_overview.php:386 +#: includes/include.upl_files_overview.php:388 +msgid "Use file" +msgstr "" + +#: includes/include.upl_files_overview.php:449 +#: includes/include.upl_files_overview.php:452 +#: includes/include.upl_files_overview.php:454 +#: includes/include.upl_search_results.php:190 +#: includes/include.upl_search_results.php:195 +#: includes/include.upl_search_results.php:198 +msgid "Filename / Description" +msgstr "" + +#: includes/include.upl_files_overview.php:459 +#: includes/include.upl_files_overview.php:462 +#: includes/include.upl_files_overview.php:464 +#: includes/include.upl_search_results.php:218 +#: includes/include.upl_search_results.php:223 +#: includes/include.upl_search_results.php:226 +msgid "Size" +msgstr "" + +#: includes/include.upl_files_overview.php:469 +#: includes/include.upl_files_overview.php:472 +#: includes/include.upl_files_overview.php:474 +#: includes/include.systemsettings.php:60 +#: includes/include.systemsettings.php:170 +#: includes/include.upl_search_results.php:232 +#: includes/include.upl_search_results.php:237 +#: includes/include.upl_search_results.php:240 +#: includes/include.mod_edit_form.php:384 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:185 includes/include.mod_new.php:87 +#: includes/include.mod_new.php:110 +msgid "Type" +msgstr "" + +#: includes/include.upl_files_overview.php:480 +msgid "Delete Files" +msgstr "" + +#: includes/include.upl_files_overview.php:480 +msgid "Are you sure you want to delete the selected files?" +msgstr "" + +#: includes/include.upl_files_overview.php:481 +msgid "Delete selected files" +msgstr "" + +#: includes/include.upl_files_overview.php:497 +msgid "Flip Selection" +msgstr "" + +#: includes/include.upl_files_overview.php:502 +#: includes/include.upl_files_upload.php:59 +msgid "Path:" +msgstr "" + +#: includes/include.upl_files_overview.php:517 +#: includes/include.upl_search_results.php:276 +msgid "Files per Page" +msgstr "" + +#: includes/include.upl_files_overview.php:525 +msgid "Mark" +msgstr "" + +#: includes/include.upl_files_overview.php:530 +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.con_art_overview.php:83 +#: includes/include.frontend.left_top.php:165 backend_search.php:497 +#: templates/standard/template.str_overview.html:233 +msgid "Actions" +msgstr "" + +#: includes/include.upl_files_overview.php:632 +msgid "Display properties" +msgstr "" + +#: includes/include.upl_files_overview.php:658 +#: includes/include.upl_search_results.php:417 +#: classes/class.cms_filelist.php:540 classes/class.cms_filelist.php:541 +msgid "No files found" +msgstr "" + +#: includes/include.upl_files_overview.php:681 +#: includes/include.upl_search_results.php:445 +msgid "Previous Page" +msgstr "" + +#: includes/include.upl_files_overview.php:687 +#: includes/include.upl_search_results.php:452 +msgid "Next Page" +msgstr "" + +#: includes/include.upl_files_overview.php:727 +#: includes/include.upl_search_results.php:490 +msgid "Page" +msgstr "" + +#: includes/include.upl_files_overview.php:752 +#: includes/cfg_language_de.inc.php:143 +msgid "Delete file" +msgstr "" + +#: includes/include.upl_files_overview.php:753 +msgid "Do you really want to delete the following file:
    " +msgstr "" + +#: includes/include.upl_files_overview.php:884 +#: includes/include.upl_search_results.php:605 +msgid "Enter new filename" +msgstr "" + +#: includes/grouprights_lay.inc.php:85 includes/rights_lay.inc.php:75 +msgid "Layout name" +msgstr "" + +#: includes/grouprights_lay.inc.php:113 includes/rights_lay.inc.php:100 +#: includes/rights_mod.inc.php:99 includes/grouprights_str.inc.php:105 +#: includes/grouprights_tpl.inc.php:101 includes/rights_con.inc.php:112 +#: includes/grouprights_area.inc.php:86 includes/grouprights_mod.inc.php:99 +#: includes/grouprights_con.inc.php:111 includes/rights_str.inc.php:106 +#: includes/rights_area.inc.php:87 includes/rights_tpl.inc.php:100 +msgid "Check all" +msgstr "" + +#: includes/include.grouprights_left_top.php:60 +#: includes/include.rights_left_top.php:77 +msgid "Frontend only" +msgstr "" + +#: includes/include.grouprights_left_top.php:61 +#: includes/include.rights_left_top.php:78 +msgid "Backend only" +msgstr "" + +#: includes/include.grouprights_left_top.php:90 +#: includes/cfg_language_de.inc.php:181 +#: includes/include.frontend.left_top.php:442 +msgid "Create group" +msgstr "" + +#: includes/include.tpl_edit_form.php:43 +msgid "- New Template -" +msgstr "" + +#: includes/include.tpl_edit_form.php:148 includes/cfg_language_de.inc.php:165 +msgid "Edit template" +msgstr "" + +#: includes/include.tpl_edit_form.php:151 +#: includes/include.js_edit_form.php:175 +#: includes/include.html_tpl_history.php:163 +#: includes/include.systemsettings.php:61 +#: includes/include.systemsettings.php:174 +#: includes/include.rights_left_top.php:116 +#: includes/include.mod_edit_form.php:377 +#: includes/include.mod_edit_form.php:381 includes/include.mod_history.php:131 +#: includes/include.js_history.php:155 includes/include.mod_package.php:235 +#: includes/include.mod_package.php:253 includes/include.mod_package.php:422 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:189 +#: includes/include.lay_history.php:120 includes/include.lay_edit_form.php:204 +#: includes/include.rights_overview.php:209 +#: includes/include.html_tpl_edit_form.php:213 +#: includes/include.style_history.php:160 +#: includes/include.style_edit_form.php:197 includes/include.mod_new.php:87 +#: includes/include.rights_create.php:156 +#: templates/standard/template.tpl_edit_form.html:19 +#: templates/standard/template.mod_edit_form.html:23 +#: templates/standard/template.lay_edit_form.html:22 +#: classes/class.ajax.php:162 classes/class.ajax.php:179 +msgid "Name" +msgstr "" + +#: includes/include.tpl_edit_form.php:158 +#: includes/include.tpl_edit_form.php:234 +msgid "Default" +msgstr "" + +#: includes/include.tpl_edit_form.php:160 +#: includes/include.lay_overview.php:101 +#: templates/standard/template.tpl_edit_form.html:42 +msgid "Layout" +msgstr "" + +#: includes/include.tpl_edit_form.php:161 +#: templates/standard/template.tpl_edit_form.html:55 +msgid "Layout description" +msgstr "" + +#: includes/include.js_edit_form.php:159 +#: includes/include.html_tpl_edit_form.php:197 +#: includes/include.style_edit_form.php:180 +msgid "Edit file" +msgstr "" + +#: includes/include.js_edit_form.php:177 +#: includes/include.html_tpl_history.php:165 +#: includes/include.js_history.php:157 includes/include.lay_history.php:122 +#: includes/include.lay_edit_form.php:206 +#: includes/include.lay_edit_form.php:217 +#: includes/include.html_tpl_edit_form.php:215 +#: includes/include.style_history.php:162 +#: includes/include.style_edit_form.php:199 +msgid "Code" +msgstr "" + +#: includes/include.CMS_LINK.php:153 +msgid "External link" +msgstr "" + +#: includes/include.CMS_LINK.php:210 +msgid "Internal link" +msgstr "" + +#: includes/include.CMS_LINK.php:215 includes/include.CMS_LINK.php:244 +#: includes/include.CMS_LINK.php:273 includes/include.CMS_LINK.php:288 +#: includes/include.CMS_LINK.php:304 includes/functions.general.php:1136 +#: includes/functions.general.php:1176 includes/include.str_overview.php:90 +#: classes/class.cms_teaser.php:353 classes/class.cms_teaser.php:382 +#: classes/class.cms_teaser.php:419 classes/class.cms_teaser.php:447 +#: classes/class.cms_teaser.php:476 classes/class.cms_teaser.php:539 +msgid "Please choose" +msgstr "" + +#: includes/include.CMS_LINK.php:240 +msgid "Link to a document" +msgstr "" + +#: includes/include.CMS_LINK.php:270 +msgid "Link to an image" +msgstr "" + +#: includes/include.CMS_LINK.php:285 +msgid "Link to an archive" +msgstr "" + +#: includes/include.CMS_LINK.php:300 +msgid "Link to a media file" +msgstr "" + +#: includes/include.CMS_LINK.php:316 +msgid "Link to any file" +msgstr "" + +#: includes/include.CMS_LINK.php:340 +msgid "Upload file" +msgstr "" + +#: includes/include.CMS_LINK.php:345 +msgid "Target frame" +msgstr "" + +#: includes/include.CMS_LINK.php:353 +msgid "Open link in new window" +msgstr "" + +#: includes/include.CMS_LINK.php:375 +msgid "Open in new window" +msgstr "" + +#: includes/include.tpl_overview.php:96 includes/include.lay_overview.php:83 +#: includes/include.mod_overview.php:196 +msgid "Click for more information about usage" +msgstr "" + +#: includes/include.tpl_overview.php:99 includes/cfg_language_de.inc.php:164 +msgid "Delete template" +msgstr "" + +#: includes/include.tpl_overview.php:100 +#, php-format +msgid "Do you really want to delete the following template:

    %s
    " +msgstr "" + +#: includes/include.tpl_overview.php:105 +msgid "Template in use, cannot delete" +msgstr "" + +#: includes/include.tpl_overview.php:111 includes/cfg_language_de.inc.php:167 +#: includes/cfg_language_de.inc.php:168 +#: templates/standard/template.symbolhelp.html:1016 +msgid "Duplicate template" +msgstr "" + +#: includes/include.tpl_overview.php:128 +#, php-format +msgid "The template '%s' is used for following categories and articles" +msgstr "" + +#: includes/functions.system.php:55 +msgid "Can't clear install error log : Access is denied!" +msgstr "" + +#: includes/functions.system.php:60 +msgid "error log successfully cleared" +msgstr "" + +#: includes/functions.system.php:278 +msgid "Contenido version" +msgstr "" + +#: includes/functions.system.php:281 +msgid "Contenido path" +msgstr "" + +#: includes/functions.system.php:283 +msgid "Contenido HTML path" +msgstr "" + +#: includes/functions.system.php:285 +msgid "Contenido full HTML path" +msgstr "" + +#: includes/functions.system.php:287 +msgid "Contenido frontend path" +msgstr "" + +#: includes/functions.system.php:289 +msgid "Contenido PHPLIB path" +msgstr "" + +#: includes/functions.system.php:291 +msgid "Contenido wysiwyg path" +msgstr "" + +#: includes/functions.system.php:293 +msgid "Contenido wysiwyg HTML path" +msgstr "" + +#: includes/functions.system.php:296 +msgid "Host name" +msgstr "" + +#: includes/functions.system.php:299 +msgid "Browser path" +msgstr "" + +#: includes/functions.system.php:321 +msgid "client settings" +msgstr "" + +#: includes/functions.system.php:322 +msgid "values" +msgstr "" + +#: includes/functions.system.php:353 +msgid "language(s)" +msgstr "" + +#: includes/functions.system.php:362 +msgid "htmlpath" +msgstr "" + +#: includes/functions.system.php:366 +msgid "frontendpath" +msgstr "" + +#: includes/functions.system.php:378 +msgid "No permissions!" +msgstr "" + +#: includes/functions.system.php:384 +msgid "Number of installed clients: " +msgstr "" + +#: includes/functions.system.php:387 +msgid "Client informations" +msgstr "" + +#: includes/functions.system.php:394 +msgid "Number of users" +msgstr "" + +#: includes/functions.system.php:401 includes/include.stat_overview.php:91 +msgid "Number of articles" +msgstr "" + +#: includes/functions.system.php:404 +msgid "Server operating system" +msgstr "" + +#: includes/functions.system.php:408 +msgid "PHP database extension" +msgstr "" + +#: includes/functions.system.php:410 +msgid "Database server version" +msgstr "" + +#: includes/functions.system.php:413 +msgid "Installed PHP version" +msgstr "" + +#: includes/functions.system.php:418 includes/functions.system.php:422 +#: includes/functions.system.php:426 includes/functions.system.php:447 +msgid "activated" +msgstr "" + +#: includes/functions.system.php:418 includes/functions.system.php:422 +#: includes/functions.system.php:426 includes/functions.system.php:447 +msgid "deactivated" +msgstr "" + +#: includes/functions.system.php:439 +msgid "nothing disabled" +msgstr "" + +#: includes/functions.system.php:440 +msgid "Disabled functions" +msgstr "" + +#: includes/functions.system.php:443 +msgid "loaded" +msgstr "" + +#: includes/functions.system.php:443 +msgid "not loaded" +msgstr "" + +#: includes/functions.system.php:444 +msgid "Gettext extension" +msgstr "" + +#: includes/functions.system.php:455 includes/main.login.php:213 +msgid "Settings" +msgstr "" + +#: includes/functions.system.php:456 +msgid "Values" +msgstr "" + +#: includes/functions.system.php:473 +msgid "GD library" +msgstr "" + +#: includes/functions.system.php:636 +msgid "an error occured while sending your bug report! Please try again" +msgstr "" + +#: includes/functions.system.php:639 +msgid "bug report forwarded" +msgstr "" + +#: includes/functions.system.php:645 +msgid "please fill out all mandatory fields" +msgstr "" + +#: includes/functions.system.php:649 +msgid "please enter a valid E-Mail adress" +msgstr "" + +#: includes/functions.system.php:653 +msgid "you must agree the declaration of consent" +msgstr "" + +#: includes/include.grouprights_create.php:57 +msgid "New Group" +msgstr "" + +#: includes/include.grouprights_create.php:71 +msgid "group created" +msgstr "" + +#: includes/include.grouprights_create.php:76 +msgid "Group couldn't created" +msgstr "" + +#: includes/include.grouprights_create.php:94 +#: includes/include.CMS_EASYIMG.php:158 includes/include.client_edit.php:227 +#: includes/include.grouprights_overview.php:102 +#: includes/include.rights_overview.php:192 +#: includes/include.rights_create.php:142 +#: classes/widgets/class.widgets.tableedit.php:188 +#: classes/widgets/class.widgets.views.php:80 classes/class.ui.php:351 +msgid "Save changes" +msgstr "" + +#: includes/include.grouprights_create.php:96 +#: includes/include.client_edit.php:236 +#: includes/include.grouprights_overview.php:106 +#: includes/include.grouprights_overview.php:209 +#: includes/include.rights_overview.php:197 +#: includes/include.rights_overview.php:353 +#: includes/include.rights_create.php:144 +msgid "Property" +msgstr "" + +#: includes/include.grouprights_create.php:99 +#: includes/include.systemsettings.php:62 +#: includes/include.systemsettings.php:178 +#: includes/include.client_edit.php:239 includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:193 +#: includes/include.grouprights_overview.php:109 +#: includes/include.grouprights_overview.php:210 +#: includes/include.rights_overview.php:200 +#: includes/include.rights_overview.php:354 +#: includes/include.rights_create.php:147 +#: templates/standard/template.log_main.html:15 +msgid "Value" +msgstr "" + +#: includes/include.grouprights_create.php:102 +#: includes/include.frontend.group_edit.php:221 +msgid "Group name" +msgstr "" + +#: includes/include.grouprights_create.php:123 +#: includes/include.grouprights_overview.php:129 +#: includes/include.rights_overview.php:271 +#: includes/include.rights_create.php:215 +msgid "System administrator" +msgstr "" + +#: includes/include.grouprights_create.php:141 +#: includes/include.grouprights_overview.php:147 +#: includes/include.rights_overview.php:289 +#: includes/include.rights_create.php:233 +msgid "Administrator" +msgstr "" + +#: includes/include.grouprights_create.php:156 +#: includes/include.grouprights_overview.php:163 +#: includes/include.rights_overview.php:305 +#: includes/include.rights_create.php:248 +msgid "Access clients" +msgstr "" + +#: includes/include.grouprights_create.php:172 +#: includes/include.grouprights_overview.php:180 +#: includes/include.rights_overview.php:322 +#: includes/include.rights_create.php:263 +msgid "Access languages" +msgstr "" + +#: includes/include.html_tpl_history.php:64 +#: includes/include.mod_history.php:57 includes/include.js_history.php:60 +#: includes/include.lay_history.php:51 includes/include.style_history.php:62 +msgid "Versioning is not activated" +msgstr "" + +#: includes/include.html_tpl_history.php:129 +#: includes/include.js_history.php:125 +msgid "Edit JScript" +msgstr "" + +#: includes/include.html_tpl_history.php:166 +#: includes/include.mod_history.php:135 includes/include.js_history.php:158 +#: includes/include.lay_history.php:123 includes/include.style_history.php:163 +msgid "Copy to current" +msgstr "" + +#: includes/include.html_tpl_history.php:179 +#: includes/include.html_tpl_history.php:187 +msgid "No template history available" +msgstr "" + +#: includes/include.html_tpl_history.php:185 +#: includes/include.mod_history.php:150 includes/include.js_history.php:177 +#: includes/include.lay_history.php:135 includes/include.style_history.php:182 +msgid "Version history was cleared" +msgstr "" + +#: includes/include.client_left_top.php:50 +#: includes/cfg_language_de.inc.php:243 +msgid "Create client" +msgstr "" + +#: includes/include.todo.popup.php:58 +msgid "Add TODO item" +msgstr "" + +#: includes/include.todo.popup.php:67 +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.mycontenido.tasks.edit.php:68 +msgid "Subject" +msgstr "" + +#: includes/include.todo.popup.php:75 +#: includes/include.mycontenido.tasks.edit.php:100 +msgid "Reminder date" +msgstr "" + +#: includes/include.todo.popup.php:79 +#: includes/include.mycontenido.tasks.edit.php:75 +#: includes/include.upl_edit.php:219 +#: templates/standard/template.con_edit_form.html:150 +#: templates/standard/template.log_main.html:34 +msgid "End date" +msgstr "" + +#: includes/include.todo.popup.php:80 +msgid "eMail notification" +msgstr "" + +#: includes/include.todo.popup.php:82 +#: includes/include.mycontenido.tasks.edit.php:81 +msgid "Reminder options" +msgstr "" + +#: includes/include.todo.popup.php:124 +#: includes/include.mycontenido.tasks.edit.php:65 +msgid "Assigned to" +msgstr "" + +#: includes/include.lay_new.php:38 +msgid "New Layout" +msgstr "" + +#: includes/functions.general.php:103 +#: classes/datatypes/class.datatype.datetime.php:140 +msgid "January" +msgstr "" + +#: includes/functions.general.php:106 +#: classes/datatypes/class.datatype.datetime.php:141 +msgid "February" +msgstr "" + +#: includes/functions.general.php:109 +#: classes/datatypes/class.datatype.datetime.php:142 +msgid "March" +msgstr "" + +#: includes/functions.general.php:112 +#: classes/datatypes/class.datatype.datetime.php:143 +msgid "April" +msgstr "" + +#: includes/functions.general.php:115 +#: classes/datatypes/class.datatype.datetime.php:144 +msgid "May" +msgstr "" + +#: includes/functions.general.php:118 +#: classes/datatypes/class.datatype.datetime.php:145 +msgid "June" +msgstr "" + +#: includes/functions.general.php:121 +#: classes/datatypes/class.datatype.datetime.php:146 +msgid "July" +msgstr "" + +#: includes/functions.general.php:124 +#: classes/datatypes/class.datatype.datetime.php:147 +msgid "August" +msgstr "" + +#: includes/functions.general.php:127 +#: classes/datatypes/class.datatype.datetime.php:148 +msgid "September" +msgstr "" + +#: includes/functions.general.php:130 +#: classes/datatypes/class.datatype.datetime.php:149 +msgid "October" +msgstr "" + +#: includes/functions.general.php:133 +#: classes/datatypes/class.datatype.datetime.php:150 +msgid "November" +msgstr "" + +#: includes/functions.general.php:136 +#: classes/datatypes/class.datatype.datetime.php:151 +msgid "December" +msgstr "" + +#: includes/functions.general.php:150 +#: classes/datatypes/class.datatype.datetime.php:160 +msgid "Monday" +msgstr "" + +#: includes/functions.general.php:153 +#: classes/datatypes/class.datatype.datetime.php:161 +msgid "Tuesday" +msgstr "" + +#: includes/functions.general.php:156 +#: classes/datatypes/class.datatype.datetime.php:162 +msgid "Wednesday" +msgstr "" + +#: includes/functions.general.php:159 +#: classes/datatypes/class.datatype.datetime.php:163 +msgid "Thursday" +msgstr "" + +#: includes/functions.general.php:162 +#: classes/datatypes/class.datatype.datetime.php:164 +msgid "Friday" +msgstr "" + +#: includes/functions.general.php:165 +msgid "Saterday" +msgstr "" + +#: includes/functions.general.php:168 +#: classes/datatypes/class.datatype.datetime.php:159 +#: classes/datatypes/class.datatype.datetime.php:166 +msgid "Sunday" +msgstr "" + +#: includes/functions.general.php:1977 +#, php-format +msgid "MySQL Database not reachable for installation %s" +msgstr "" + +#: includes/functions.general.php:1980 +#, php-format +msgid "" +"The MySQL Database for the installation %s is not reachable. Please check if " +"this is a temporary problem or if it is a real fault." +msgstr "" + +#: includes/rights_mod.inc.php:75 includes/grouprights_mod.inc.php:73 +msgid "Module name" +msgstr "" + +#: includes/include.client_artspec.php:79 +#: includes/include.con_edit_form.php:241 +msgid "Article specification" +msgstr "" + +#: includes/include.client_artspec.php:80 +#: includes/include.mycontenido.tasks.php:397 +#: includes/include.mycontenido_settings.php:127 +#: includes/include.lay_edit_form.php:207 +msgid "Options" +msgstr "" + +#: includes/include.client_artspec.php:90 +#: includes/include.systemsettings.php:71 +#: includes/include.systemsettings.php:75 +#: includes/include.clientsettings.php:114 includes/include.upl_edit.php:66 +msgid "Edit" +msgstr "" + +#: includes/include.client_artspec.php:94 +#: includes/include.systemsettings.php:79 +#: includes/include.systemsettings.php:81 +#: includes/include.clientsettings.php:108 +msgid "Delete" +msgstr "" + +#: includes/include.client_artspec.php:131 +msgid "Save" +msgstr "" + +#: includes/include.client_artspec.php:140 +#: includes/include.con_art_overview.php:601 +#: includes/include.str_overview.php:957 includes/include.str_overview.php:959 +#: backend_search.php:652 scripts/HTMLObj.js.php:242 +#: scripts/HTMLObj.js.php:245 scripts/langref.php:9 +msgid "Make online" +msgstr "" + +#: includes/include.client_artspec.php:144 +#: includes/include.con_art_overview.php:593 backend_search.php:648 +#: scripts/HTMLObj.js.php:239 scripts/langref.php:8 +msgid "Make offline" +msgstr "" + +#: includes/include.client_artspec.php:150 +msgid "Make this article specification default" +msgstr "" + +#: includes/include.client_artspec.php:154 +msgid "This article specification is default" +msgstr "" + +#: includes/include.client_artspec.php:163 +#: includes/include.con_edit_form.php:238 +msgid "No article specifications found!" +msgstr "" + +#: includes/include.client_artspec.php:173 +msgid "Create new article specification" +msgstr "" + +#: includes/include.client_artspec.php:176 +msgid "Specification name" +msgstr "" + +#: includes/include.mycontenido.tasks.php:128 +msgid "No status type set" +msgstr "" + +#: includes/include.mycontenido.tasks.php:155 +#, php-format +msgid "%d %% complete" +msgstr "" + +#: includes/include.mycontenido.tasks.php:196 +msgid "Today" +msgstr "" + +#: includes/include.mycontenido.tasks.php:201 +#: includes/include.mycontenido.tasks.php:203 +msgid "Day(s)" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.con_edit_form.php:284 includes/include.upl_artlist.php:81 +#: templates/standard/template.mycontenido_lastarticles.html:64 +msgid "Created" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +msgid "End Date" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.mycontenido.tasks.edit.php:137 +#: includes/include.stat_overview.php:90 includes/include.mod_package.php:252 +#: includes/include.mod_package.php:361 includes/include.mod_package.php:366 +msgid "Status" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.mycontenido.tasks.edit.php:132 +msgid "Priority" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +#, php-format +msgid "%% complete" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +msgid "Due in" +msgstr "" + +#: includes/include.mycontenido.tasks.php:302 +msgid "Unnamed item" +msgstr "" + +#: includes/include.mycontenido.tasks.php:307 +msgid "No end date set" +msgstr "" + +#: includes/include.mycontenido.tasks.php:314 +msgid "No status set" +msgstr "" + +#: includes/include.mycontenido.tasks.php:338 +msgid "Delete item" +msgstr "" + +#: includes/include.mycontenido.tasks.php:345 +msgid "Edit item" +msgstr "" + +#: includes/include.mycontenido.tasks.php:376 +msgid "Restrict display" +msgstr "" + +#: includes/include.mycontenido.tasks.php:380 classes/class.version.php:522 +msgid "Refresh" +msgstr "" + +#: includes/include.mycontenido.tasks.php:386 +msgid "Hide done tasks" +msgstr "" + +#: includes/include.mycontenido.tasks.php:401 +msgid "No tasks found" +msgstr "" + +#: includes/include.systemsettings.php:47 +msgid "Please set this property in systemsettings directly" +msgstr "" + +#: includes/include.systemsettings.php:157 +#: includes/include.clientsettings.php:172 +msgid "No defined properties" +msgstr "" + +#: includes/include.systemsettings.php:167 +#: includes/include.clientsettings.php:181 +msgid "Add new variable" +msgstr "" + +#: includes/include.con_edit_form.php:134 +#: includes/include.tplcfg_edit_form.php:57 +#: external/backendedit/front_content.php:484 +#: external/frontend/front_content.php:494 +#, php-format +msgid "Article is in use by %s (%s)" +msgstr "" + +#: includes/include.con_edit_form.php:208 +#: includes/include.con_art_overview.php:78 +#: includes/include.con_art_overview.php:746 +#: includes/include.stat_overview.php:89 includes/include.upl_artlist.php:81 +#: backend_search.php:492 +#: templates/standard/template.mycontenido_lastarticles.html:62 +msgid "Title" +msgstr "" + +#: includes/include.con_edit_form.php:211 +#: includes/include.str_overview.php:509 +#: templates/standard/template.str_overview.html:133 +#: templates/standard/template.str_overview.html:227 +msgid "Alias" +msgstr "" + +#: includes/include.con_edit_form.php:253 +msgid "Articlelink" +msgstr "" + +#: includes/include.con_edit_form.php:260 +msgid "Select an entry to display link" +msgstr "" + +#: includes/include.con_edit_form.php:261 +msgid "Article only" +msgstr "" + +#: includes/include.con_edit_form.php:262 +msgid "Article with Category" +msgstr "" + +#: includes/include.con_edit_form.php:263 +msgid "Article with Category and Language" +msgstr "" + +#: includes/include.con_edit_form.php:264 +msgid "Article with Language" +msgstr "" + +#: includes/include.con_edit_form.php:278 +msgid "Author (Creator)" +msgstr "" + +#: includes/include.con_edit_form.php:288 +msgid "Author (Modifier)" +msgstr "" + +#: includes/include.con_edit_form.php:289 +msgid "Last modified" +msgstr "" + +#: includes/include.con_edit_form.php:293 +msgid "Publishing date" +msgstr "" + +#: includes/include.con_edit_form.php:297 +#: includes/include.con_art_overview.php:354 +msgid "not yet published" +msgstr "" + +#: includes/include.con_edit_form.php:300 +msgid "Publisher" +msgstr "" + +#: includes/include.con_edit_form.php:308 +msgid "Redirect" +msgstr "" + +#: includes/include.con_edit_form.php:324 +msgid "New Window" +msgstr "" + +#: includes/include.con_edit_form.php:350 +#: includes/include.con_art_overview.php:553 +msgid "Start article" +msgstr "" + +#: includes/include.con_edit_form.php:354 +#: includes/include.con_art_overview.php:841 +msgid "Sort key" +msgstr "" + +#: includes/include.con_edit_form.php:391 includes/cfg_language_de.inc.php:114 +msgid "Remove assignments" +msgstr "" + +#: includes/include.con_edit_form.php:393 +msgid "Remove multiple category assignments" +msgstr "" + +#: includes/include.con_edit_form.php:394 +msgid "" +"Do you really want to remove the assignments to all categories except the " +"current one?" +msgstr "" + +#: includes/include.con_edit_form.php:410 +msgid "" +"Language parts of the articles are existing in other languages and are " +"online. To change the category assignment, please set the other articles " +"offline first." +msgstr "" + +#: includes/include.con_edit_form.php:510 includes/grouprights_str.inc.php:76 +#: includes/rights_con.inc.php:78 includes/include.con_editcontent.php:387 +#: includes/grouprights_con.inc.php:78 includes/rights_str.inc.php:77 +#: includes/include.note.popup.php:93 +#: templates/standard/template.symbolhelp.html:41 +#: templates/standard/template.symbolhelp.html:472 +#: templates/standard/template.str_overview.html:124 +#: templates/standard/template.str_overview.html:224 +#: templates/standard/template.mycontenido_lastarticles.html:63 +#: templates/standard/template.log_main.html:52 +#: classes/class.cms_teaser.php:595 classes/class.ajax.php:153 +msgid "Category" +msgstr "" + +#: includes/include.con_edit_form.php:549 +msgid "Choose Startdate" +msgstr "" + +#: includes/include.con_edit_form.php:550 +msgid "Choose Enddate" +msgstr "" + +#: includes/include.con_edit_form.php:648 +msgid "Select date" +msgstr "" + +#: includes/include.con_edit_form.php:685 +msgid "Summary" +msgstr "" + +#: includes/include.CMS_EASYIMG.php:153 +msgid "Upload image" +msgstr "" + +#: includes/include.CMS_EASYIMG.php:157 includes/include.client_edit.php:228 +#: includes/include.grouprights_overview.php:103 +#: includes/include.rights_overview.php:193 +msgid "Discard changes" +msgstr "" + +#: includes/grouprights_str.inc.php:212 includes/rights_con.inc.php:223 +#: includes/grouprights_con.inc.php:237 includes/rights_str.inc.php:217 +msgid "" +"Apply rights for this category to all categories on the same level or above" +msgstr "" + +#: includes/grouprights_str.inc.php:213 includes/rights_con.inc.php:224 +#: includes/grouprights_con.inc.php:238 includes/rights_str.inc.php:218 +msgid "" +"Apply rights for this category to all categories below the current category" +msgstr "" + +#: includes/grouprights_str.inc.php:215 +#: includes/include.upl_dirs_overview.php:60 includes/rights_con.inc.php:227 +#: includes/include.str_overview.php:174 includes/grouprights_con.inc.php:241 +#: includes/rights_str.inc.php:221 +msgid "Close category" +msgstr "" + +#: includes/include.upl_dirs_overview.php:153 +msgid "Failed to delete the following files:" +msgstr "" + +#: includes/include.upl_dirs_overview.php:159 +#, php-format +msgid "Failed to remove directory %s" +msgstr "" + +#: includes/include.upl_dirs_overview.php:190 +msgid "Upload directory" +msgstr "" + +#: includes/include.upl_dirs_overview.php:194 +msgid "" +"The following directories contains invalid characters and were ignored: " +msgstr "" + +#: includes/include.upl_dirs_overview.php:197 +msgid "Please click here in order to rename automatically." +msgstr "" + +#: includes/include.upl_dirs_overview.php:319 +msgid "Categories" +msgstr "" + +#: includes/include.upl_dirs_overview.php:400 +#: includes/include.upl_dirs_overview.php:547 +msgid "Delete directory" +msgstr "" + +#: includes/include.upl_dirs_overview.php:400 +#: includes/include.upl_dirs_overview.php:547 +msgid "Do you really want to delete the following directory:" +msgstr "" + +#: includes/include.upl_dirs_overview.php:405 +#: includes/include.upl_dirs_overview.php:552 +msgid "Directory contains files" +msgstr "" + +#: includes/include.upl_dirs_overview.php:454 +msgid "Database Filesystem" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:76 +#, php-format +msgid "Category Template configuration is in use by %s (%s)" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:276 +#: includes/include.con_art_overview.php:82 +#: includes/include.pretplcfg_edit_form.php:76 backend_search.php:496 +#: templates/standard/template.str_overview.html:230 +#: templates/standard/template.mycontenido_lastarticles.html:66 +msgid "Template" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:352 +msgid "Module in container" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:476 +msgid "Categorytemplate configuration" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:479 +msgid "Articletemplate configuration" +msgstr "" + +#: includes/include.rights_menu.php:133 +#: includes/include.frontend.user_menu.php:273 +#: includes/include.frontend.left_top.php:395 +#, php-format +msgid "Do you really want to delete the user %s?" +msgstr "" + +#: includes/include.rights_menu.php:135 +#: includes/include.frontend.user_menu.php:275 +#: includes/cfg_language_de.inc.php:172 +#: includes/include.frontend.left_top.php:397 +msgid "Delete user" +msgstr "" + +#: includes/include.info.php:38 +msgid "" +"You can find a lot of information and a community forum on the ConLite Portal" +msgstr "" + +#: includes/include.CMS_HTMLHEAD.php:100 includes/include.CMS_HTML.php:98 +msgid "Save without leaving the editor" +msgstr "" + +#: includes/include.CMS_HTMLHEAD.php:101 includes/include.CMS_HTML.php:99 +msgid "Save and close editor" +msgstr "" + +#: includes/functions.tpl.php:436 includes/functions.con.php:1837 +#: includes/functions.str.php:1387 +#, php-format +msgid "%s (Copy)" +msgstr "" + +#: includes/include.con_left_top.php:135 +msgid "Ignore" +msgstr "" + +#: includes/include.con_left_top.php:136 classes/class.cms_filelist.php:444 +msgid "Date created" +msgstr "" + +#: includes/include.con_left_top.php:137 classes/class.cms_filelist.php:447 +msgid "Date modified" +msgstr "" + +#: includes/include.con_left_top.php:138 +msgid "Date published" +msgstr "" + +#: includes/include.con_left_top.php:141 +msgid "Article Search" +msgstr "" + +#: includes/include.con_left_top.php:237 +#: templates/standard/template.recipient_menu.html:92 +msgid "Search" +msgstr "" + +#: includes/include.con_left_top.php:250 +msgid "Title/Content" +msgstr "" + +#: includes/include.con_left_top.php:255 +msgid "Article ID" +msgstr "" + +#: includes/include.con_left_top.php:260 +msgid "Datum" +msgstr "" + +#: includes/include.con_left_top.php:265 +msgid "Date from" +msgstr "" + +#: includes/include.con_left_top.php:270 +msgid "Date to" +msgstr "" + +#: includes/include.con_left_top.php:291 +msgid "Saved Searches" +msgstr "" + +#: includes/include.con_left_top.php:302 +#: includes/include.mycontenido_lastarticles.php:137 +#: includes/main.login.php:211 +msgid "Recently edited articles" +msgstr "" + +#: includes/include.con_left_top.php:306 +msgid "My articles" +msgstr "" + +#: includes/include.con_left_top.php:311 +msgid "Workflow" +msgstr "" + +#: includes/include.con_left_top.php:369 scripts/HTMLObj.js.php:254 +#: scripts/langref.php:12 +msgid "Choose template" +msgstr "" + +#: includes/include.con_left_top.php:379 +msgid "Edit Category" +msgstr "" + +#: includes/include.con_left_top.php:395 +msgid "Template:" +msgstr "" + +#: includes/include.con_left_top.php:404 includes/include.con_left_top.php:405 +msgid "Configure Category" +msgstr "" + +#: includes/include.con_left_top.php:407 includes/include.con_left_top.php:408 +msgid "Online / Offline" +msgstr "" + +#: includes/include.con_left_top.php:410 includes/include.con_left_top.php:411 +msgid "Lock / Unlock" +msgstr "" + +#: includes/include.con_left_top.php:428 +msgid "close all" +msgstr "" + +#: includes/include.con_left_top.php:428 +#: includes/include.con_str_overview.php:612 +#: includes/include.str_overview.php:486 includes/include.str_overview.php:487 +#: includes/include.str_overview.php:488 +#: templates/standard/template.stat_overview.html:135 +msgid "Close all categories" +msgstr "" + +#: includes/include.con_left_top.php:429 +msgid "open all" +msgstr "" + +#: includes/include.con_left_top.php:429 +#: includes/include.con_str_overview.php:613 +#: includes/include.str_overview.php:493 includes/include.str_overview.php:494 +#: includes/include.str_overview.php:495 +#: templates/standard/template.stat_overview.html:137 +msgid "Open all categories" +msgstr "" + +#: includes/include.con_left_top.php:439 +msgid "Synchronize from" +msgstr "" + +#: includes/include.con_left_top.php:472 includes/include.con_left_top.php:473 +msgid "Copy to current language" +msgstr "" + +#: includes/include.con_left_top.php:474 includes/include.con_left_top.php:475 +msgid "Also copy subcategories" +msgstr "" + +#: includes/include.con_art_overview.php:77 +#: includes/include.con_editcontent.php:382 +#: includes/include.con_subnav.php:104 backend_search.php:491 +#: templates/standard/template.symbolhelp.html:38 +#: templates/standard/template.symbolhelp.html:283 +#: templates/standard/template.log_main.html:53 +#: classes/class.cms_teaser.php:596 classes/class.ajax.php:170 +msgid "Article" +msgstr "" + +#: includes/include.con_art_overview.php:79 backend_search.php:493 +msgid "Changed" +msgstr "" + +#: includes/include.con_art_overview.php:80 backend_search.php:494 +msgid "Published" +msgstr "" + +#: includes/include.con_art_overview.php:81 +#: includes/include.rights_left_top.php:155 +#: includes/include.frontend.left_top.php:257 includes/include.mod_new.php:161 +#: backend_search.php:495 classes/class.cms_teaser.php:588 +#: classes/class.cms_filelist.php:738 +msgid "Sort order" +msgstr "" + +#: includes/include.con_art_overview.php:369 +msgid "Article is in use" +msgstr "" + +#: includes/include.con_art_overview.php:370 +#, php-format +msgid "Article in use by %s (%s)" +msgstr "" + +#: includes/include.con_art_overview.php:436 backend_search.php:658 +msgid "Unfreeze article" +msgstr "" + +#: includes/include.con_art_overview.php:439 +#: includes/cfg_language_de.inc.php:98 backend_search.php:661 +msgid "Freeze article" +msgstr "" + +#: includes/include.con_art_overview.php:446 +msgid "Article is frozen" +msgstr "" + +#: includes/include.con_art_overview.php:449 +msgid "Article is not frozen" +msgstr "" + +#: includes/include.con_art_overview.php:472 backend_search.php:676 +msgid "Article properties" +msgstr "" + +#: includes/include.con_art_overview.php:486 +msgid "Copy article to the current language" +msgstr "" + +#: includes/include.con_art_overview.php:547 backend_search.php:635 +msgid "Flag as start article" +msgstr "" + +#: includes/include.con_art_overview.php:549 backend_search.php:632 +msgid "Flag as normal article" +msgstr "" + +#: includes/include.con_art_overview.php:555 +msgid "Normal article" +msgstr "" + +#: includes/include.con_art_overview.php:569 backend_search.php:675 +#: templates/standard/template.symbolhelp.html:413 +msgid "Duplicate article" +msgstr "" + +#: includes/include.con_art_overview.php:581 +#, php-format +msgid "Reminder for Article '%s'" +msgstr "" + +#: includes/include.con_art_overview.php:584 +#, php-format +msgid "" +"Reminder for Article '%s'\n" +"Category: %s" +msgstr "" + +#: includes/include.con_art_overview.php:595 +#: includes/include.mycontenido_lastarticles.php:221 +msgid "Article is online" +msgstr "" + +#: includes/include.con_art_overview.php:603 +#: includes/include.mycontenido_lastarticles.php:224 +msgid "Article is offline" +msgstr "" + +#: includes/include.con_art_overview.php:625 +#, php-format +msgid "Are you sure to delete the following article:

    %s" +msgstr "" + +#: includes/include.con_art_overview.php:626 +#: includes/cfg_language_de.inc.php:106 backend_search.php:678 +#: templates/standard/template.symbolhelp.html:425 +msgid "Delete article" +msgstr "" + +#: includes/include.con_art_overview.php:771 +#: includes/include.con_art_overview.php:774 +#, php-format +msgid "Go to page: %s" +msgstr "" + +#: includes/include.con_art_overview.php:777 +msgid "with click select line for further treatment" +msgstr "" + +#: includes/include.con_art_overview.php:832 +#: includes/include.con_art_overview.php:938 +msgid "No articles found" +msgstr "" + +#: includes/include.con_art_overview.php:838 +msgid "Alphabetical" +msgstr "" + +#: includes/include.con_art_overview.php:839 +msgid "Last change" +msgstr "" + +#: includes/include.con_art_overview.php:840 +msgid "Published date" +msgstr "" + +#: includes/include.con_art_overview.php:860 +msgid "Sort articles:" +msgstr "" + +#: includes/include.con_art_overview.php:887 +msgid "Items per page:" +msgstr "" + +#: includes/include.con_art_overview.php:988 +#: includes/include.con_art_overview.php:989 +#: templates/standard/template.symbolhelp.html:329 +msgid "Create new article" +msgstr "" + +#: includes/include.frontend.user_menu.php:53 +#: includes/include.frontend.left_top.php:58 +msgid "-- All fields --" +msgstr "" + +#: includes/include.frontend.user_menu.php:53 +#: includes/include.frontend.user_menu.php:54 +#: includes/include.rights_overview.php:203 +#: includes/include.frontend.left_top.php:58 +#: includes/include.frontend.left_top.php:59 +#: includes/include.rights_create.php:150 +msgid "Username" +msgstr "" + +#: includes/include.frontend.user_menu.php:112 +#: includes/include.rights_left_top.php:118 +#: includes/include.frontend.left_top.php:118 includes/include.mod_new.php:88 +#: classes/class.cms_teaser.php:423 classes/class.cms_filelist.php:465 +msgid "Ascending" +msgstr "" + +#: includes/include.frontend.user_menu.php:112 +#: includes/include.rights_left_top.php:119 +#: includes/include.frontend.left_top.php:118 includes/include.mod_new.php:88 +#: classes/class.cms_teaser.php:426 classes/class.cms_filelist.php:468 +msgid "Descending" +msgstr "" + +#: includes/include.frontend.user_menu.php:114 +#: includes/include.rights_left_top.php:123 +#: includes/include.frontend.left_top.php:193 includes/include.mod_new.php:94 +msgid "List options" +msgstr "" + +#: includes/include.frontend.user_menu.php:139 +#: includes/include.frontend.left_top.php:228 +msgid "-- All Groups --" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:43 +msgid "Edit Reminder item" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:77 +msgid "E-Mail notification" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:140 +msgid "Progress" +msgstr "" + +#: includes/grouprights_tpl.inc.php:72 includes/rights_tpl.inc.php:73 +#: classes/class.ajax.php:105 classes/class.ajax.php:129 +msgid "Template name" +msgstr "" + +#: includes/include.upl_search_results.php:204 +#: includes/include.upl_search_results.php:209 +#: includes/include.upl_search_results.php:212 +#: includes/include.upl_edit.php:92 +msgid "Path" +msgstr "" + +#: includes/include.upl_search_results.php:246 +#: includes/include.upl_search_results.php:251 +#: includes/include.upl_search_results.php:254 +msgid "Relevance" +msgstr "" + +#: includes/include.upl_search_results.php:260 +msgid "Searched for:" +msgstr "" + +#: includes/include.client_edit.php:52 +msgid "No client ID passed" +msgstr "" + +#: includes/include.client_edit.php:65 +msgid "" +"Notice: In order to use this client, you must create a new language for it." +msgstr "" + +#: includes/include.client_edit.php:69 +#, php-format +msgid "Please click %shere%s to create a new language." +msgstr "" + +#: includes/include.client_edit.php:110 +msgid "Couldn't write the file config.php." +msgstr "" + +#: includes/include.client_edit.php:118 +#, php-format +msgid "Succesfully copied client-template to %s." +msgstr "" + +#: includes/include.client_edit.php:121 +#, php-format +msgid "" +"Cannot create directory %s . The client was created, but you have to copy " +"the frontend-template yourself" +msgstr "" + +#: includes/include.client_edit.php:125 +#, php-format +msgid "" +"The directory %s already exists. The client was created, but you have to " +"copy the frontend-template yourself" +msgstr "" + +#: includes/include.client_edit.php:129 +#, php-format +msgid "Client '%s' created." +msgstr "" + +#: includes/include.client_edit.php:147 +msgid "" +"You changed the client path. You might need to copy the frontend to the new " +"location" +msgstr "" + +#: includes/include.client_edit.php:245 +msgid "Client name" +msgstr "" + +#: includes/include.client_edit.php:261 +msgid "Server path" +msgstr "" + +#: includes/include.client_edit.php:277 +msgid "Web address" +msgstr "" + +#: includes/include.client_edit.php:286 +msgid "Error page category" +msgstr "" + +#: includes/include.client_edit.php:295 +msgid "Error page article" +msgstr "" + +#: includes/include.client_edit.php:306 +msgid "Client logo" +msgstr "" + +#: includes/include.client_edit.php:315 +msgid "HTML" +msgstr "" + +#: includes/include.client_edit.php:315 +msgid "XHTML" +msgstr "" + +#: includes/include.client_edit.php:315 +msgid "HTML5" +msgstr "" + +#: includes/include.client_edit.php:330 +msgid "Generate" +msgstr "" + +#: includes/include.client_edit.php:341 +msgid "Copy frontend template" +msgstr "" + +#: includes/include.rights_left_top.php:103 +#: includes/cfg_language_de.inc.php:171 includes/cfg_language_de.inc.php:174 +#: includes/include.frontend.left_top.php:178 +#: templates/standard/template.symbolhelp.html:1835 +msgid "Create user" +msgstr "" + +#: includes/include.rights_left_top.php:147 +#: includes/include.frontend.left_top.php:249 includes/include.mod_new.php:153 +msgid "Items / page" +msgstr "" + +#: includes/include.rights_left_top.php:151 +#: includes/include.frontend.left_top.php:253 includes/include.mod_new.php:157 +msgid "Sort by" +msgstr "" + +#: includes/include.rights_left_top.php:164 +#: includes/include.frontend.left_top.php:274 includes/include.mod_new.php:178 +msgid "Apply" +msgstr "" + +#: includes/include.mycontenido_settings.php:57 +msgid "Old password incorrect" +msgstr "" + +#: includes/include.mycontenido_settings.php:62 +#: includes/include.rights_overview.php:132 +#: includes/include.rights_create.php:122 +msgid "Passwords don't match" +msgstr "" + +#: includes/include.mycontenido_settings.php:77 +msgid "Password changed" +msgstr "" + +#: includes/include.mycontenido_settings.php:97 +#, php-format +msgid "Settings for %s" +msgstr "" + +#: includes/include.mycontenido_settings.php:115 +msgid "Old password" +msgstr "" + +#: includes/include.mycontenido_settings.php:117 +#: includes/include.rights_overview.php:223 +#: includes/include.rights_create.php:168 +msgid "Confirm new password" +msgstr "" + +#: includes/include.mycontenido_settings.php:121 +#: includes/include.rights_overview.php:230 +#: includes/include.rights_create.php:174 +msgid "E-Mail" +msgstr "" + +#: includes/include.mycontenido_settings.php:125 +msgid "Use WYSIWYG Editor" +msgstr "" + +#: includes/include.mycontenido_settings.php:129 +msgid "The format is equal to PHP's date() function." +msgstr "" + +#: includes/include.mycontenido_settings.php:131 +msgid "Common date formattings" +msgstr "" + +#: includes/include.mod_edit_form.php:54 includes/include.lay_overview.php:78 +#: includes/include.mod_overview.php:209 includes/include.str_overview.php:741 +msgid "No permission" +msgstr "" + +#: includes/include.mod_edit_form.php:58 +#: classes/contenido/class.module.php:395 +msgid "- Unnamed Module -" +msgstr "" + +#: includes/include.mod_edit_form.php:59 +msgid "" +msgstr "" + +#: includes/include.mod_edit_form.php:59 +msgid "Author: " +msgstr "" + +#: includes/include.mod_edit_form.php:59 +msgid "Version:" +msgstr "" + +#: includes/include.mod_edit_form.php:77 includes/include.mod_package.php:219 +#: includes/include.mod_package.php:357 +#, php-format +msgid "Error while importing XML file: %s" +msgstr "" + +#: includes/include.mod_edit_form.php:88 +msgid "Module folder created" +msgstr "" + +#: includes/include.mod_edit_form.php:91 +msgid "Error while creating module folder" +msgstr "" + +#: includes/include.mod_edit_form.php:106 includes/include.mod_package.php:398 +#, php-format +msgid "Module is in use by %s (%s)" +msgstr "" + +#: includes/include.mod_edit_form.php:127 includes/cfg_language_de.inc.php:157 +msgid "Edit module" +msgstr "" + +#: includes/include.mod_edit_form.php:299 +#: includes/include.mod_edit_form.php:301 +msgid "Custom" +msgstr "" + +#: includes/include.mod_edit_form.php:324 +#: includes/include.mod_edit_form.php:333 +#, php-format +msgid "Error in module. Error location: %s" +msgstr "" + +#: includes/include.mod_edit_form.php:327 +#: includes/include.mod_edit_form.php:336 +msgid "Module successfully compiled" +msgstr "" + +#: includes/include.mod_edit_form.php:371 +msgid "Create Folder" +msgstr "" + +#: includes/include.mod_edit_form.php:405 +#: includes/include.mod_edit_form.php:408 includes/include.mod_new.php:111 +msgid "Input" +msgstr "" + +#: includes/include.mod_edit_form.php:406 +#: includes/include.mod_edit_form.php:409 includes/include.mod_new.php:112 +msgid "Output" +msgstr "" + +#: includes/include.mod_edit_form.php:415 +msgid "" +"This module uses variables and/or functions which are probably not available " +"in this Contenido version. Please make sure that you use up-to-date modules." +msgstr "" + +#: includes/include.mod_edit_form.php:423 +#: includes/include.mod_translate.php:174 includes/include.mod_package.php:454 +msgid "Import from file" +msgstr "" + +#: includes/include.mod_edit_form.php:424 +#: includes/include.mod_translate.php:173 includes/include.mod_package.php:455 +msgid "Export to file" +msgstr "" + +#: includes/include.mod_edit_form.php:440 +#: includes/include.mod_translate.php:184 includes/include.mod_package.php:472 +msgid "Mode" +msgstr "" + +#: includes/include.mod_edit_form.php:442 +#: includes/include.mod_edit_form.php:444 +#: includes/include.mod_translate.php:185 includes/include.mod_package.php:476 +#: includes/include.mod_package.php:478 classes/class.cms_filelist.php:745 +msgid "File" +msgstr "" + +#: includes/grouprights.inc.php:215 +msgid "Current group doesn't have any rights to any client/language." +msgstr "" + +#: includes/include.lay_overview.php:82 +msgid "Layout is in use, cannot delete" +msgstr "" + +#: includes/include.lay_overview.php:92 includes/cfg_language_de.inc.php:147 +msgid "Delete layout" +msgstr "" + +#: includes/include.lay_overview.php:93 +#, php-format +msgid "Do you really want to delete the following layout:

    %s
    " +msgstr "" + +#: includes/include.lay_overview.php:118 +#, php-format +msgid "The layout '%s' is used for following templates" +msgstr "" + +#: includes/include.stat_overview.php:47 includes/include.stat_overview.php:60 +msgid "Full statistics" +msgstr "" + +#: includes/include.stat_overview.php:76 +msgid "Yearly" +msgstr "" + +#: includes/include.stat_overview.php:80 +msgid "Current" +msgstr "" + +#: includes/include.stat_overview.php:92 +#: templates/standard/template.symbolhelp.html:89 +#: templates/standard/template.symbolhelp.html:1472 +msgid "Hits" +msgstr "" + +#: includes/include.stat_overview.php:94 +msgid "Hits in this language" +msgstr "" + +#: includes/include.mod_history.php:94 +msgid "Edit Module" +msgstr "" + +#: includes/include.mod_history.php:133 +msgid "Code Input" +msgstr "" + +#: includes/include.mod_history.php:134 +msgid "Code Output" +msgstr "" + +#: includes/include.mod_history.php:152 +msgid "No module history available" +msgstr "" + +#: includes/include.js_history.php:171 +msgid "No jscript history available" +msgstr "" + +#: includes/include.js_history.php:179 includes/include.style_history.php:176 +#: includes/include.style_history.php:184 +msgid "No style history available" +msgstr "" + +#: includes/include.mod_translate.php:138 +#, php-format +msgid "Translate module '%s'" +msgstr "" + +#: includes/include.mod_translate.php:147 +msgid "Translated Name" +msgstr "" + +#: includes/include.mod_translate.php:157 +msgid "Original module string" +msgstr "" + +#: includes/include.mod_translate.php:157 +#, php-format +msgid "Translation for %s" +msgstr "" + +#: includes/include.mod_translate.php:165 +msgid "" +"Hint: Hit ALT+SHIFT+S to save the translated entry and advance to the next " +"string." +msgstr "" + +#: includes/include.mod_translate.php:166 +msgid "String list" +msgstr "" + +#: includes/include.mod_package.php:139 +msgid "No elements available" +msgstr "" + +#: includes/include.mod_package.php:188 +msgid "Javascript files" +msgstr "" + +#: includes/include.mod_package.php:189 +msgid "Module template files" +msgstr "" + +#: includes/include.mod_package.php:190 +msgid "Style files" +msgstr "" + +#: includes/include.mod_package.php:191 +#: templates/standard/template.symbolhelp.html:53 +#: templates/standard/template.symbolhelp.html:822 +msgid "Layouts" +msgstr "" + +#: includes/include.mod_package.php:192 +msgid "Translations" +msgstr "" + +#: includes/include.mod_package.php:238 +msgid "Skip" +msgstr "" + +#: includes/include.mod_package.php:238 +msgid "Append" +msgstr "" + +#: includes/include.mod_package.php:238 +msgid "Overwrite" +msgstr "" + +#: includes/include.mod_package.php:239 +msgid "OK" +msgstr "" + +#: includes/include.mod_package.php:240 +msgid "Assign" +msgstr "" + +#: includes/include.mod_package.php:241 +msgid "Conflict" +msgstr "" + +#: includes/include.mod_package.php:242 +msgid "Ignored" +msgstr "" + +#: includes/include.mod_package.php:243 +msgid "- Select -" +msgstr "" + +#: includes/include.mod_package.php:254 +#: templates/standard/template.log_main.html:26 +#: templates/standard/template.log_main.html:51 +msgid "Action" +msgstr "" + +#: includes/include.mod_package.php:311 +#: templates/standard/template.symbolhelp.html:181 +#: scripts/messageBox.js.php:79 scripts/langref.php:21 +msgid "Cancel" +msgstr "" + +#: includes/include.mod_package.php:312 +msgid "Import" +msgstr "" + +#: includes/include.mod_package.php:361 +msgid "Import was not succesful, please check data and try again" +msgstr "" + +#: includes/include.mod_package.php:362 +msgid "Retry" +msgstr "" + +#: includes/include.mod_package.php:366 +msgid "Import succesfully finished" +msgstr "" + +#: includes/include.mod_package.php:367 +msgid "Finish" +msgstr "" + +#: includes/include.mod_package.php:421 +msgid "Edit package" +msgstr "" + +#: includes/include.mod_package.php:442 +msgid "Package GUID" +msgstr "" + +#: includes/include.clientsettings.php:50 +msgid "Select range" +msgstr "" + +#: includes/include.clientsettings.php:53 +msgid "Language independent" +msgstr "" + +#: includes/include.clientsettings.php:79 +msgid "Range" +msgstr "" + +#: includes/include.system_db_backup.php:35 +msgid "Backupfolder missing or not writable!" +msgstr "" + +#: includes/include.system_db_backup.php:54 +msgid "Start your Backup!" +msgstr "" + +#: includes/include.system_db_backup.php:88 +msgid "Permission denied!" +msgstr "" + +#: includes/include.system_db_backup.php:99 +msgid "Starting Backup." +msgstr "" + +#: includes/include.system_db_backup.php:216 +msgid "Backup in Progress!" +msgstr "" + +#: includes/include.system_db_backup.php:223 +#: includes/include.system_db_backup.php:248 +msgid "Tables saved: " +msgstr "" + +#: includes/include.system_db_backup.php:223 +msgid "Last processed: " +msgstr "" + +#: includes/include.system_db_backup.php:224 +#: includes/include.system_db_backup.php:248 +msgid "Pageviews: " +msgstr "" + +#: includes/include.system_db_backup.php:247 +msgid "Backup done!" +msgstr "" + +#: includes/include.system_db_backup.php:252 +msgid "Go Back to Overview" +msgstr "" + +#: includes/include.system_db_backup.php:286 +msgid "File successfully deleted." +msgstr "" + +#: includes/include.system_db_backup.php:301 +msgid "Download File" +msgstr "" + +#: includes/include.upl_artlist.php:66 +msgid "Use this category" +msgstr "" + +#: includes/include.upl_artlist.php:81 +#: templates/standard/template.mycontenido_lastarticles.html:61 +msgid "Start" +msgstr "" + +#: includes/include.upl_artlist.php:81 +#: templates/standard/template.mycontenido_lastarticles.html:65 +msgid "Modified" +msgstr "" + +#: includes/include.upl_artlist.php:81 +msgid "Sort Order" +msgstr "" + +#: includes/include.upl_artlist.php:81 +msgid "Online" +msgstr "" + +#: includes/include.js_left_top.php:50 includes/cfg_language_de.inc.php:206 +msgid "Create script" +msgstr "" + +#: includes/include.stat_menu.php:37 +msgid "Current Report" +msgstr "" + +#: includes/include.stat_menu.php:45 +msgid "Statistics Overview" +msgstr "" + +#: includes/include.stat_menu.php:56 +msgid "Archived Statistics" +msgstr "" + +#: includes/include.con_editcontent.php:215 +msgid "Close editor" +msgstr "" + +#: includes/include.con_editcontent.php:216 +msgid "Close editor and save changes" +msgstr "" + +#: includes/include.con_editcontent.php:217 +msgid "Do you want to save changes?" +msgstr "" + +#: includes/include.con_editcontent.php:375 +msgid "No template assigned to the category
    and/or the article" +msgstr "" + +#: includes/include.con_editcontent.php:376 +msgid "The code for the following article
    couldnt be generated:" +msgstr "" + +#: includes/include.con_editcontent.php:397 +#: includes/include.system_purge.php:195 +#: templates/standard/template.log_main.html:18 +#: templates/standard/template.log_main.html:48 +#: classes/class.navigation.php:340 classes/class.navigation.php:343 +msgid "Client" +msgstr "" + +#: includes/functions.con.php:331 includes/functions.con.php:518 +msgid "Default title" +msgstr "" + +#: includes/include.lay_history.php:87 includes/include.lay_edit_form.php:186 +msgid "Edit Layout" +msgstr "" + +#: includes/include.lay_history.php:137 +msgid "No layout history available" +msgstr "" + +#: includes/include.upl_edit.php:91 +msgid "File name" +msgstr "" + +#: includes/include.upl_edit.php:93 +msgid "Replace file" +msgstr "" + +#: includes/include.upl_edit.php:94 +msgid "Media name" +msgstr "" + +#: includes/include.upl_edit.php:96 +msgid "Keywords" +msgstr "" + +#: includes/include.upl_edit.php:97 +msgid "Internal notes" +msgstr "" + +#: includes/include.upl_edit.php:98 +msgid "Copyright" +msgstr "" + +#: includes/include.upl_edit.php:99 +msgid "Protection" +msgstr "" + +#: includes/include.upl_edit.php:100 +#: templates/standard/template.con_edit_form.html:141 +msgid "Time control" +msgstr "" + +#: includes/include.upl_edit.php:200 +msgid "Protected for non-logged in users" +msgstr "" + +#: includes/include.upl_edit.php:209 +#: templates/standard/template.con_edit_form.html:144 +msgid "Use time control" +msgstr "" + +#: includes/include.upl_edit.php:215 +#: templates/standard/template.con_edit_form.html:146 +#: templates/standard/template.log_main.html:30 +msgid "Start date" +msgstr "" + +#: includes/include.upl_edit.php:313 +#, php-format +msgid "Could not load file %s" +msgstr "" + +#: includes/functions.file.php:206 +msgid "Please insert filename." +msgstr "" + +#: includes/functions.file.php:218 +#, php-format +msgid "Could not open file %s" +msgstr "" + +#: includes/functions.file.php:223 +#, php-format +msgid "Could not write file %s" +msgstr "" + +#: includes/functions.file.php:234 includes/functions.file.php:338 +#, php-format +msgid "%s is not writable" +msgstr "" + +#: includes/functions.file.php:255 +#, php-format +msgid "Can not open file%s " +msgstr "" + +#: includes/functions.file.php:304 +msgid "Unable to change file access permission." +msgstr "" + +#: includes/functions.file.php:308 +#, php-format +msgid "Unable to create file %s" +msgstr "" + +#: includes/functions.file.php:334 +#, php-format +msgid "Can not rename file %s" +msgstr "" + +#: includes/functions.file.php:361 +msgid "Wrong filename." +msgstr "" + +#: includes/include.mycontenido_lastarticles.php:293 +msgid "No article found" +msgstr "" + +#: includes/include.grouprights_overview.php:67 +msgid "Changes couldn't saved" +msgstr "" + +#: includes/include.grouprights_overview.php:112 +msgid "Groupname" +msgstr "" + +#: includes/include.grouprights_overview.php:208 +#: includes/include.rights_overview.php:352 +msgid "Area/Type" +msgstr "" + +#: includes/include.grouprights_overview.php:222 +#: includes/include.rights_overview.php:366 +msgid "User-defined properties" +msgstr "" + +#: includes/include.upl_files_upload.php:51 +msgid "Upload" +msgstr "" + +#: includes/include.upl_files_upload.php:63 +#: includes/cfg_language_de.inc.php:136 includes/cfg_language_de.inc.php:144 +msgid "Upload files" +msgstr "" + +#: includes/include.lay_edit_form.php:46 +msgid "-- New Layout --" +msgstr "" + +#: includes/include.lay_edit_form.php:56 +msgid "Layout deleted" +msgstr "" + +#: includes/include.lay_edit_form.php:128 +#, php-format +msgid "Container %s was defined %s times" +msgstr "" + +#: includes/include.lay_edit_form.php:141 +msgid "" +"The body tag does not exist in the layout. This is a requirement for the in-" +"site editing." +msgstr "" + +#: includes/include.lay_edit_form.php:147 +msgid "" +"The head tag does not exist in the layout. This is a requirement for the in-" +"site editing." +msgstr "" + +#: includes/include.lay_edit_form.php:173 +#: includes/include.html_tpl_edit_form.php:185 +#, php-format +msgid "Tag '%s' %s has no end tag (start tag is on line %s char %s)" +msgstr "" + +#: includes/include.lay_edit_form.php:202 +msgid "On save, apply default modules to new containers" +msgstr "" + +#: includes/include.rights_overview.php:75 +msgid "User deleted" +msgstr "" + +#: includes/include.rights_overview.php:144 +#: includes/include.rights_overview.php:149 +msgid "An error occured while saving user info." +msgstr "" + +#: includes/include.rights_overview.php:236 +#: includes/include.rights_create.php:180 +msgid "Phone number" +msgstr "" + +#: includes/include.rights_overview.php:242 +#: includes/include.rights_create.php:186 +msgid "Street" +msgstr "" + +#: includes/include.rights_overview.php:248 +#: includes/include.rights_create.php:192 +msgid "ZIP code" +msgstr "" + +#: includes/include.rights_overview.php:254 +#: includes/include.rights_create.php:198 +msgid "City" +msgstr "" + +#: includes/include.rights_overview.php:373 +#: includes/include.rights_create.php:269 +msgid "Use WYSIWYG-Editor" +msgstr "" + +#: includes/include.rights_overview.php:398 +#: includes/include.rights_create.php:290 +msgid "Valid from" +msgstr "" + +#: includes/include.rights_overview.php:418 +#: includes/include.rights_create.php:307 +msgid "Valid to" +msgstr "" + +#: includes/include.rights_overview.php:436 +msgid "This account is currently inactive." +msgstr "" + +#: includes/include.rights_overview.php:439 +msgid "This account is currently active." +msgstr "" + +#: includes/include.pretplcfg_edit_form.php:101 +#, php-format +msgid "Module in Container %s" +msgstr "" + +#: includes/include.pretplcfg_edit_form.php:150 +msgid "Template preconfiguration" +msgstr "" + +#: includes/include.mod_overview.php:198 +msgid "Module in use, cannot delete" +msgstr "" + +#: includes/include.mod_overview.php:200 +msgid "Module in filesystem, cannot delete" +msgstr "" + +#: includes/include.mod_overview.php:204 includes/cfg_language_de.inc.php:154 +msgid "Delete module" +msgstr "" + +#: includes/include.mod_overview.php:205 +#, php-format +msgid "Do you really want to delete the following module:

    %s
    " +msgstr "" + +#: includes/include.mod_overview.php:271 +#, php-format +msgid "The module '%s' is used for following templates" +msgstr "" + +#: includes/include.lang_left_top.php:80 includes/cfg_language_de.inc.php:189 +msgid "Create language" +msgstr "" + +#: includes/include.frontend.group.subnav.php:40 includes/main.login.php:210 +msgid "Overview" +msgstr "" + +#: includes/include.frontend.group_edit.php:56 +msgid "-- new group --" +msgstr "" + +#: includes/include.frontend.group_edit.php:121 +msgid "Could not set new group name: Group already exists" +msgstr "" + +#: includes/include.frontend.group_edit.php:227 +msgid "Default group" +msgstr "" + +#: includes/include.frontend.group_edit.php:275 +#: includes/cfg_language_de.inc.php:180 +msgid "Edit group" +msgstr "" + +#: includes/grouprights_members.inc.php:208 +msgid "Manage group members" +msgstr "" + +#: includes/include.style_left_top.php:50 +msgid "Create style" +msgstr "" + +#: includes/main.login.php:67 +msgid "No Login Information available." +msgstr "" + +#: includes/main.login.php:74 +msgid "" +"You're logged in with a temporary password. Please change your password." +msgstr "" + +#: includes/main.login.php:79 +msgid "" +"The setup directory still exists. Please remove the setup directory before " +"you continue." +msgstr "" + +#: includes/main.login.php:95 +msgid "" +"The sysadmin and/or the admin account still contains a well-known default " +"password. Please change immediately." +msgstr "" + +#: includes/main.login.php:109 +msgid "Welcome" +msgstr "" + +#: includes/main.login.php:110 +msgid "Last login" +msgstr "" + +#: includes/main.login.php:128 includes/main.login.php:165 +#, php-format +msgid "Client %s (%s) has no languages" +msgstr "" + +#: includes/main.login.php:148 +msgid "Change client" +msgstr "" + +#: includes/main.login.php:153 +msgid "No clients available!" +msgstr "" + +#: includes/main.login.php:205 +#, php-format +msgid "Reminder list: %d Task open" +msgstr "" + +#: includes/main.login.php:207 +#, php-format +msgid "Reminder list: %d Tasks open" +msgstr "" + +#: includes/main.login.php:238 +msgid "Symbol help" +msgstr "" + +#: includes/main.login.php:241 +msgid "Contenido Manual" +msgstr "" + +#: includes/cfg_language_de.inc.php:99 +msgid "Make category online" +msgstr "" + +#: includes/cfg_language_de.inc.php:100 +msgid "Change template" +msgstr "" + +#: includes/cfg_language_de.inc.php:101 +msgid "Set start article" +msgstr "" + +#: includes/cfg_language_de.inc.php:102 +msgid "Make article online" +msgstr "" + +#: includes/cfg_language_de.inc.php:103 +msgid "Syncronize Category" +msgstr "" + +#: includes/cfg_language_de.inc.php:104 +msgid "Syncronize Article" +msgstr "" + +#: includes/cfg_language_de.inc.php:105 includes/cfg_language_de.inc.php:124 +#: includes/include.str_overview.php:963 includes/include.str_overview.php:965 +#: templates/standard/template.str_overview.html:139 +msgid "Protect category" +msgstr "" + +#: includes/cfg_language_de.inc.php:107 +msgid "Edit template configuration" +msgstr "" + +#: includes/cfg_language_de.inc.php:108 +msgid "Duplicate Article" +msgstr "" + +#: includes/cfg_language_de.inc.php:109 +msgid "Expand boxes" +msgstr "" + +#: includes/cfg_language_de.inc.php:110 backend_search.php:677 +#: templates/standard/template.symbolhelp.html:377 +msgid "Configure template" +msgstr "" + +#: includes/cfg_language_de.inc.php:111 +msgid "Create article" +msgstr "" + +#: includes/cfg_language_de.inc.php:112 +msgid "Configure article" +msgstr "" + +#: includes/cfg_language_de.inc.php:113 +msgid "Save article" +msgstr "" + +#: includes/cfg_language_de.inc.php:115 includes/cfg_language_de.inc.php:117 +msgid "Edit article" +msgstr "" + +#: includes/cfg_language_de.inc.php:116 +msgid "Edit article properties" +msgstr "" + +#: includes/cfg_language_de.inc.php:118 +msgid "Help" +msgstr "" + +#: includes/cfg_language_de.inc.php:120 +#: templates/standard/template.symbolhelp.html:524 +msgid "Rename category" +msgstr "" + +#: includes/cfg_language_de.inc.php:121 +msgid "New category" +msgstr "" + +#: includes/cfg_language_de.inc.php:122 +msgid "Set category on- or offline" +msgstr "" + +#: includes/cfg_language_de.inc.php:123 +msgid "Disable category" +msgstr "" + +#: includes/cfg_language_de.inc.php:125 +msgid "Frontend access" +msgstr "" + +#: includes/cfg_language_de.inc.php:126 +msgid "Delete category" +msgstr "" + +#: includes/cfg_language_de.inc.php:127 +msgid "Move category up" +msgstr "" + +#: includes/cfg_language_de.inc.php:128 +msgid "Move category down" +msgstr "" + +#: includes/cfg_language_de.inc.php:129 +#: templates/standard/template.symbolhelp.html:665 +msgid "Move category" +msgstr "" + +#: includes/cfg_language_de.inc.php:130 +msgid "Create new tree" +msgstr "" + +#: includes/cfg_language_de.inc.php:131 +#: templates/standard/template.symbolhelp.html:701 +msgid "Duplicate category" +msgstr "" + +#: includes/cfg_language_de.inc.php:132 includes/include.str_overview.php:949 +#: includes/include.str_overview.php:952 +#: templates/standard/template.symbolhelp.html:314 +#: templates/standard/template.symbolhelp.html:506 +#: templates/standard/template.str_overview.html:148 +msgid "Configure category" +msgstr "" + +#: includes/cfg_language_de.inc.php:133 +msgid "Edit category" +msgstr "" + +#: includes/cfg_language_de.inc.php:135 includes/cfg_language_de.inc.php:145 +msgid "Create directory" +msgstr "" + +#: includes/cfg_language_de.inc.php:137 +msgid "Delete files" +msgstr "" + +#: includes/cfg_language_de.inc.php:138 +msgid "Remove directory" +msgstr "" + +#: includes/cfg_language_de.inc.php:139 +msgid "Rename directory" +msgstr "" + +#: includes/cfg_language_de.inc.php:140 +msgid "Modify file" +msgstr "" + +#: includes/cfg_language_de.inc.php:141 +msgid "Rename file" +msgstr "" + +#: includes/cfg_language_de.inc.php:142 +msgid "Multidelete Files" +msgstr "" + +#: includes/cfg_language_de.inc.php:148 +msgid "Modify layout" +msgstr "" + +#: includes/cfg_language_de.inc.php:149 +msgid "Create layout" +msgstr "" + +#: includes/cfg_language_de.inc.php:150 includes/cfg_language_de.inc.php:155 +#: includes/cfg_language_de.inc.php:201 includes/cfg_language_de.inc.php:207 +#: includes/cfg_language_de.inc.php:213 +msgid "Manage History" +msgstr "" + +#: includes/cfg_language_de.inc.php:151 includes/cfg_language_de.inc.php:156 +#: includes/cfg_language_de.inc.php:202 includes/cfg_language_de.inc.php:208 +#: includes/cfg_language_de.inc.php:214 +msgid "Truncate History" +msgstr "" + +#: includes/cfg_language_de.inc.php:158 +msgid "Create module" +msgstr "" + +#: includes/cfg_language_de.inc.php:159 +msgid "Import/Export module" +msgstr "" + +#: includes/cfg_language_de.inc.php:160 +msgid "Translate modules" +msgstr "" + +#: includes/cfg_language_de.inc.php:161 +msgid "Translation import/export" +msgstr "" + +#: includes/cfg_language_de.inc.php:162 +msgid "Import/Export package" +msgstr "" + +#: includes/cfg_language_de.inc.php:166 +msgid "Create template" +msgstr "" + +#: includes/cfg_language_de.inc.php:169 +msgid "Visual edit" +msgstr "" + +#: includes/cfg_language_de.inc.php:173 +msgid "Save user area rights" +msgstr "" + +#: includes/cfg_language_de.inc.php:175 +msgid "Edit rights" +msgstr "" + +#: includes/cfg_language_de.inc.php:178 +msgid "Delete group members" +msgstr "" + +#: includes/cfg_language_de.inc.php:179 +msgid "Add group members" +msgstr "" + +#: includes/cfg_language_de.inc.php:184 +msgid "Show statistics" +msgstr "" + +#: includes/cfg_language_de.inc.php:186 includes/include.lang_overview.php:68 +msgid "Activate language" +msgstr "" + +#: includes/cfg_language_de.inc.php:187 includes/include.lang_overview.php:72 +msgid "Deactivate language" +msgstr "" + +#: includes/cfg_language_de.inc.php:188 +msgid "Rename language" +msgstr "" + +#: includes/cfg_language_de.inc.php:190 includes/include.lang_overview.php:78 +msgid "Delete language" +msgstr "" + +#: includes/cfg_language_de.inc.php:193 +msgid "Linkchecker" +msgstr "" + +#: includes/cfg_language_de.inc.php:194 +msgid "Linkchecker Whitelist" +msgstr "" + +#: includes/cfg_language_de.inc.php:196 +msgid "Install/Remove plugins" +msgstr "" + +#: includes/cfg_language_de.inc.php:198 +msgid "Modify CSS" +msgstr "" + +#: includes/cfg_language_de.inc.php:199 +msgid "Create CSS" +msgstr "" + +#: includes/cfg_language_de.inc.php:200 +msgid "Delete CSS" +msgstr "" + +#: includes/cfg_language_de.inc.php:204 +msgid "Edit script" +msgstr "" + +#: includes/cfg_language_de.inc.php:205 +msgid "Delete script" +msgstr "" + +#: includes/cfg_language_de.inc.php:210 +msgid "Modify HTML-Template" +msgstr "" + +#: includes/cfg_language_de.inc.php:211 +msgid "Create HTML-Template" +msgstr "" + +#: includes/cfg_language_de.inc.php:212 +msgid "Delete HTML-Template" +msgstr "" + +#: includes/cfg_language_de.inc.php:216 +msgid "Edit newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:217 +#: templates/standard/template.symbolhelp.html:1279 +msgid "Create newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:218 +msgid "Delete newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:219 +msgid "Duplicate newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:220 +msgid "Add newsletter dispatch job" +msgstr "" + +#: includes/cfg_language_de.inc.php:221 +msgid "Change global HTML newsletter settings" +msgstr "" + +#: includes/cfg_language_de.inc.php:222 +msgid "Send test newsletter (to groups)" +msgstr "" + +#: includes/cfg_language_de.inc.php:223 +msgid "Delete dispatch job" +msgstr "" + +#: includes/cfg_language_de.inc.php:224 +msgid "Remove recipient from dispatch job" +msgstr "" + +#: includes/cfg_language_de.inc.php:225 +msgid "Run job" +msgstr "" + +#: includes/cfg_language_de.inc.php:226 +msgid "View dispatch job details" +msgstr "" + +#: includes/cfg_language_de.inc.php:228 +msgid "Edit recipient" +msgstr "" + +#: includes/cfg_language_de.inc.php:229 +#: templates/standard/template.symbolhelp.html:1373 +msgid "Create recipient" +msgstr "" + +#: includes/cfg_language_de.inc.php:230 +msgid "Delete recipient" +msgstr "" + +#: includes/cfg_language_de.inc.php:231 +msgid "Purge recipients" +msgstr "" + +#: includes/cfg_language_de.inc.php:232 +msgid "Import recipients" +msgstr "" + +#: includes/cfg_language_de.inc.php:233 +msgid "Execute recipients import" +msgstr "" + +#: includes/cfg_language_de.inc.php:234 +msgid "Delete recipient group" +msgstr "" + +#: includes/cfg_language_de.inc.php:235 +#: templates/standard/template.symbolhelp.html:1409 +msgid "Create recipient group" +msgstr "" + +#: includes/cfg_language_de.inc.php:236 +msgid "Delete recipient from group" +msgstr "" + +#: includes/cfg_language_de.inc.php:237 +msgid "Save recipient group" +msgstr "" + +#: includes/cfg_language_de.inc.php:239 +msgid "Edit own MyContenido settings" +msgstr "" + +#: includes/cfg_language_de.inc.php:240 +msgid "Delete reminder item" +msgstr "" + +#: includes/cfg_language_de.inc.php:241 +msgid "Save todo item" +msgstr "" + +#: includes/cfg_language_de.inc.php:244 +msgid "Edit client" +msgstr "" + +#: includes/cfg_language_de.inc.php:245 +msgid "Remove client" +msgstr "" + +#: includes/cfg_language_de.inc.php:246 +msgid "Delete clientsetting" +msgstr "" + +#: includes/cfg_language_de.inc.php:247 +msgid "Edit clientsetting" +msgstr "" + +#: includes/cfg_language_de.inc.php:248 +msgid "Save clientsetting" +msgstr "" + +#: includes/cfg_language_de.inc.php:249 +msgid "Create/Edit articlespecifications" +msgstr "" + +#: includes/cfg_language_de.inc.php:250 +msgid "Delete articlespecifications" +msgstr "" + +#: includes/cfg_language_de.inc.php:251 +msgid "Define default articlespecification" +msgstr "" + +#: includes/cfg_language_de.inc.php:252 +msgid "Edit articlespecifications" +msgstr "" + +#: includes/cfg_language_de.inc.php:253 +msgid "Make articlespecifications online" +msgstr "" + +#: includes/cfg_language_de.inc.php:255 +msgid "Save frontenduser" +msgstr "" + +#: includes/cfg_language_de.inc.php:256 +msgid "Create frontenduser" +msgstr "" + +#: includes/cfg_language_de.inc.php:257 includes/cfg_language_de.inc.php:263 +msgid "Delete frontenduser" +msgstr "" + +#: includes/cfg_language_de.inc.php:258 +msgid "Delete frontendgroup" +msgstr "" + +#: includes/cfg_language_de.inc.php:259 +msgid "Save frontendgroup" +msgstr "" + +#: includes/cfg_language_de.inc.php:260 includes/cfg_language_de.inc.php:261 +msgid "Create frontendgroup" +msgstr "" + +#: includes/cfg_language_de.inc.php:262 +msgid "Add frontendusers" +msgstr "" + +#: includes/cfg_language_de.inc.php:264 +msgid "Save frontendgroup permissions" +msgstr "" + +#: includes/cfg_language_de.inc.php:266 +msgid "Delete system property" +msgstr "" + +#: includes/cfg_language_de.inc.php:267 +msgid "Edit system property" +msgstr "" + +#: includes/cfg_language_de.inc.php:268 +msgid "Save system property" +msgstr "" + +#: includes/cfg_language_de.inc.php:270 +msgid "Empty log" +msgstr "" + +#: includes/cfg_language_de.inc.php:271 +msgid "Edit Systemconfigration" +msgstr "" + +#: includes/cfg_language_de.inc.php:272 +msgid "Do system purge" +msgstr "" + +#: includes/cfg_language_de.inc.php:274 +msgid "Show log" +msgstr "" + +#: includes/cfg_language_de.inc.php:276 main.loginform.php:159 +msgid "Login" +msgstr "" + +#: includes/cfg_language_de.inc.php:277 +msgid "Request password?" +msgstr "" + +#: includes/cfg_language_de.inc.php:279 +msgid "Delete note" +msgstr "" + +#: includes/cfg_language_de.inc.php:280 +msgid "Save note" +msgstr "" + +#: includes/cfg_language_de.inc.php:282 +msgid "Send mail" +msgstr "" + +#: includes/cfg_language_de.inc.php:283 +msgid "Fake permissions" +msgstr "" + +#: includes/include.style_history.php:126 +msgid "Edit Style" +msgstr "" + +#: includes/include.frontend.left_top.php:141 +msgid "Frontend users" +msgstr "" + +#: includes/include.frontend.left_top.php:148 +msgid "Frontend groups" +msgstr "" + +#: includes/include.frontend.left_top.php:261 +msgid "Show group" +msgstr "" + +#: includes/include.frontend.left_top.php:269 includes/include.mod_new.php:173 +msgid "Search in" +msgstr "" + +#: includes/include.mod_new.php:69 +msgid "New module" +msgstr "" + +#: includes/include.mod_new.php:72 +msgid "Sync module" +msgstr "" + +#: includes/include.mod_new.php:97 includes/include.mod_new.php:107 +#: includes/include.mod_new.php:127 +msgid "-- All --" +msgstr "" + +#: includes/include.mod_new.php:108 +msgid "Modulname" +msgstr "" + +#: includes/include.mod_new.php:128 +msgid "-- Without type --" +msgstr "" + +#: includes/include.mod_new.php:165 +msgid "Type filter" +msgstr "" + +#: includes/functions.lang.php:119 +msgid "" +"Could not set the language-ID in the file 'config.php'. Please set the " +"language manually." +msgstr "" + +#: includes/functions.lang.php:591 +msgid "Could not delete language" +msgstr "" + +#: includes/include.str_overview.php:511 +#, php-format +msgid "" +"Do you really want to duplicate the following category:

    %s

    Notice: The duplicate process can take up to several minutes, " +"depending on how many subitems and articles you've got." +msgstr "" + +#: includes/include.str_overview.php:513 +#, php-format +msgid "Do you really want to delete the following category:

    %s" +msgstr "" + +#: includes/include.str_overview.php:920 +msgid "Create new category" +msgstr "" + +#: includes/include.str_overview.php:993 +#, php-format +msgid "Cancel moving %s" +msgstr "" + +#: includes/include.html_tpl_left_top.php:50 +msgid "Create module template" +msgstr "" + +#: includes/include.lang_overview.php:77 +#, php-format +msgid "Do you really want to delete the language %s?" +msgstr "" + +#: includes/include.lang_overview.php:118 +msgid "Language deleted" +msgstr "" + +#: includes/include.system_sysvalues.php:79 +#: includes/include.system_sysvalues.php:123 +msgid "No error log entries found" +msgstr "" + +#: includes/include.system_sysvalues.php:83 +msgid "No error log file found" +msgstr "" + +#: includes/include.system_sysvalues.php:116 +msgid "No install error log entries found" +msgstr "" + +#: includes/include.frontend.group_menu.php:51 +msgid "Delete frontend group" +msgstr "" + +#: includes/include.frontend.group_menu.php:52 +#, php-format +msgid "Do you really want to delete the following frontend group:
    %s" +msgstr "" + +#: includes/include.rights_create.php:53 +msgid "Username can't be empty" +msgstr "" + +#: includes/include.rights_create.php:85 +msgid "User created" +msgstr "" + +#: includes/include.rights_create.php:106 +msgid "Username already exists" +msgstr "" + +#: includes/include.rights_create.php:110 +msgid "Unknown error" +msgstr "" + +#: includes/functions.mod.php:200 +msgid "Please do not use short open Tags. (Use
    %s
    " +msgstr "" + +#: includes/include.note.popup.php:63 +msgid "Add note" +msgstr "" + +#: includes/include.note.popup.php:75 +msgid "No category" +msgstr "" + +#: includes/include.note.popup.php:92 +msgid "Note" +msgstr "" + +#: includes/functions.lay.php:66 +msgid "-- Unnamed Layout --" +msgstr "" + +#: includes/include.system_purge.php:79 includes/include.system_purge.php:87 +#: includes/include.system_purge.php:95 includes/include.system_purge.php:103 +#: includes/include.system_purge.php:112 +msgid "Client " +msgstr "" + +#: includes/include.system_purge.php:80 includes/include.system_purge.php:128 +#: includes/include.system_purge.php:135 +#, php-format +msgid "The entries of %s table are not deleted!" +msgstr "" + +#: includes/include.system_purge.php:88 +#, php-format +msgid "The %s is not updated!" +msgstr "" + +#: includes/include.system_purge.php:96 +msgid "The cache is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:104 +msgid "The log is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:113 +msgid "The history is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:143 +msgid "The contenido log is not cleaned!" +msgstr "" + +#: includes/include.system_purge.php:150 +msgid "The contenido cache is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:157 +msgid "The contenido cronjobs are not cleaned!" +msgstr "" + +#: includes/include.system_purge.php:164 +msgid "Update of sequence table not completed!" +msgstr "" + +#: includes/include.system_purge.php:169 +msgid "The changes were successfully executed." +msgstr "" + +#: includes/include.system_purge.php:171 +msgid "The changes were not all successfully completed." +msgstr "" + +#: includes/include.system_purge.php:190 includes/include.system_purge.php:214 +msgid "System purge" +msgstr "" + +#: includes/include.system_purge.php:191 +msgid "No Client selected!" +msgstr "" + +#: includes/include.system_purge.php:196 +msgid "all clients" +msgstr "" + +#: includes/include.system_purge.php:197 +msgid "from list" +msgstr "" + +#: includes/include.system_purge.php:198 +msgid "Select clients" +msgstr "" + +#: includes/include.system_purge.php:199 includes/include.system_purge.php:201 +#: includes/include.system_purge.php:209 +#, php-format +msgid "Reset the table %s" +msgstr "" + +#: includes/include.system_purge.php:200 +#, php-format +msgid "Activate the code generation in %s" +msgstr "" + +#: includes/include.system_purge.php:202 +msgid "Clear client cache" +msgstr "" + +#: includes/include.system_purge.php:203 +msgid "Clear client log file" +msgstr "" + +#: includes/include.system_purge.php:204 +msgid "Clear client history" +msgstr "" + +#: includes/include.system_purge.php:205 +msgid "Keep last histories" +msgstr "" + +#: includes/include.system_purge.php:207 +msgid "Contenido" +msgstr "" + +#: includes/include.system_purge.php:208 +msgid "Clear contenido log file" +msgstr "" + +#: includes/include.system_purge.php:210 +msgid "Clear contenido cache" +msgstr "" + +#: includes/include.system_purge.php:211 +msgid "Reset cronjobs" +msgstr "" + +#: includes/include.system_purge.php:212 +msgid "Update sequence table" +msgstr "" + +#: includes/include.system_purge.php:215 +msgid "These changes can not be cancelled." +msgstr "" + +#: includes/include.system_purge.php:215 +msgid "Do you really want to complete it?" +msgstr "" + +#: includes/include.system_purge.php:220 +msgid "No action selected!" +msgstr "" + +#: includes/include.system_purge.php:222 +msgid "Send" +msgstr "" + +#: backend_search.php:328 +msgid "Thank you for saving this search from extinction !" +msgstr "" + +#: backend_search.php:490 +msgid "Search results" +msgstr "" + +#: backend_search.php:506 +msgid "Missing search value." +msgstr "" + +#: backend_search.php:507 backend_search.php:734 +msgid "No article found." +msgstr "" + +#: backend_search.php:672 +msgid "Reminder" +msgstr "" + +#: backend_search.php:674 classes/class.todo.php:158 +#: classes/class.todo.php:161 +msgid "Set reminder / add to todo list" +msgstr "" + +#: backend_search.php:679 +msgid "Do you really want to delete following article" +msgstr "" + +#: backend_search.php:765 +msgid "Search Name" +msgstr "" + +#: backend_search.php:767 +msgid "Store" +msgstr "" + +#: backend_search.php:772 +msgid "Save this Search" +msgstr "" + +#: external/backendedit/front_content.php:331 +#: external/backendedit/front_content.php:386 +#: external/frontend/front_content.php:348 +#: external/frontend/front_content.php:396 +msgid "No start article for this category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:23 +msgid "Table of contents" +msgstr "" + +#: templates/standard/template.symbolhelp.html:29 +#: templates/standard/template.symbolhelp.html:135 +msgid "Common" +msgstr "" + +#: templates/standard/template.symbolhelp.html:35 +#: templates/standard/template.symbolhelp.html:277 +msgid "Content" +msgstr "" + +#: templates/standard/template.symbolhelp.html:44 +#: templates/standard/template.symbolhelp.html:740 +msgid "File management" +msgstr "" + +#: templates/standard/template.symbolhelp.html:50 +#: templates/standard/template.symbolhelp.html:816 +msgid "Style" +msgstr "" + +#: templates/standard/template.symbolhelp.html:56 +#: templates/standard/template.symbolhelp.html:904 +msgid "Modules" +msgstr "" + +#: templates/standard/template.symbolhelp.html:59 +#: templates/standard/template.symbolhelp.html:985 +msgid "Templates" +msgstr "" + +#: templates/standard/template.symbolhelp.html:62 +#: templates/standard/template.symbolhelp.html:1055 +msgid "CSS editor" +msgstr "" + +#: templates/standard/template.symbolhelp.html:65 +#: templates/standard/template.symbolhelp.html:1110 +msgid "Script editor" +msgstr "" + +#: templates/standard/template.symbolhelp.html:68 +#: templates/standard/template.symbolhelp.html:1165 +msgid "Module Templates" +msgstr "" + +#: templates/standard/template.symbolhelp.html:74 +#: templates/standard/template.symbolhelp.html:1242 +msgid "Extras" +msgstr "" + +#: templates/standard/template.symbolhelp.html:77 +#: templates/standard/template.symbolhelp.html:1248 +msgid "Newsletter" +msgstr "" + +#: templates/standard/template.symbolhelp.html:80 +msgid "Recipients" +msgstr "" + +#: templates/standard/template.symbolhelp.html:86 +#: templates/standard/template.symbolhelp.html:1466 +msgid "Statistics" +msgstr "" + +#: templates/standard/template.symbolhelp.html:95 +#: templates/standard/template.symbolhelp.html:1548 +msgid "Administration" +msgstr "" + +#: templates/standard/template.symbolhelp.html:98 +#: templates/standard/template.symbolhelp.html:1554 +msgid "Users" +msgstr "" + +#: templates/standard/template.symbolhelp.html:101 +#: templates/standard/template.symbolhelp.html:1609 +msgid "Groups" +msgstr "" + +#: templates/standard/template.symbolhelp.html:104 +#: templates/standard/template.symbolhelp.html:1664 +msgid "Languages" +msgstr "" + +#: templates/standard/template.symbolhelp.html:107 +#: templates/standard/template.symbolhelp.html:1734 +msgid "Clients" +msgstr "" + +#: templates/standard/template.symbolhelp.html:129 +msgid "Table of Contents" +msgstr "" + +#: templates/standard/template.symbolhelp.html:166 +msgid "Execute query / Save" +msgstr "" + +#: templates/standard/template.symbolhelp.html:196 +#: classes/class.request.password.php:247 +msgid "Submit" +msgstr "" + +#: templates/standard/template.symbolhelp.html:208 +msgid "Change to MyContenido (Personal Settings)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:220 +msgid "Information (Impressum)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:235 +msgid "Logout" +msgstr "" + +#: templates/standard/template.symbolhelp.html:341 +msgid "Article is start article / is not start article" +msgstr "" + +#: templates/standard/template.symbolhelp.html:353 +#: templates/standard/template.symbolhelp.html:868 +#: templates/standard/template.symbolhelp.html:949 +msgid "Set template / Add to To-Do list" +msgstr "" + +#: templates/standard/template.symbolhelp.html:365 +msgid "Configure article properties" +msgstr "" + +#: templates/standard/template.symbolhelp.html:389 +msgid "Element is online / offline (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:401 +msgid "Element is protected / accessible (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:439 +msgid "Lock / unlock folder (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:451 +msgid "Set folder offline / online (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:542 +msgid "Create category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:560 +msgid "Set category online / offline" +msgstr "" + +#: templates/standard/template.symbolhelp.html:578 +msgid "Category is online and unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:596 +msgid "Category is offline and unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:614 +msgid "Category is online, contains an error and is unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:632 +msgid "Category is offline, contains an error and is unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:650 +msgid "Move up one category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:683 +msgid "Select move target" +msgstr "" + +#: templates/standard/template.symbolhelp.html:716 +#: templates/standard/template.symbolhelp.html:880 +#: templates/standard/template.symbolhelp.html:961 +#: templates/standard/template.symbolhelp.html:1031 +#: templates/standard/template.symbolhelp.html:1086 +#: templates/standard/template.symbolhelp.html:1141 +#: templates/standard/template.symbolhelp.html:1196 +#: templates/standard/template.symbolhelp.html:1306 +#: templates/standard/template.symbolhelp.html:1421 +#: templates/standard/template.symbolhelp.html:1585 +#: templates/standard/template.symbolhelp.html:1640 +#: templates/standard/template.symbolhelp.html:1710 +#: templates/standard/template.symbolhelp.html:1765 +#: templates/standard/template.symbolhelp.html:1871 +msgid "Delete / Delete not available" +msgstr "" + +#: templates/standard/template.symbolhelp.html:762 +msgid "Root upload folder" +msgstr "" + +#: templates/standard/template.symbolhelp.html:780 +msgid "Regular folder" +msgstr "" + +#: templates/standard/template.symbolhelp.html:853 +msgid "Layout in use" +msgstr "" + +#: templates/standard/template.symbolhelp.html:934 +msgid "Module in use" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1294 +msgid "Copy newsletter" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1330 +#: templates/standard/template.symbolhelp.html:1361 +msgid "Recipient" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1385 +msgid "Remove recipient" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1397 +msgid "Recipient group" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1503 +msgid "Article is online / offline" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1695 +msgid "Language active / not active" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1823 +#: templates/standard/template.log_main.html:22 +#: templates/standard/template.log_main.html:50 +#: classes/class.navigation.php:360 +msgid "User" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1847 +msgid "User group" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1859 +msgid "Create user group" +msgstr "" + +#: templates/standard/template.info.html:15 +msgid "Concept and Implementation" +msgstr "" + +#: templates/standard/template.info.html:15 +msgid "Germany" +msgstr "" + +#: templates/standard/template.info.html:15 +msgid "Phone" +msgstr "" + +#: templates/standard/template.system_variables.html:16 +msgid "Your system configuration" +msgstr "" + +#: templates/standard/template.system_variables.html:21 +msgid "Variable" +msgstr "" + +#: templates/standard/template.system_variables.html:22 +msgid "Local value" +msgstr "" + +#: templates/standard/template.system_variables.html:37 +msgid "Contenido Error Log" +msgstr "" + +#: templates/standard/template.system_variables.html:50 +msgid "clear error log" +msgstr "" + +#: templates/standard/template.system_variables.html:58 +msgid "Contenido Upgrade Error Log" +msgstr "" + +#: templates/standard/template.system_variables.html:72 +msgid "clear upgrade error log" +msgstr "" + +#: templates/standard/template.rights_inc.html:24 +msgid "Client / Language" +msgstr "" + +#: templates/standard/template.str_overview.html:157 +msgid "Category is a tree" +msgstr "" + +#: templates/standard/template.str_overview.html:164 +msgid "Position of category" +msgstr "" + +#: templates/standard/template.con_edit_form.html:153 +msgid "When expired, move to category" +msgstr "" + +#: templates/standard/template.con_edit_form.html:155 +msgid "Make online after move" +msgstr "" + +#: templates/standard/template.con_edit_form.html:184 +msgid "Page title" +msgstr "" + +#: templates/standard/template.con_edit_form.html:190 +msgid "Meta tags" +msgstr "" + +#: templates/standard/template.mycontenido_lastarticles.html:35 +msgid "Your clients" +msgstr "" + +#: templates/standard/template.mycontenido_lastarticles.html:67 +#: classes/class.notification.php:126 +msgid "Info" +msgstr "" + +#: templates/standard/template.welcome.html:22 +msgid "Available clients" +msgstr "" + +#: templates/standard/template.welcome.html:42 +msgid "Currently" +msgstr "" + +#: templates/standard/template.welcome.html:42 +msgid "Users online" +msgstr "" + +#: templates/standard/template.welcome.html:50 +msgid "Contact System Administrators" +msgstr "" + +#: templates/standard/template.upl_files_overview.html:61 +msgid "Sort files" +msgstr "" + +#: templates/standard/template.upl_files_overview.html:82 +#: classes/class.cms_filelist.php:438 +msgid "Filename" +msgstr "" + +#: templates/standard/template.upl_files_overview.html:86 +#: classes/class.cms_filelist.php:441 +msgid "File size" +msgstr "" + +#: templates/standard/template.upl_files_overview.html:88 +msgid "Image size" +msgstr "" + +#: templates/standard/template.recipient_menu.html:88 +#: templates/standard/template.log_main.html:38 +msgid "Limit" +msgstr "" + +#: templates/standard/template.log_main.html:14 +#: classes/class.cms_filelist.php:722 +msgid "Filter" +msgstr "" + +#: templates/standard/template.log_main.html:49 +msgid "Date" +msgstr "" + +#: cronjobs/send_reminder.php:97 +#, php-format +msgid "" +"Hello %s,\n" +"\n" +"you've got a new reminder for the client '%s' at\n" +"%s:\n" +"\n" +"%s" +msgstr "" + +#: main.loginform.php:70 +msgid "" +"Contenido is in maintenance mode. Only sysadmins are allowed to login. " +"Please try again later." +msgstr "" + +#: main.loginform.php:158 +msgid "ConLite Backend" +msgstr "" + +#: main.loginform.php:169 +msgid "Invalid Login or Password!" +msgstr "" + +#: main.loginform.php:176 +msgid "Password" +msgstr "" + +#: classes/class.versionFile.php:131 +msgid "Can not open file " +msgstr "" + +#: classes/class.request.password.php:251 +msgid "Please enter your login" +msgstr "" + +#: classes/class.request.password.php:257 +msgid "Hide request" +msgstr "" + +#: classes/class.request.password.php:301 +#, php-format +msgid "Password requests are allowed every %s minutes." +msgstr "" + +#: classes/class.request.password.php:309 +#: classes/class.request.password.php:322 +msgid "No matching data found. Please contact your systemadministrator." +msgstr "" + +#: classes/class.request.password.php:315 +msgid "New password was submitted to your e-mail address." +msgstr "" + +#: classes/class.request.password.php:358 +#, php-format +msgid "" +"Dear Contenidouser %s,\n" +"\n" +"Your password to log in Content Management System Contenido is: %s\n" +"\n" +"Best regards\n" +"\n" +"Your Contenido sysadmin" +msgstr "" + +#: classes/class.request.password.php:374 +msgid "Your new password for Contenido Backend" +msgstr "" + +#: classes/class.notification.php:114 scripts/langref.php:14 +#: scripts/articleObject.js.php:228 scripts/articleObject.js.php:231 +msgid "Error" +msgstr "" + +#: classes/class.notification.php:120 +msgid "Warning" +msgstr "" + +#: classes/class.notification.php:133 +msgid "Notification" +msgstr "" + +#: classes/widgets/class.widgets.datawidgets.php:314 +#: classes/widgets/class.widgets.datawidgets.php:315 +msgid "Clear contents" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:47 +#: classes/widgets/class.widgets.pager.php:51 +msgid "Paging" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:85 +msgid "First page" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:92 +msgid "Previous page" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:106 +#, php-format +msgid "Page %s" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:122 +msgid "Next page" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:132 +msgid "Last page" +msgstr "" + +#: classes/con2con/class.filehandler.php:451 +msgid "Wrong file name." +msgstr "" + +#: classes/con2con/class.filehandler.php:467 +msgid "Please insert file name." +msgstr "" + +#: classes/class.cms_teaser.php:386 +msgid "Block Style" +msgstr "" + +#: classes/class.cms_teaser.php:389 +msgid "Blog Style" +msgstr "" + +#: classes/class.cms_teaser.php:451 +msgid "Scaled" +msgstr "" + +#: classes/class.cms_teaser.php:454 +msgid "Cropped" +msgstr "" + +#: classes/class.cms_teaser.php:480 +msgid "Sort Sequence" +msgstr "" + +#: classes/class.cms_teaser.php:483 +msgid "Creationdate" +msgstr "" + +#: classes/class.cms_teaser.php:486 +msgid "Publisheddate" +msgstr "" + +#: classes/class.cms_teaser.php:489 +msgid "Modificationdate" +msgstr "" + +#: classes/class.cms_teaser.php:578 +msgid "Teasersettings" +msgstr "" + +#: classes/class.cms_teaser.php:579 +msgid "Teasertitle" +msgstr "" + +#: classes/class.cms_teaser.php:580 +msgid "Teaser Startarticle" +msgstr "" + +#: classes/class.cms_teaser.php:581 +msgid "Sourcecategory" +msgstr "" + +#: classes/class.cms_teaser.php:582 +msgid "Number of Articles" +msgstr "" + +#: classes/class.cms_teaser.php:583 classes/class.cms_filelist.php:724 +msgid "General Settings" +msgstr "" + +#: classes/class.cms_teaser.php:584 +msgid "Teaser Style" +msgstr "" + +#: classes/class.cms_teaser.php:585 +msgid "Advanced Teaser Settings" +msgstr "" + +#: classes/class.cms_teaser.php:586 +msgid "Teaser Filter" +msgstr "" + +#: classes/class.cms_teaser.php:587 +msgid "Teaser Sort" +msgstr "" + +#: classes/class.cms_teaser.php:589 +msgid "Source Headline" +msgstr "" + +#: classes/class.cms_teaser.php:590 +msgid "Source Settings" +msgstr "" + +#: classes/class.cms_teaser.php:591 +msgid "Source Text" +msgstr "" + +#: classes/class.cms_teaser.php:592 +msgid "Source Image" +msgstr "" + +#: classes/class.cms_teaser.php:593 +msgid "Source Date" +msgstr "" + +#: classes/class.cms_teaser.php:598 classes/class.cms_filelist.php:720 +msgid "General" +msgstr "" + +#: classes/class.cms_teaser.php:599 +msgid "Advanced" +msgstr "" + +#: classes/class.cms_teaser.php:600 classes/class.cms_filelist.php:721 +msgid "Manual" +msgstr "" + +#: classes/class.cms_teaser.php:601 +msgid "Included Articles" +msgstr "" + +#: classes/class.cms_teaser.php:602 +msgid "Add Article" +msgstr "" + +#: classes/class.cms_teaser.php:603 +msgid "Manual Teaser Settings" +msgstr "" + +#: classes/class.cms_teaser.php:604 +msgid "Manual Teaser" +msgstr "" + +#: classes/class.cms_teaser.php:607 +msgid "Size Settings" +msgstr "" + +#: classes/class.cms_teaser.php:608 +msgid "Characterlength" +msgstr "" + +#: classes/class.cms_teaser.php:609 +msgid "Imagewidth" +msgstr "" + +#: classes/class.cms_teaser.php:610 +msgid "Imageheight" +msgstr "" + +#: classes/class.cms_teaser.php:611 +msgid "Image Scale" +msgstr "" + +#: classes/class.cms_teaser.php:648 +msgid "Add" +msgstr "" + +#: classes/class.ajax.php:111 classes/class.ajax.php:135 +#: classes/class.ajax.php:185 +msgid "No data found!" +msgstr "" + +#: classes/class.ajax.php:160 +msgid "idcat" +msgstr "" + +#: classes/class.ajax.php:161 classes/class.ajax.php:178 +msgid "idlang" +msgstr "" + +#: classes/class.ajax.php:177 +msgid "idart" +msgstr "" + +#: classes/class.cms_date.php:212 +msgid "Please Choose Format" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:165 +msgid "Saturday" +msgstr "" + +#: classes/class.version.php:199 +#, php-format +msgid "Alternative path %s does not exist. Version was saved in frondendpath." +msgstr "" + +#: classes/class.version.php:538 +msgid "Clear layout history" +msgstr "" + +#: classes/class.version.php:539 +msgid "Do you really want to clear layout history?" +msgstr "" + +#: classes/class.version.php:539 +msgid "Note: This only affects the current layout." +msgstr "" + +#: classes/class.version.php:542 +msgid "Clear module history" +msgstr "" + +#: classes/class.version.php:543 +msgid "Do you really want to clear module history?" +msgstr "" + +#: classes/class.version.php:543 +msgid "Note: This only affects the current module." +msgstr "" + +#: classes/class.version.php:546 +msgid "Clear style history" +msgstr "" + +#: classes/class.version.php:547 +msgid "Do you really want to clear style history?" +msgstr "" + +#: classes/class.version.php:547 +msgid "Note: This only affects the current style." +msgstr "" + +#: classes/class.version.php:550 +msgid "Clear Java-Script history" +msgstr "" + +#: classes/class.version.php:551 +msgid "Do you really want to clear Java-Script history?" +msgstr "" + +#: classes/class.version.php:551 +msgid "Note: This only affects the current Java-Script." +msgstr "" + +#: classes/class.version.php:554 +msgid "Clear HTML-Template history" +msgstr "" + +#: classes/class.version.php:555 +msgid "Do you really want to clear HTML-Template history?" +msgstr "" + +#: classes/class.version.php:555 +msgid "Note: This only the affects current HTML-Template." +msgstr "" + +#: classes/class.version.php:558 +msgid "Clear history" +msgstr "" + +#: classes/class.version.php:559 +msgid "Do you really want to clear history?" +msgstr "" + +#: classes/class.version.php:559 +msgid "Note: This only affects the current history." +msgstr "" + +#: classes/class.conuser.php:842 classes/class.conuser.php:867 +#, php-format +msgid "" +"Please use at least %d lower and upper case characters in your password!" +msgstr "" + +#: classes/class.conuser.php:847 +#, php-format +msgid "Please use at least %d numbers in your password!" +msgstr "" + +#: classes/class.conuser.php:852 +#, php-format +msgid "Please use at least %d symbols in your password!" +msgstr "" + +#: classes/class.conuser.php:857 +#, php-format +msgid "Password is too short! Please use at least %d signs." +msgstr "" + +#: classes/class.conuser.php:863 +msgid "Password does not contain enough different characters." +msgstr "" + +#: classes/class.conuser.php:872 +msgid "Please choose a more secure password!" +msgstr "" + +#: classes/class.update.notifier.php:422 classes/class.update.notifier.php:427 +msgid "Unable to check for new updates!" +msgstr "" + +#: classes/class.update.notifier.php:422 +msgid "Could not handle server response!" +msgstr "" + +#: classes/class.update.notifier.php:427 +msgid "Could not determine vendor version!" +msgstr "" + +#: classes/class.update.notifier.php:540 +msgid "Unable to check for updates!" +msgstr "" + +#: classes/class.update.notifier.php:541 +#, php-format +msgid "Connection to %s failed!" +msgstr "" + +#: classes/class.update.notifier.php:646 +msgid "Disable update notification" +msgstr "" + +#: classes/class.update.notifier.php:648 classes/class.update.notifier.php:660 +msgid "Disable notification" +msgstr "" + +#: classes/class.update.notifier.php:651 +msgid "Enable update notification (recommended)" +msgstr "" + +#: classes/class.update.notifier.php:653 classes/class.update.notifier.php:667 +msgid "Enable notification" +msgstr "" + +#: classes/class.update.notifier.php:658 +msgid "Disable RSS notification" +msgstr "" + +#: classes/class.update.notifier.php:665 +msgid "Enable RSS notification (recommended)" +msgstr "" + +#: classes/class.update.notifier.php:669 +msgid "RSS notification is disabled" +msgstr "" + +#: classes/class.update.notifier.php:718 +msgid "read more" +msgstr "" + +#: classes/class.update.notifier.php:728 classes/class.update.notifier.php:737 +msgid "No RSS content available" +msgstr "" + +#: classes/class.update.notifier.php:735 classes/class.update.notifier.php:753 +msgid "" +"Your webserver does not have write permissions for the directory /contenido/" +"cache/!" +msgstr "" + +#: classes/class.update.notifier.php:756 +msgid "" +"Update notification is disabled! For actual update information, please " +"activate." +msgstr "" + +#: classes/class.update.notifier.php:761 +msgid "You have an unknown or unsupported version of ConLite!" +msgstr "" + +#: classes/class.update.notifier.php:764 +#, php-format +msgid "" +"Your version of ConLite is deprecated and not longer supported for any " +"updates. Please update to a higher version!
    Download now!" +msgstr "" + +#: classes/class.update.notifier.php:768 +#, php-format +msgid "" +"A new version of ConLite is available!
    Download %s now!" +msgstr "" + +#: classes/class.update.notifier.php:771 +#, php-format +msgid "" +"It seems to be that your version string was manipulated. ConLite %s does not " +"exist!" +msgstr "" + +#: classes/class.update.notifier.php:774 +msgid "Your version of ConLite is up to date!" +msgstr "" + +#: classes/template/class.template.php:332 +msgid "\"" +msgstr "" + +#: classes/contenido/class.layout.php:179 +msgid "" +"Layout uses LayFromFile. Editing and Saving may not be possible in backend." +msgstr "" + +#: classes/contenido/class.client.php:97 classes/class.client.php:131 +msgid "No client" +msgstr "" + +#: classes/contenido/class.module.php:916 +msgid "" +"Using old CamelCase for name of modulefolder. You may lowercase the name for " +"modulefolder" +msgstr "" + +#: classes/contenido/class.module.php:919 +msgid "" +"Module uses Output- and/or InputFromFile. Editing and Saving may not be " +"possible in backend." +msgstr "" + +#: classes/class.todo.php:101 +msgid "New" +msgstr "" + +#: classes/class.todo.php:102 +msgid "In progress" +msgstr "" + +#: classes/class.todo.php:103 +msgid "Done" +msgstr "" + +#: classes/class.todo.php:104 +msgid "Waiting for action" +msgstr "" + +#: classes/class.todo.php:105 +msgid "Deferred" +msgstr "" + +#: classes/class.todo.php:113 +msgid "Low" +msgstr "" + +#: classes/class.todo.php:114 +msgid "Medium" +msgstr "" + +#: classes/class.todo.php:115 +msgid "High" +msgstr "" + +#: classes/class.todo.php:116 +msgid "Immediately" +msgstr "" + +#: classes/class.navigation.php:435 +msgid "-- No Language available --" +msgstr "" + +#: classes/class.note.php:331 classes/class.note.php:334 +msgid "View notes / add note" +msgstr "" + +#: classes/class.inuse.php:242 +msgid "Click here if you want to override the lock" +msgstr "" + +#: classes/class.inuse.php:246 +msgid "Do you really want to override the lock?" +msgstr "" + +#: classes/class.inuse.php:248 +msgid "Override lock" +msgstr "" + +#: classes/class.inuse.php:248 +msgid "Hide notification" +msgstr "" + +#: classes/class.cms_filelist.php:413 +msgid "Default Style" +msgstr "" + +#: classes/class.cms_filelist.php:719 +msgid "Directories" +msgstr "" + +#: classes/class.cms_filelist.php:725 +msgid "Manual Settings" +msgstr "" + +#: classes/class.cms_filelist.php:726 +msgid "Filter settings" +msgstr "" + +#: classes/class.cms_filelist.php:727 +msgid "File list settings" +msgstr "" + +#: classes/class.cms_filelist.php:728 +msgid "File list title" +msgstr "" + +#: classes/class.cms_filelist.php:729 +msgid "File size limit" +msgstr "" + +#: classes/class.cms_filelist.php:730 +msgid "Creation date limit" +msgstr "" + +#: classes/class.cms_filelist.php:731 +msgid "Modify date limit" +msgstr "" + +#: classes/class.cms_filelist.php:733 +msgid "File list style" +msgstr "" + +#: classes/class.cms_filelist.php:734 +msgid "Source directory" +msgstr "" + +#: classes/class.cms_filelist.php:735 +msgid "Include subdirectories?" +msgstr "" + +#: classes/class.cms_filelist.php:736 +msgid "Include meta data?" +msgstr "" + +#: classes/class.cms_filelist.php:737 +msgid "File list sort" +msgstr "" + +#: classes/class.cms_filelist.php:739 +msgid "Displayed file extensions" +msgstr "" + +#: classes/class.cms_filelist.php:740 +msgid "Ignore selection (use all)" +msgstr "" + +#: classes/class.cms_filelist.php:741 +msgid "Selection will be ignored!" +msgstr "" + +#: classes/class.cms_filelist.php:742 +msgid "Select all entries" +msgstr "" + +#: classes/class.cms_filelist.php:743 +msgid "Use manual file list?" +msgstr "" + +#: classes/class.cms_filelist.php:744 +msgid "Directory" +msgstr "" + +#: classes/class.cms_filelist.php:746 +msgid "Files" +msgstr "" + +#: classes/class.cms_filelist.php:747 +msgid "Existing files" +msgstr "" + +#: classes/class.cms_filelist.php:748 +msgid "Add file" +msgstr "" + +#: classes/class.cms_filelist.php:749 +msgid "File count" +msgstr "" + +#: scripts/HTMLObj.js.php:248 scripts/langref.php:10 +msgid "Protect" +msgstr "" + +#: scripts/HTMLObj.js.php:251 scripts/langref.php:11 +msgid "Remove protection" +msgstr "" + +#: scripts/messageBox.js.php:78 scripts/langref.php:20 +msgid "Confirm" +msgstr "" + +#: scripts/messageBox.js.php:80 scripts/langref.php:22 +msgid "Close window" +msgstr "" + +#: scripts/rights.js.php:67 scripts/rights.js.php:70 scripts/langref.php:23 +#: scripts/iZoom.js.php:70 scripts/iZoom.js.php:73 +msgid "Click to close" +msgstr "" + +#: scripts/langref.php:13 scripts/articleObject.js.php:248 +msgid "Overview cannot be displayed" +msgstr "" + +#: scripts/langref.php:15 scripts/articleObject.js.php:274 +msgid "Article can't be displayed" +msgstr "" + +#: scripts/langref.php:16 scripts/articleObject.js.php:274 +#: scripts/articleObject.js.php:305 scripts/articleObject.js.php:335 +#: scripts/articleObject.js.php:360 scripts/articleObject.js.php:379 +msgid "No article was selected" +msgstr "" + +#: scripts/langref.php:17 scripts/articleObject.js.php:305 +msgid "Template configuration can't be displayed" +msgstr "" + +#: scripts/langref.php:18 scripts/articleObject.js.php:257 +#: scripts/articleObject.js.php:290 scripts/articleObject.js.php:319 +#: scripts/articleObject.js.php:335 +msgid "Editor can't be displayed" +msgstr "" + +#: scripts/langref.php:19 scripts/articleObject.js.php:360 +msgid "Preview can't be displayed" +msgstr "" + +#: scripts/langref.php:24 +msgid "Headline / HTML" +msgstr "" + +#: scripts/langref.php:25 +msgid "Text / HTML" +msgstr "" + +#: scripts/langref.php:26 +msgid "Text / Standard" +msgstr "" + +#: scripts/langref.php:27 +msgid "Picture" +msgstr "" + +#: scripts/langref.php:29 +msgid "Description / Standard" +msgstr "" + +#: scripts/langref.php:30 +msgid "Flash Movie" +msgstr "" + +#: scripts/langref.php:32 +msgid "Frame" +msgstr "" + +#: scripts/articleObject.js.php:257 scripts/articleObject.js.php:290 +#: scripts/articleObject.js.php:319 +msgid "Can't edit articles in foreign languages." +msgstr "" + +#: scripts/articleObject.js.php:379 +msgid "Tab can't be displayed" +msgstr "" diff --git a/conlite/locale/de_DE/LC_MESSAGES/conlite.mo b/conlite/locale/de_DE/LC_MESSAGES/conlite.mo new file mode 100644 index 0000000000000000000000000000000000000000..3a27ab35e2e1e2ebde11847eae1e4faae85780ee GIT binary patch literal 79652 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 dV^~_MMHxn~ajA-I9J\n" +"Language-Team: CL-Dev \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: i18n\n" +"X-Poedit-Keywords: i18n,trans\n" +"X-Poedit-SourceCharset: iso-8859-1\n" +"X-Generator: Poedit 1.5.4\n" + +#: includes/include.system_configuration.php:93 +msgid "Versioning activated" +msgstr "Versionierung aktiviert" + +#: includes/include.system_configuration.php:93 +#: includes/include.system_configuration.php:94 +#: includes/include.system_configuration.php:95 +msgid "Versioning" +msgstr "Versionierung" + +#: includes/include.system_configuration.php:94 +msgid "Serverpath to version files" +msgstr "Serverpfad für Versionierungsdateien" + +#: includes/include.system_configuration.php:95 +msgid "Maximum number of stored versions" +msgstr "Maximale Anzahl gespeicherter Versionen" + +#: includes/include.system_configuration.php:96 +msgid "Check for updates" +msgstr "Auf Aktualisierungen prüfen" + +#: includes/include.system_configuration.php:96 +#: includes/include.system_configuration.php:97 +#: includes/include.system_configuration.php:98 +msgid "Update notifier" +msgstr "Update Benachrichtigung" + +#: includes/include.system_configuration.php:97 +#, fuzzy +msgid "Get news from conlite.org" +msgstr "Neuigkeiten von conlite.org lesen" + +#: includes/include.system_configuration.php:98 +msgid "Update check period (minutes)" +msgstr "Aktualisierungsperiode (Minuten)" + +#: includes/include.system_configuration.php:99 +msgid "Clickable menu in backend" +msgstr "Hauptmenüwechsel bei Klick" + +#: includes/include.system_configuration.php:99 +#: includes/include.system_configuration.php:100 +#: includes/include.system_configuration.php:101 +#: includes/include.system_configuration.php:102 +#: includes/include.system_configuration.php:103 +#: includes/include.system_configuration.php:104 +msgid "Backend" +msgstr "Backend" + +#: includes/include.system_configuration.php:100 +msgid "Use passwordrequest in Backend" +msgstr "Passwort vergessen Funktion benutzen" + +#: includes/include.system_configuration.php:101 +msgid "Activate maintenance mode" +msgstr "Wartungsmodus aktiviert" + +#: includes/include.system_configuration.php:102 +msgid "Use editarea for code highlighting" +msgstr "Editarea für Syntaxhighlighting verwenden" + +#: includes/include.system_configuration.php:103 +msgid "Use TinyMce as insight editor" +msgstr "TinyMce als Insite Editor verwenden" + +#: includes/include.system_configuration.php:104 +msgid "Default client (ID)" +msgstr "Standardmandant (ID)" + +#: includes/include.system_configuration.php:105 +msgid "Mailserver host" +msgstr "Mailserver Host" + +#: includes/include.system_configuration.php:105 +#: includes/include.system_configuration.php:106 +#: includes/include.system_configuration.php:107 +msgid "Mailserver" +msgstr "Mailserver" + +#: includes/include.system_configuration.php:106 +msgid "Mailserver sender mail" +msgstr "Mailserver Absender-Mail" + +#: includes/include.system_configuration.php:107 +msgid "Mailserver sender name" +msgstr "Mailserver Absender-Name" + +#: includes/include.system_configuration.php:109 +msgid "Generate basehref" +msgstr "Base-href erzeugen" + +#: includes/include.system_configuration.php:109 +#: includes/include.system_configuration.php:110 +msgid "Development" +msgstr "Entwicklung" + +#: includes/include.system_configuration.php:110 +msgid "Use image magic (if available)" +msgstr "Image magic benutzen (wenn verfügbar)" + +#: includes/include.system_configuration.php:123 +msgid "Update check period must be at least 60 minutes." +msgstr "Die Aktualisierungsperiode muss mindestens 60 Minuten betragen." + +#: includes/include.system_configuration.php:133 +#: includes/include.lang_edit.php:140 includes/include.client_edit.php:172 +#: includes/grouprights.inc.php:335 +#: includes/include.grouprights_overview.php:65 +#: includes/include.rights_overview.php:141 +msgid "Changes saved" +msgstr "Änderungen gespeichert" + +#: includes/include.system_configuration.php:142 +msgid "System Configuration" +msgstr "Systemeinstellungen" + +#: includes/include.system_configuration.php:192 +msgid "Access denied" +msgstr "Zugriff verweigert" + +#: includes/include.lang_edit.php:84 includes/include.lang_overview.php:103 +msgid "New language" +msgstr "Neue Sprache" + +#: includes/include.lang_edit.php:127 includes/include.logs.php:46 +#: includes/grouprights_lay.inc.php:55 includes/grouprights_lay.inc.php:74 +#: includes/include.tpl_edit_form.php:39 includes/include.js_edit_form.php:50 +#: includes/include.grouprights_create.php:42 +#: includes/include.html_tpl_history.php:59 includes/rights_lay.inc.php:57 +#: includes/rights_mod.inc.php:55 includes/include.client_artspec.php:40 +#: includes/include.client_artspec.php:50 +#: includes/include.client_artspec.php:60 +#: includes/include.client_artspec.php:70 +#: includes/include.con_edit_form.php:764 includes/grouprights_str.inc.php:54 +#: includes/include.upl_dirs_overview.php:408 +#: includes/include.upl_dirs_overview.php:555 +#: includes/include.tplcfg_edit_form.php:144 +#: includes/include.con_art_overview.php:1013 +#: includes/grouprights_tpl.inc.php:53 includes/rights_con.inc.php:56 +#: includes/include.client_edit.php:48 includes/include.mod_history.php:52 +#: includes/include.js_history.php:55 includes/include.lay_history.php:46 +#: includes/include.grouprights_overview.php:42 +#: includes/include.lay_edit_form.php:43 includes/include.lay_edit_form.php:52 +#: includes/include.rights_overview.php:49 +#: includes/grouprights_area.inc.php:65 includes/grouprights_mod.inc.php:54 +#: includes/grouprights_members.inc.php:41 +#: includes/include.html_tpl_edit_form.php:50 +#: includes/include.style_history.php:57 +#: includes/include.style_edit_form.php:51 includes/grouprights_con.inc.php:56 +#: includes/include.rights_create.php:43 includes/rights_str.inc.php:55 +#: includes/rights_area.inc.php:58 includes/rights_tpl.inc.php:55 +#: includes/include.system_purge.php:37 +msgid "Permission denied" +msgstr "Zugriff verweigert" + +#: includes/include.lang_edit.php:228 +msgid "Left to right" +msgstr "Links nach rechts" + +#: includes/include.lang_edit.php:228 +msgid "Right to left" +msgstr "Rechts nach Links" + +#: includes/include.lang_edit.php:242 includes/cfg_language_de.inc.php:191 +msgid "Edit language" +msgstr "Sprache bearbeiten" + +#: includes/include.lang_edit.php:244 +msgid "Language name" +msgstr "Name der Sprache" + +#: includes/include.lang_edit.php:245 +#: includes/include.frontend.user_edit.php:188 +msgid "Active" +msgstr "Aktiv" + +#: includes/include.lang_edit.php:247 includes/include.lang_edit.php:249 +#: includes/include.con_editcontent.php:392 main.loginform.php:156 +msgid "Language" +msgstr "Sprachen" + +#: includes/include.lang_edit.php:248 +msgid "Encoding" +msgstr "Encoding" + +#: includes/include.lang_edit.php:250 includes/include.rights_overview.php:260 +#: includes/include.rights_create.php:204 +msgid "Country" +msgstr "Land" + +#: includes/include.lang_edit.php:251 +msgid "Text direction" +msgstr "Laufrichtung Text" + +#: includes/include.lang_edit.php:253 includes/include.lang_edit.php:256 +#: includes/include.mycontenido_settings.php:143 +msgid "Time format" +msgstr "Zeitformat" + +#: includes/include.lang_edit.php:254 +#: includes/include.mycontenido_settings.php:141 +msgid "Date/Time format" +msgstr "Format Datum/Zeit" + +#: includes/include.lang_edit.php:255 +#: includes/include.mycontenido_settings.php:142 +msgid "Date format" +msgstr "Datumsformat" + +#: includes/include.CMS_SIMPLELINK.php:139 includes/include.CMS_LINK.php:142 +#, php-format +msgid "Edit link for container %s" +msgstr "Link für Container %s bearbeiten" + +#: includes/include.CMS_SIMPLELINK.php:150 scripts/langref.php:31 +msgid "Link" +msgstr "Link" + +#: includes/include.CMS_SIMPLELINK.php:153 includes/include.CMS_IMG.php:278 +#: includes/grouprights_lay.inc.php:86 includes/include.tpl_edit_form.php:154 +#: includes/include.js_edit_form.php:176 includes/include.CMS_LINK.php:341 +#: includes/include.grouprights_create.php:112 +#: includes/include.html_tpl_history.php:164 includes/rights_lay.inc.php:76 +#: includes/include.todo.popup.php:70 includes/rights_mod.inc.php:76 +#: includes/include.mycontenido.tasks.edit.php:71 +#: includes/grouprights_tpl.inc.php:73 includes/include.mod_edit_form.php:385 +#: includes/include.mod_history.php:132 includes/include.js_history.php:156 +#: includes/include.lay_history.php:121 includes/include.upl_edit.php:95 +#: includes/include.grouprights_overview.php:118 +#: includes/include.lay_edit_form.php:205 includes/grouprights_mod.inc.php:74 +#: includes/include.html_tpl_edit_form.php:214 +#: includes/include.style_history.php:161 +#: includes/include.style_edit_form.php:198 includes/include.mod_new.php:109 +#: includes/rights_tpl.inc.php:74 +#: templates/standard/template.tpl_edit_form.html:29 +#: templates/standard/template.upl_files_overview.html:84 +#: templates/standard/template.mod_edit_form.html:33 +#: templates/standard/template.lay_edit_form.html:32 scripts/langref.php:28 +msgid "Description" +msgstr "Beschreibung" + +#: includes/functions.upl.php:791 +msgid "OpenOffice.org Presentation" +msgstr "OpenOffice.org Präsentation" + +#: includes/functions.upl.php:792 +msgid "OpenOffice.org Presentation Template" +msgstr "OpenOffice.org Präsentationsvorlage" + +#: includes/functions.upl.php:793 +msgid "Microsoft PowerPoint Screen Presentation" +msgstr "Microsoft PowerPoint Bildschirmpräsentation" + +#: includes/functions.upl.php:794 includes/functions.upl.php:796 +msgid "Microsoft PowerPoint Presentation Template" +msgstr "Microsoft PowerPoint Präsentationsvorlage" + +#: includes/functions.upl.php:795 +msgid "KDE KPresenter Document" +msgstr "KDE KPresenter-Dokument" + +#: includes/functions.upl.php:799 +msgid "Microsoft Word Document or regular text file" +msgstr "Microsoft Word-Dokument oder reguläre Textdatei" + +#: includes/functions.upl.php:800 +msgid "Microsoft Word Template" +msgstr "Microsoft Word Vorlage" + +#: includes/functions.upl.php:801 +msgid "OpenOffice.org Text Document" +msgstr "OpenOffice.org Textdokument" + +#: includes/functions.upl.php:802 +msgid "OpenOffice.org Text Document Template" +msgstr "OpenOffice.org Dokumentenvorlage" + +#: includes/functions.upl.php:803 +msgid "StarOffice 5.0 Text Document" +msgstr "StarOffice 5.0 Textdokument" + +#: includes/functions.upl.php:804 +msgid "KDE KWord Document" +msgstr "KDE KWord Dokument" + +#: includes/functions.upl.php:807 +msgid "Microsoft Excel Worksheet" +msgstr "Microsoft Excel Arbeitsblatt" + +#: includes/functions.upl.php:808 +msgid "OpenOffice.org Table" +msgstr "OpenOffice.org Tabelle" + +#: includes/functions.upl.php:809 +msgid "OpenOffice.org Table Template" +msgstr "OpenOffice.org Tabellenvorlage" + +#: includes/functions.upl.php:810 +msgid "Microsoft Excel File" +msgstr "Microsoft Excel Datei" + +#: includes/functions.upl.php:811 +msgid "Microsoft Excel Template" +msgstr "Microsoft Excel Vorlage" + +#: includes/functions.upl.php:812 +msgid "Comma Seperated Value File" +msgstr "Komma-separierte Datei" + +#: includes/functions.upl.php:813 +msgid "KDE KSpread Document" +msgstr "KDE KSpread-Dokument" + +#: includes/functions.upl.php:814 +msgid "StarOffice 5.0 Table" +msgstr "StarOffice 5.0 Tabelle" + +#: includes/functions.upl.php:817 +msgid "Plain Text" +msgstr "einfache Textdatei" + +#: includes/functions.upl.php:818 +msgid "Rich Text Format" +msgstr "Rich Text Format - Datei" + +#: includes/functions.upl.php:821 +msgid "GIF Image" +msgstr "GIF-Bild" + +#: includes/functions.upl.php:822 +msgid "PNG Image" +msgstr "PNG-Bild" + +#: includes/functions.upl.php:823 includes/functions.upl.php:824 +msgid "JPEG Image" +msgstr "JPEG-Bild" + +#: includes/functions.upl.php:825 +msgid "TIFF Image" +msgstr "TIFF-Bild" + +#: includes/functions.upl.php:826 +msgid "Adobe Photoshop Image" +msgstr "Adobe Photoshop Bild" + +#: includes/functions.upl.php:829 includes/functions.upl.php:830 +msgid "Hypertext Markup Language Document" +msgstr "Hypertext Markup Language Dokument" + +#: includes/functions.upl.php:831 +msgid "Cascading Style Sheets" +msgstr "Cascading Style Sheets" + +#: includes/functions.upl.php:834 +msgid "LHA Archive" +msgstr "LHA-Archiv" + +#: includes/functions.upl.php:835 +msgid "RAR Archive" +msgstr "RAR-Archiv" + +#: includes/functions.upl.php:836 +msgid "ARJ Archive" +msgstr "ARJ-Archiv" + +#: includes/functions.upl.php:837 +msgid "bz2-compressed File" +msgstr "bz2-komprimierte Datei" + +#: includes/functions.upl.php:838 +msgid "bzip-compressed File" +msgstr "bzip-komprimierte Datei" + +#: includes/functions.upl.php:839 +msgid "ZIP Archive" +msgstr "ZIP-Archiv" + +#: includes/functions.upl.php:840 +msgid "TAR Archive" +msgstr "TAR-Archiv" + +#: includes/functions.upl.php:841 +msgid "GZ Compressed File" +msgstr "GZ-komprimierte Datei" + +#: includes/functions.upl.php:844 +msgid "C Program Code" +msgstr "C Programmcode" + +#: includes/functions.upl.php:847 +msgid "C++ Program Code" +msgstr "C++ Programmcode" + +#: includes/functions.upl.php:849 +msgid "C or C++ Program Header" +msgstr "C oder C++ Programmheader" + +#: includes/functions.upl.php:852 +msgid "PHP Program Code" +msgstr "PHP Programmcode" + +#: includes/functions.upl.php:853 +msgid "PHP Source File" +msgstr "PHP Quellcode" + +#: includes/functions.upl.php:855 +msgid "Adobe Acrobat Portable Document" +msgstr "Adobe Acrobat Portable Document" + +#: includes/functions.upl.php:858 +msgid "QuickTime Movie" +msgstr "QuickTime-Movie" + +#: includes/functions.upl.php:859 +msgid "avi Movie" +msgstr "avi-Movie" + +#: includes/functions.upl.php:861 +msgid "MPEG Movie" +msgstr "MPEG-Movie" + +#: includes/functions.upl.php:862 +msgid "Windows Media Video" +msgstr "Windows Media-Video" + +#: includes/functions.upl.php:864 +msgid "-File" +msgstr "-Datei" + +#: includes/include.frontend.user_edit.php:50 +#: includes/include.frontend.user_edit.php:70 +#: includes/include.frontend.user_edit.php:107 +msgid "-- new user --" +msgstr "-- Neuer Benutzer --" + +#: includes/include.frontend.user_edit.php:110 +msgid "Username empty or not set! Please choose one." +msgstr "Benutzername fehlt! Bitte wählen Sie einen Benutzernamen." + +#: includes/include.frontend.user_edit.php:115 +msgid "Password not set right now!" +msgstr "Passwort noch nicht gesetzt!" + +#: includes/include.frontend.user_edit.php:121 +msgid "Could not set new username: Username already exists" +msgstr "" +"Konnte neuen Benutzernamen nicht setzen: Benutzername existiert bereits" + +#: includes/include.frontend.user_edit.php:128 +msgid "Could not set new password: Passwords don't match" +msgstr "" +"Konnte neues Passwort nicht setzen: Passwort und Bestätigung stimmen " +"nicht überein" + +#: includes/include.frontend.user_edit.php:177 +#: includes/cfg_language_de.inc.php:176 +msgid "Edit user" +msgstr "Benutzer bearbeiten" + +#: includes/include.frontend.user_edit.php:185 +#: includes/include.rights_left_top.php:115 +msgid "User name" +msgstr "Benutzername" + +#: includes/include.frontend.user_edit.php:186 +#: includes/include.mycontenido_settings.php:116 +#: includes/include.rights_overview.php:217 +#: includes/include.rights_create.php:162 +msgid "New password" +msgstr "Neues Passwort" + +#: includes/include.frontend.user_edit.php:187 +msgid "New password (again)" +msgstr "Neues Passwort (erneut)" + +#: includes/include.frontend.user_edit.php:215 +msgid "WARNING" +msgstr "WARNUNG" + +#: includes/include.frontend.user_edit.php:215 +#, php-format +msgid "" +"The plugin %s delivered an array for the displayed titles, but did not " +"return an array for the contents." +msgstr "" +"Das Plugin %s lieferte ein Array für die angezeigten Titel, aber " +"lieferte kein Array für die Inhalte." + +#: includes/include.frontend.user_edit.php:237 +#: includes/include.tpl_visualedit.php:146 +#: includes/include.tpl_edit_form.php:86 includes/include.tpl_edit_form.php:91 +#: includes/include.tpl_edit_form.php:203 +#: includes/include.tplcfg_edit_form.php:301 +#: includes/include.con_left_top.php:374 +#: includes/include.rights_overview.php:455 +#: includes/include.str_overview.php:188 includes/include.str_overview.php:656 +msgid "none" +msgstr "kein" + +#: includes/include.frontend.user_edit.php:240 +#: includes/include.rights_overview.php:458 +msgid "Group membership" +msgstr "Gruppenzugehörigkeit" + +#: includes/include.frontend.user_edit.php:241 +#: includes/include.con_left_top.php:275 includes/include.upl_edit.php:102 +msgid "Author" +msgstr "Autor" + +#: includes/include.frontend.user_edit.php:242 +#: includes/include.upl_edit.php:103 +msgid "Last modified by" +msgstr "Zuletzt geändert von" + +#: includes/include.lay_preview.php:29 includes/include.tpl_visualedit.php:84 +msgid "No such layout" +msgstr "Layout nicht vorhanden" + +#: includes/rights.inc.php:273 includes/functions.stat.php:992 +#: includes/functions.stat.php:1018 +#: includes/include.grouprights_left_top.php:59 +#: includes/include.con_art_overview.php:866 +#: includes/include.rights_left_top.php:76 includes/grouprights.inc.php:157 +msgid "All" +msgstr "Alle" + +#: includes/rights.inc.php:275 includes/grouprights.inc.php:159 +msgid "Article rights" +msgstr "Artikelrechte" + +#: includes/rights.inc.php:277 includes/grouprights.inc.php:161 +msgid "Category rights" +msgstr "Kategorierechte" + +#: includes/rights.inc.php:279 includes/grouprights.inc.php:163 +msgid "Template rights" +msgstr "Templaterechte" + +#: includes/rights.inc.php:281 includes/grouprights.inc.php:165 +msgid "Plugin/Other rights" +msgstr "Pluginrechte / Andere Rechte" + +#: includes/rights.inc.php:343 +msgid "" +"The selected user is a system administrator. A system administrator has all " +"rights for all clients for all languages and therefore rights can't be " +"specified in more detail." +msgstr "" +"Der gewählte Nutzer ist ein Systemadministrator. Ein " +"Systemadministrator verfügt über alle Rechte für alle " +"Mandanten in allen Sprachen, es können keine weiteren Einstellungen " +"für Rechte vorgenommen werden." + +#: includes/rights.inc.php:348 +msgid "" +"The selected user is assigned to clients as admin, only. An admin has all " +"rights for a client and therefore rights can't be specified in more detail." +msgstr "" +"Der gewählte Nutzer ist als Administrator Mandanten zugeordnet. Ein " +"Administrator verfügt über alle Rechte für den oder die " +"zugeordneten Mandanten in allen Sprachen, es können keine weiteren " +"Einstellungen für Rechte vorgenommen werden." + +#: includes/rights.inc.php:352 +msgid "Current user doesn't have any rights to any client/language." +msgstr "" +"Der aktuelle Benutzer hat keine Zugriffsrechte auf irgendeine(n) Sprache " +"bzw. Mandant" + +#: includes/include.grouprights_menu.php:178 +#, php-format +msgid "Do you really want to delete the group %s?" +msgstr "Möchten Sie die Gruppe %s wirklich löschen?" + +#: includes/include.grouprights_menu.php:196 +#: includes/cfg_language_de.inc.php:182 +msgid "Delete group" +msgstr "Gruppe löschen" + +#: includes/include.grouprights_menu.php:197 +#, php-format +msgid "Do you really want to delete the following group:

    %s
    " +msgstr "" +"Möchten Sie die folgende Gruppe wirklich löschen:

    %s" + +#: includes/include.upl_left_top.php:53 includes/include.tpl_new.php:41 +#: includes/include.lay_new.php:40 includes/include.js_left_top.php:54 +#: includes/include.lang_left_top.php:82 +#: includes/include.style_left_top.php:54 +#: includes/include.frontend.left_top.php:181 +#: includes/include.frontend.left_top.php:445 includes/include.mod_new.php:76 +#: includes/include.html_tpl_left_top.php:54 +msgid "No Client selected" +msgstr "Kein Mandant ausgewählt" + +#: includes/include.upl_left_top.php:74 +#: includes/include.rights_left_top.php:159 +#: includes/include.frontend.left_top.php:265 includes/include.mod_new.php:169 +msgid "Search for" +msgstr "Suche nach" + +#: includes/include.upl_left_top.php:112 +msgid "Create directory in" +msgstr "Erstelle Verzeichnis in" + +#: includes/include.mod_sync.php:39 +msgid "Syncing Modules!" +msgstr "Module werden synchronisiert" + +#: includes/include.mod_sync.php:44 includes/include.mod_sync.php:56 +#, fuzzy +msgid "Module " +msgstr "Module" + +#: includes/include.mod_sync.php:44 +msgid "nothing to do" +msgstr "nichts zu tun" + +#: includes/include.mod_sync.php:56 +msgid "synchronized" +msgstr "synchronisiert" + +#: includes/include.mod_sync.php:61 +msgid "No modules to sync!" +msgstr "Keine Module zu synchronisieren" + +#: includes/include.mod_sync.php:66 +msgid "Nothing to do!" +msgstr "Nichts zu tun!" + +#: includes/include.logs.php:64 +msgid "Submit query" +msgstr "Abfrage absenden" + +#: includes/include.logs.php:75 +msgid "All users" +msgstr "Alle Benutzer" + +#: includes/include.logs.php:77 +msgid "All actions" +msgstr "Alle Aktionen" + +#: includes/include.logs.php:199 +msgid "Unlimited" +msgstr "Unbegrenzt" + +#: includes/include.logs.php:200 includes/include.logs.php:201 +#: includes/include.logs.php:202 includes/include.logs.php:203 +#: includes/include.logs.php:204 +msgid "Entries" +msgstr "Einträge" + +#: includes/include.logs.php:275 +msgid "No results" +msgstr "Keine Resultate" + +#: includes/include.frontend.group_rights.php:47 +msgid "Invalid plugin" +msgstr "Ungültiges Plugin" + +#: includes/include.frontend.group_rights.php:96 +#, php-format +msgid "Permissions for plugin '%s'" +msgstr "Rechte für Plugin '%s'" + +#: includes/include.frontend.group_rights.php:101 +msgid "(All)" +msgstr "(Alle)" + +#: includes/include.frontend.group_rights.php:109 +msgid "Global rights" +msgstr "Globale Rechte" + +#: includes/include.frontend.group_rights.php:131 +msgid "No items found" +msgstr "Keine Elemente gefunden" + +#: includes/include.style_files_overview.php:104 +#: includes/include.js_files_overview.php:104 +#: includes/include.mod_package.php:111 +#: includes/include.html_tpl_files_overview.php:105 +msgid "is not readable!" +msgstr "Datei ist nicht lesbar" + +#: includes/include.style_files_overview.php:131 +#: includes/include.js_files_overview.php:131 +#: includes/include.system_db_backup.php:294 +#: includes/include.html_tpl_files_overview.php:132 +msgid "Delete File" +msgstr "Datei löschen" + +#: includes/include.style_files_overview.php:132 +#: includes/include.js_files_overview.php:132 +#: includes/include.html_tpl_files_overview.php:133 +#, php-format +msgid "Do you really want to delete the following file:

    %s
    " +msgstr "" +"Möchten Sie die folgende Datei wirklich löschen:

    %s" + +#: includes/include.style_files_overview.php:155 +#: includes/include.js_files_overview.php:155 +#: includes/include.mod_package.php:123 +#: includes/include.html_tpl_files_overview.php:156 +msgid "Directory is not existing or readable!" +msgstr "Verzeichnis existiert nicht oder ist nicht lesbar" + +#: includes/include.CMS_IMG.php:186 includes/include.CMS_EASYIMG.php:146 +#, php-format +msgid "Edit image for container %s" +msgstr "Bild für Container %s bearbeiten" + +#: includes/include.CMS_IMG.php:235 includes/include.CMS_LINK.php:180 +#: includes/include.CMS_LINK.php:182 includes/include.CMS_SWF.php:80 +#: includes/include.con_left_top.php:449 +#: includes/include.con_art_overview.php:523 +#: includes/include.upl_search_results.php:55 +#: includes/include.mod_package.php:180 +#: includes/include.mycontenido_lastarticles.php:183 +#: includes/cfg_language_de.inc.php:370 backend_search.php:669 +msgid "None" +msgstr "Kein" + +#: includes/include.CMS_IMG.php:275 +msgid "Directory / File" +msgstr "Verzeichnis / Datei" + +#: includes/include.CMS_IMG.php:283 +#: includes/include.upl_files_overview.php:526 +#: includes/include.upl_search_results.php:286 +#: includes/include.upl_edit.php:101 +msgid "Preview" +msgstr "Vorschau" + +#: includes/include.tpl_new.php:39 +msgid "New template" +msgstr "Neues Template" + +#: includes/functions.stat.php:44 +msgid "Info about article" +msgstr "Info über Artikel" + +#: includes/functions.stat.php:46 +msgid "Info about directory" +msgstr "Info über Verzeichnis" + +#: includes/functions.stat.php:285 +msgid "Category is online" +msgstr "Kategorie ist online" + +#: includes/functions.stat.php:287 +msgid "Category is offline" +msgstr "Kategorie ist offline" + +#: includes/functions.stat.php:313 includes/functions.stat.php:314 +#: includes/functions.stat.php:644 includes/functions.stat.php:645 +#: includes/grouprights_str.inc.php:215 +#: includes/include.upl_dirs_overview.php:56 includes/rights_con.inc.php:227 +#: includes/include.str_overview.php:169 includes/grouprights_con.inc.php:241 +#: includes/rights_str.inc.php:221 +msgid "Open category" +msgstr "Kategorie öffnen" + +#: includes/functions.stat.php:478 +msgid "Sum" +msgstr "Summe" + +#: includes/functions.stat.php:989 includes/functions.stat.php:1015 +#: includes/include.stat_overview.php:50 +msgid "Top 10" +msgstr "Top 10" + +#: includes/functions.stat.php:990 includes/functions.stat.php:1016 +#: includes/include.stat_overview.php:53 +msgid "Top 20" +msgstr "Top 20" + +#: includes/functions.stat.php:991 includes/functions.stat.php:1017 +#: includes/include.stat_overview.php:56 +msgid "Top 30" +msgstr "Top 30" + +#: includes/include.upl_files_overview.php:84 +#: includes/include.upl_edit.php:304 includes/include.upl_files_upload.php:67 +msgid "Directory not writable" +msgstr "Verzeichnis nicht beschreibbar" + +#: includes/include.upl_files_overview.php:240 +#, php-format +msgid "" +"The uploaded file (%s) exceeds the upload_max_filesize directive in php.ini." +msgstr "" +"Die hochgeladene Datei (%s) überschreitet die Direktiveupload_max_filesize " +"in der php.ini." + +#: includes/include.upl_files_overview.php:250 +#, php-format +msgid "Error while uploading file (%s)." +msgstr "Fehler beim Hochladen der Datei %s" + +#: includes/include.upl_files_overview.php:302 +msgid "Errors while uploading file(s). Some or all files were not uploaded." +msgstr "" +"Fehler beim Dateiupload. Einige oder alle Dateien konnten nicht hochgeladen " +"werden." + +#: includes/include.upl_files_overview.php:386 +#: includes/include.upl_files_overview.php:388 +msgid "Use file" +msgstr "Datei verwenden" + +#: includes/include.upl_files_overview.php:449 +#: includes/include.upl_files_overview.php:452 +#: includes/include.upl_files_overview.php:454 +#: includes/include.upl_search_results.php:190 +#: includes/include.upl_search_results.php:195 +#: includes/include.upl_search_results.php:198 +msgid "Filename / Description" +msgstr "Dateiname / Beschreibung" + +#: includes/include.upl_files_overview.php:459 +#: includes/include.upl_files_overview.php:462 +#: includes/include.upl_files_overview.php:464 +#: includes/include.upl_search_results.php:218 +#: includes/include.upl_search_results.php:223 +#: includes/include.upl_search_results.php:226 +msgid "Size" +msgstr "Größe" + +#: includes/include.upl_files_overview.php:469 +#: includes/include.upl_files_overview.php:472 +#: includes/include.upl_files_overview.php:474 +#: includes/include.systemsettings.php:60 +#: includes/include.systemsettings.php:170 +#: includes/include.upl_search_results.php:232 +#: includes/include.upl_search_results.php:237 +#: includes/include.upl_search_results.php:240 +#: includes/include.mod_edit_form.php:384 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:185 includes/include.mod_new.php:87 +#: includes/include.mod_new.php:110 +msgid "Type" +msgstr "Typ" + +#: includes/include.upl_files_overview.php:480 +msgid "Delete Files" +msgstr "Dateien löschen" + +#: includes/include.upl_files_overview.php:480 +msgid "Are you sure you want to delete the selected files?" +msgstr "" +"Sind Sie sich sicher, dass Sie die gewählten Dateien wirklich lö" +"schen wollen?" + +#: includes/include.upl_files_overview.php:481 +msgid "Delete selected files" +msgstr "Markierte Dateien löschen" + +#: includes/include.upl_files_overview.php:497 +msgid "Flip Selection" +msgstr "Markierung umkehren" + +#: includes/include.upl_files_overview.php:502 +#: includes/include.upl_files_upload.php:59 +msgid "Path:" +msgstr "Pfad:" + +#: includes/include.upl_files_overview.php:517 +#: includes/include.upl_search_results.php:276 +msgid "Files per Page" +msgstr "Dateien pro Seite" + +#: includes/include.upl_files_overview.php:525 +msgid "Mark" +msgstr "Markieren" + +#: includes/include.upl_files_overview.php:530 +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.con_art_overview.php:83 +#: includes/include.frontend.left_top.php:165 backend_search.php:497 +#: templates/standard/template.str_overview.html:233 +msgid "Actions" +msgstr "Aktionen" + +#: includes/include.upl_files_overview.php:632 +msgid "Display properties" +msgstr "Eigenschaften anzeigen" + +#: includes/include.upl_files_overview.php:658 +#: includes/include.upl_search_results.php:417 +#: classes/class.cms_filelist.php:540 classes/class.cms_filelist.php:541 +msgid "No files found" +msgstr "Keine Dateien gefunden / vorhanden" + +#: includes/include.upl_files_overview.php:681 +#: includes/include.upl_search_results.php:445 +msgid "Previous Page" +msgstr "Vorherige Seite" + +#: includes/include.upl_files_overview.php:687 +#: includes/include.upl_search_results.php:452 +msgid "Next Page" +msgstr "Nächste Seite" + +#: includes/include.upl_files_overview.php:727 +#: includes/include.upl_search_results.php:490 +msgid "Page" +msgstr "Seite" + +#: includes/include.upl_files_overview.php:752 +#: includes/cfg_language_de.inc.php:143 +msgid "Delete file" +msgstr "Datei löschen" + +#: includes/include.upl_files_overview.php:753 +msgid "Do you really want to delete the following file:
    " +msgstr "Möchten Sie wirklich die folgende Datei löschen:
    " + +#: includes/include.upl_files_overview.php:884 +#: includes/include.upl_search_results.php:605 +msgid "Enter new filename" +msgstr "Neuer Dateiname" + +#: includes/grouprights_lay.inc.php:85 includes/rights_lay.inc.php:75 +msgid "Layout name" +msgstr "Layoutname" + +#: includes/grouprights_lay.inc.php:113 includes/rights_lay.inc.php:100 +#: includes/rights_mod.inc.php:99 includes/grouprights_str.inc.php:105 +#: includes/grouprights_tpl.inc.php:101 includes/rights_con.inc.php:112 +#: includes/grouprights_area.inc.php:86 includes/grouprights_mod.inc.php:99 +#: includes/grouprights_con.inc.php:111 includes/rights_str.inc.php:106 +#: includes/rights_area.inc.php:87 includes/rights_tpl.inc.php:100 +msgid "Check all" +msgstr "Alle markieren" + +#: includes/include.grouprights_left_top.php:60 +#: includes/include.rights_left_top.php:77 +msgid "Frontend only" +msgstr "Nur Frontend" + +#: includes/include.grouprights_left_top.php:61 +#: includes/include.rights_left_top.php:78 +msgid "Backend only" +msgstr "Nur Backend" + +#: includes/include.grouprights_left_top.php:90 +#: includes/cfg_language_de.inc.php:181 +#: includes/include.frontend.left_top.php:442 +msgid "Create group" +msgstr "Gruppe erzeugen" + +#: includes/include.tpl_edit_form.php:43 +msgid "- New Template -" +msgstr "-- Neues Template --" + +#: includes/include.tpl_edit_form.php:148 includes/cfg_language_de.inc.php:165 +msgid "Edit template" +msgstr "Template bearbeiten" + +#: includes/include.tpl_edit_form.php:151 +#: includes/include.js_edit_form.php:175 +#: includes/include.html_tpl_history.php:163 +#: includes/include.systemsettings.php:61 +#: includes/include.systemsettings.php:174 +#: includes/include.rights_left_top.php:116 +#: includes/include.mod_edit_form.php:377 +#: includes/include.mod_edit_form.php:381 includes/include.mod_history.php:131 +#: includes/include.js_history.php:155 includes/include.mod_package.php:235 +#: includes/include.mod_package.php:253 includes/include.mod_package.php:422 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:189 +#: includes/include.lay_history.php:120 includes/include.lay_edit_form.php:204 +#: includes/include.rights_overview.php:209 +#: includes/include.html_tpl_edit_form.php:213 +#: includes/include.style_history.php:160 +#: includes/include.style_edit_form.php:197 includes/include.mod_new.php:87 +#: includes/include.rights_create.php:156 +#: templates/standard/template.tpl_edit_form.html:19 +#: templates/standard/template.mod_edit_form.html:23 +#: templates/standard/template.lay_edit_form.html:22 +#: classes/class.ajax.php:162 classes/class.ajax.php:179 +msgid "Name" +msgstr "Name" + +#: includes/include.tpl_edit_form.php:158 +#: includes/include.tpl_edit_form.php:234 +msgid "Default" +msgstr "Standard" + +#: includes/include.tpl_edit_form.php:160 +#: includes/include.lay_overview.php:101 +#: templates/standard/template.tpl_edit_form.html:42 +msgid "Layout" +msgstr "Layout" + +#: includes/include.tpl_edit_form.php:161 +#: templates/standard/template.tpl_edit_form.html:55 +msgid "Layout description" +msgstr "Layoutbeschreibung" + +#: includes/include.js_edit_form.php:159 +#: includes/include.html_tpl_edit_form.php:197 +#: includes/include.style_edit_form.php:180 +msgid "Edit file" +msgstr "Datei bearbeiten" + +#: includes/include.js_edit_form.php:177 +#: includes/include.html_tpl_history.php:165 +#: includes/include.js_history.php:157 includes/include.lay_history.php:122 +#: includes/include.lay_edit_form.php:206 +#: includes/include.lay_edit_form.php:217 +#: includes/include.html_tpl_edit_form.php:215 +#: includes/include.style_history.php:162 +#: includes/include.style_edit_form.php:199 +msgid "Code" +msgstr "Quelltext" + +#: includes/include.CMS_LINK.php:153 +msgid "External link" +msgstr "Externer Link" + +#: includes/include.CMS_LINK.php:210 +msgid "Internal link" +msgstr "Interner Link" + +#: includes/include.CMS_LINK.php:215 includes/include.CMS_LINK.php:244 +#: includes/include.CMS_LINK.php:273 includes/include.CMS_LINK.php:288 +#: includes/include.CMS_LINK.php:304 includes/functions.general.php:1136 +#: includes/functions.general.php:1176 includes/include.str_overview.php:90 +#: classes/class.cms_teaser.php:353 classes/class.cms_teaser.php:382 +#: classes/class.cms_teaser.php:419 classes/class.cms_teaser.php:447 +#: classes/class.cms_teaser.php:476 classes/class.cms_teaser.php:539 +msgid "Please choose" +msgstr "Bitte wählen" + +#: includes/include.CMS_LINK.php:240 +msgid "Link to a document" +msgstr "Link zu einem Dokument" + +#: includes/include.CMS_LINK.php:270 +msgid "Link to an image" +msgstr "Link zu einem Bild" + +#: includes/include.CMS_LINK.php:285 +msgid "Link to an archive" +msgstr "Link zu einem Archiv" + +#: includes/include.CMS_LINK.php:300 +msgid "Link to a media file" +msgstr "Link zu einer Mediendatei" + +#: includes/include.CMS_LINK.php:316 +msgid "Link to any file" +msgstr "Link auf eine beliebige Datei" + +#: includes/include.CMS_LINK.php:340 +msgid "Upload file" +msgstr "Datei hochladen" + +#: includes/include.CMS_LINK.php:345 +msgid "Target frame" +msgstr "Zielframe" + +#: includes/include.CMS_LINK.php:353 +msgid "Open link in new window" +msgstr "Link in neues Fenster öffnen" + +#: includes/include.CMS_LINK.php:375 +msgid "Open in new window" +msgstr "In neues Fenster öffnen" + +#: includes/include.tpl_overview.php:96 includes/include.lay_overview.php:83 +#: includes/include.mod_overview.php:196 +msgid "Click for more information about usage" +msgstr "Klicken Sie für mehr Information über Verwendung" + +#: includes/include.tpl_overview.php:99 includes/cfg_language_de.inc.php:164 +msgid "Delete template" +msgstr "Template löschen" + +#: includes/include.tpl_overview.php:100 +#, php-format +msgid "Do you really want to delete the following template:

    %s
    " +msgstr "" +"Möchten Sie das folgende Template wirklich löschen:

    %s" + +#: includes/include.tpl_overview.php:105 +msgid "Template in use, cannot delete" +msgstr "Template wird benutzt, löschen nicht möglich" + +#: includes/include.tpl_overview.php:111 includes/cfg_language_de.inc.php:167 +#: includes/cfg_language_de.inc.php:168 +#: templates/standard/template.symbolhelp.html:1016 +msgid "Duplicate template" +msgstr "Template duplizieren" + +#: includes/include.tpl_overview.php:128 +#, php-format +msgid "The template '%s' is used for following categories and articles" +msgstr "Das Template '%s' wird bei folgenden Kategorien und Artikeln benutzt" + +#: includes/functions.system.php:55 +msgid "Can't clear install error log : Access is denied!" +msgstr "Upgrade-Fehlerlog konnte nicht geleert werden: Zugriff verweigert!" + +#: includes/functions.system.php:60 +msgid "error log successfully cleared" +msgstr "Errorlog erfolgreich geleert" + +#: includes/functions.system.php:278 +msgid "Contenido version" +msgstr "ConLite Version" + +#: includes/functions.system.php:281 +msgid "Contenido path" +msgstr "ConLite Pfad" + +#: includes/functions.system.php:283 +msgid "Contenido HTML path" +msgstr "ConLite HTML-Pfad" + +#: includes/functions.system.php:285 +msgid "Contenido full HTML path" +msgstr "ConLite vollständiger HTML-Pfad" + +#: includes/functions.system.php:287 +msgid "Contenido frontend path" +msgstr "ConLite Frontend-Pfad" + +#: includes/functions.system.php:289 +msgid "Contenido PHPLIB path" +msgstr "ConLite PHPLIB-Pfad" + +#: includes/functions.system.php:291 +msgid "Contenido wysiwyg path" +msgstr "ConLite WYSIWYG-Pfad" + +#: includes/functions.system.php:293 +msgid "Contenido wysiwyg HTML path" +msgstr "ConLite WYSIWYG-HTML-Pfad" + +#: includes/functions.system.php:296 +msgid "Host name" +msgstr "Host-Name" + +#: includes/functions.system.php:299 +msgid "Browser path" +msgstr "Browser-Pfad" + +#: includes/functions.system.php:321 +msgid "client settings" +msgstr "Mandanten-Einstellungen" + +#: includes/functions.system.php:322 +msgid "values" +msgstr "Werte" + +#: includes/functions.system.php:353 +msgid "language(s)" +msgstr "Sprache(n)" + +#: includes/functions.system.php:362 +msgid "htmlpath" +msgstr "HTML-Pfad" + +#: includes/functions.system.php:366 +msgid "frontendpath" +msgstr "Frontend-Pfad" + +#: includes/functions.system.php:378 +msgid "No permissions!" +msgstr "Kein Zugriff!" + +#: includes/functions.system.php:384 +msgid "Number of installed clients: " +msgstr "Anzahl der installierten Mandanten: " + +#: includes/functions.system.php:387 +msgid "Client informations" +msgstr "Mandanteninformationen" + +#: includes/functions.system.php:394 +msgid "Number of users" +msgstr "Anzahl Benutzer" + +#: includes/functions.system.php:401 includes/include.stat_overview.php:91 +msgid "Number of articles" +msgstr "Anzahl der Artikel" + +#: includes/functions.system.php:404 +msgid "Server operating system" +msgstr "Server Betriebssystem" + +#: includes/functions.system.php:408 +msgid "PHP database extension" +msgstr "PHP Datenbankerweiterung" + +#: includes/functions.system.php:410 +msgid "Database server version" +msgstr "Datenbankserver-Version" + +#: includes/functions.system.php:413 +msgid "Installed PHP version" +msgstr "Installierte PHP-Version" + +#: includes/functions.system.php:418 includes/functions.system.php:422 +#: includes/functions.system.php:426 includes/functions.system.php:447 +msgid "activated" +msgstr "Aktiviert" + +#: includes/functions.system.php:418 includes/functions.system.php:422 +#: includes/functions.system.php:426 includes/functions.system.php:447 +msgid "deactivated" +msgstr "Deaktiviert" + +#: includes/functions.system.php:439 +msgid "nothing disabled" +msgstr "nichts deaktiviert" + +#: includes/functions.system.php:440 +msgid "Disabled functions" +msgstr "Deaktivierte Funktionen" + +#: includes/functions.system.php:443 +msgid "loaded" +msgstr "geladen" + +#: includes/functions.system.php:443 +msgid "not loaded" +msgstr "nicht geladen" + +#: includes/functions.system.php:444 +msgid "Gettext extension" +msgstr "Gettext Erweiterung" + +#: includes/functions.system.php:455 includes/main.login.php:213 +msgid "Settings" +msgstr "Einstellungen" + +#: includes/functions.system.php:456 +msgid "Values" +msgstr "Werte" + +#: includes/functions.system.php:473 +msgid "GD library" +msgstr "GD-Bibliothek" + +#: includes/functions.system.php:636 +msgid "an error occured while sending your bug report! Please try again" +msgstr "" +"Ein Fehler ist während des Sendens des Bugreports aufgetreten! Bitte " +"versuchen Sie es noch einmal" + +#: includes/functions.system.php:639 +msgid "bug report forwarded" +msgstr "Bug Report abgeschickt" + +#: includes/functions.system.php:645 +msgid "please fill out all mandatory fields" +msgstr "Bitte alle Pflichtfelder ausfüllen" + +#: includes/functions.system.php:649 +msgid "please enter a valid E-Mail adress" +msgstr "Bitte geben Sie eine gültige E-Mail Adresse an" + +#: includes/functions.system.php:653 +msgid "you must agree the declaration of consent" +msgstr "Sie müssen der Vereinbarung zustimmen" + +#: includes/include.grouprights_create.php:57 +msgid "New Group" +msgstr "Neue Gruppe" + +#: includes/include.grouprights_create.php:71 +msgid "group created" +msgstr "Gruppe erzeugt" + +#: includes/include.grouprights_create.php:76 +msgid "Group couldn't created" +msgstr "Gruppe konnte nicht erstellt werden" + +#: includes/include.grouprights_create.php:94 +#: includes/include.CMS_EASYIMG.php:158 includes/include.client_edit.php:227 +#: includes/include.grouprights_overview.php:102 +#: includes/include.rights_overview.php:192 +#: includes/include.rights_create.php:142 +#: classes/widgets/class.widgets.tableedit.php:188 +#: classes/widgets/class.widgets.views.php:80 classes/class.ui.php:351 +msgid "Save changes" +msgstr "Änderungen speichern" + +#: includes/include.grouprights_create.php:96 +#: includes/include.client_edit.php:236 +#: includes/include.grouprights_overview.php:106 +#: includes/include.grouprights_overview.php:209 +#: includes/include.rights_overview.php:197 +#: includes/include.rights_overview.php:353 +#: includes/include.rights_create.php:144 +msgid "Property" +msgstr "Eigenschaft" + +#: includes/include.grouprights_create.php:99 +#: includes/include.systemsettings.php:62 +#: includes/include.systemsettings.php:178 +#: includes/include.client_edit.php:239 includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:193 +#: includes/include.grouprights_overview.php:109 +#: includes/include.grouprights_overview.php:210 +#: includes/include.rights_overview.php:200 +#: includes/include.rights_overview.php:354 +#: includes/include.rights_create.php:147 +#: templates/standard/template.log_main.html:15 +msgid "Value" +msgstr "Wert" + +#: includes/include.grouprights_create.php:102 +#: includes/include.frontend.group_edit.php:221 +msgid "Group name" +msgstr "Gruppenname" + +#: includes/include.grouprights_create.php:123 +#: includes/include.grouprights_overview.php:129 +#: includes/include.rights_overview.php:271 +#: includes/include.rights_create.php:215 +msgid "System administrator" +msgstr "Systemadministrator" + +#: includes/include.grouprights_create.php:141 +#: includes/include.grouprights_overview.php:147 +#: includes/include.rights_overview.php:289 +#: includes/include.rights_create.php:233 +msgid "Administrator" +msgstr "Administrator" + +#: includes/include.grouprights_create.php:156 +#: includes/include.grouprights_overview.php:163 +#: includes/include.rights_overview.php:305 +#: includes/include.rights_create.php:248 +msgid "Access clients" +msgstr "Zugriff auf Mandanten" + +#: includes/include.grouprights_create.php:172 +#: includes/include.grouprights_overview.php:180 +#: includes/include.rights_overview.php:322 +#: includes/include.rights_create.php:263 +msgid "Access languages" +msgstr "Zugriff auf Sprache" + +#: includes/include.html_tpl_history.php:64 +#: includes/include.mod_history.php:57 includes/include.js_history.php:60 +#: includes/include.lay_history.php:51 includes/include.style_history.php:62 +msgid "Versioning is not activated" +msgstr "Die Versionierung ist nicht aktiv" + +#: includes/include.html_tpl_history.php:129 +#: includes/include.js_history.php:125 +msgid "Edit JScript" +msgstr "JScript bearbeiten" + +#: includes/include.html_tpl_history.php:166 +#: includes/include.mod_history.php:135 includes/include.js_history.php:158 +#: includes/include.lay_history.php:123 includes/include.style_history.php:163 +msgid "Copy to current" +msgstr "In die aktuelle Version kopieren" + +#: includes/include.html_tpl_history.php:179 +#: includes/include.html_tpl_history.php:187 +msgid "No template history available" +msgstr "Keine Template-Historie verfügbar" + +#: includes/include.html_tpl_history.php:185 +#: includes/include.mod_history.php:150 includes/include.js_history.php:177 +#: includes/include.lay_history.php:135 includes/include.style_history.php:182 +msgid "Version history was cleared" +msgstr "Die Versionshistorie wurde erfolgreich gelöscht" + +#: includes/include.client_left_top.php:50 +#: includes/cfg_language_de.inc.php:243 +msgid "Create client" +msgstr "Mandant erzeugen" + +#: includes/include.todo.popup.php:58 +msgid "Add TODO item" +msgstr "Todo Eintrag hinzufügen" + +#: includes/include.todo.popup.php:67 +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.mycontenido.tasks.edit.php:68 +msgid "Subject" +msgstr "Betreff" + +#: includes/include.todo.popup.php:75 +#: includes/include.mycontenido.tasks.edit.php:100 +msgid "Reminder date" +msgstr "Zeitpunkt Wiedervorlage" + +#: includes/include.todo.popup.php:79 +#: includes/include.mycontenido.tasks.edit.php:75 +#: includes/include.upl_edit.php:219 +#: templates/standard/template.con_edit_form.html:150 +#: templates/standard/template.log_main.html:34 +msgid "End date" +msgstr "Enddatum" + +#: includes/include.todo.popup.php:80 +msgid "eMail notification" +msgstr "E-Mail Benachrichtigung" + +#: includes/include.todo.popup.php:82 +#: includes/include.mycontenido.tasks.edit.php:81 +msgid "Reminder options" +msgstr "Erinnerungsoptionen" + +#: includes/include.todo.popup.php:124 +#: includes/include.mycontenido.tasks.edit.php:65 +msgid "Assigned to" +msgstr "Zugewiesen zu" + +#: includes/include.lay_new.php:38 +msgid "New Layout" +msgstr "Neues Layout" + +#: includes/functions.general.php:103 +#: classes/datatypes/class.datatype.datetime.php:140 +msgid "January" +msgstr "Januar" + +#: includes/functions.general.php:106 +#: classes/datatypes/class.datatype.datetime.php:141 +msgid "February" +msgstr "Februar" + +#: includes/functions.general.php:109 +#: classes/datatypes/class.datatype.datetime.php:142 +msgid "March" +msgstr "März" + +#: includes/functions.general.php:112 +#: classes/datatypes/class.datatype.datetime.php:143 +msgid "April" +msgstr "April" + +#: includes/functions.general.php:115 +#: classes/datatypes/class.datatype.datetime.php:144 +msgid "May" +msgstr "Mai" + +#: includes/functions.general.php:118 +#: classes/datatypes/class.datatype.datetime.php:145 +msgid "June" +msgstr "Juni" + +#: includes/functions.general.php:121 +#: classes/datatypes/class.datatype.datetime.php:146 +msgid "July" +msgstr "Juli" + +#: includes/functions.general.php:124 +#: classes/datatypes/class.datatype.datetime.php:147 +msgid "August" +msgstr "August" + +#: includes/functions.general.php:127 +#: classes/datatypes/class.datatype.datetime.php:148 +msgid "September" +msgstr "September" + +#: includes/functions.general.php:130 +#: classes/datatypes/class.datatype.datetime.php:149 +msgid "October" +msgstr "Oktober" + +#: includes/functions.general.php:133 +#: classes/datatypes/class.datatype.datetime.php:150 +msgid "November" +msgstr "November" + +#: includes/functions.general.php:136 +#: classes/datatypes/class.datatype.datetime.php:151 +msgid "December" +msgstr "Dezember" + +#: includes/functions.general.php:150 +#: classes/datatypes/class.datatype.datetime.php:160 +msgid "Monday" +msgstr "Montag" + +#: includes/functions.general.php:153 +#: classes/datatypes/class.datatype.datetime.php:161 +msgid "Tuesday" +msgstr "Dienstag" + +#: includes/functions.general.php:156 +#: classes/datatypes/class.datatype.datetime.php:162 +msgid "Wednesday" +msgstr "Mittwoch" + +#: includes/functions.general.php:159 +#: classes/datatypes/class.datatype.datetime.php:163 +msgid "Thursday" +msgstr "Donnerstag" + +#: includes/functions.general.php:162 +#: classes/datatypes/class.datatype.datetime.php:164 +msgid "Friday" +msgstr "Freitag" + +#: includes/functions.general.php:165 +msgid "Saterday" +msgstr "Samstag" + +#: includes/functions.general.php:168 +#: classes/datatypes/class.datatype.datetime.php:159 +#: classes/datatypes/class.datatype.datetime.php:166 +msgid "Sunday" +msgstr "Sonntag" + +#: includes/functions.general.php:1977 +#, php-format +msgid "MySQL Database not reachable for installation %s" +msgstr "MySQL-Datenbank für die Installation %s ist nicht erreichbar " + +#: includes/functions.general.php:1980 +#, php-format +msgid "" +"The MySQL Database for the installation %s is not reachable. Please check if " +"this is a temporary problem or if it is a real fault." +msgstr "" +"Die MySQL-Datenbank für die Installation %s ist nicht erreichbar. Bitte " +"prüfen Sie, ob dies ein temporäres Problem oder ein wirklicher " +"Fehler ist." + +#: includes/rights_mod.inc.php:75 includes/grouprights_mod.inc.php:73 +msgid "Module name" +msgstr "Modulname" + +#: includes/include.client_artspec.php:79 +#: includes/include.con_edit_form.php:241 +msgid "Article specification" +msgstr "Artikelspezifikation" + +#: includes/include.client_artspec.php:80 +#: includes/include.mycontenido.tasks.php:397 +#: includes/include.mycontenido_settings.php:127 +#: includes/include.lay_edit_form.php:207 +msgid "Options" +msgstr "Optionen" + +#: includes/include.client_artspec.php:90 +#: includes/include.systemsettings.php:71 +#: includes/include.systemsettings.php:75 +#: includes/include.clientsettings.php:114 includes/include.upl_edit.php:66 +msgid "Edit" +msgstr "Bearbeiten" + +#: includes/include.client_artspec.php:94 +#: includes/include.systemsettings.php:79 +#: includes/include.systemsettings.php:81 +#: includes/include.clientsettings.php:108 +msgid "Delete" +msgstr "Löschen" + +#: includes/include.client_artspec.php:131 +msgid "Save" +msgstr "Speichern" + +#: includes/include.client_artspec.php:140 +#: includes/include.con_art_overview.php:601 +#: includes/include.str_overview.php:957 includes/include.str_overview.php:959 +#: backend_search.php:652 scripts/HTMLObj.js.php:242 +#: scripts/HTMLObj.js.php:245 scripts/langref.php:9 +msgid "Make online" +msgstr "Online setzen" + +#: includes/include.client_artspec.php:144 +#: includes/include.con_art_overview.php:593 backend_search.php:648 +#: scripts/HTMLObj.js.php:239 scripts/langref.php:8 +msgid "Make offline" +msgstr "Offline setzen" + +#: includes/include.client_artspec.php:150 +msgid "Make this article specification default" +msgstr "Diese Artikelspezifikation als Standard definieren" + +#: includes/include.client_artspec.php:154 +msgid "This article specification is default" +msgstr "Diese Artikelspezifikation ist Standard" + +#: includes/include.client_artspec.php:163 +#: includes/include.con_edit_form.php:238 +msgid "No article specifications found!" +msgstr "Keine Artikelspezifikation gefunden" + +#: includes/include.client_artspec.php:173 +msgid "Create new article specification" +msgstr "Neue Artikelspezifikation erstellen" + +#: includes/include.client_artspec.php:176 +msgid "Specification name" +msgstr "Name der Spezifikation" + +#: includes/include.mycontenido.tasks.php:128 +msgid "No status type set" +msgstr "Kein Status-Typ gesetzt" + +#: includes/include.mycontenido.tasks.php:155 +#, php-format +msgid "%d %% complete" +msgstr "%d %% fertig" + +#: includes/include.mycontenido.tasks.php:196 +msgid "Today" +msgstr "Heute" + +#: includes/include.mycontenido.tasks.php:201 +#: includes/include.mycontenido.tasks.php:203 +msgid "Day(s)" +msgstr "Tag(e)" + +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.con_edit_form.php:284 includes/include.upl_artlist.php:81 +#: templates/standard/template.mycontenido_lastarticles.html:64 +msgid "Created" +msgstr "Erstelldatum" + +#: includes/include.mycontenido.tasks.php:276 +msgid "End Date" +msgstr "Enddatum" + +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.mycontenido.tasks.edit.php:137 +#: includes/include.stat_overview.php:90 includes/include.mod_package.php:252 +#: includes/include.mod_package.php:361 includes/include.mod_package.php:366 +msgid "Status" +msgstr "Status" + +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.mycontenido.tasks.edit.php:132 +msgid "Priority" +msgstr "Priorität" + +#: includes/include.mycontenido.tasks.php:276 +#, php-format +msgid "%% complete" +msgstr "%% fertig" + +#: includes/include.mycontenido.tasks.php:276 +msgid "Due in" +msgstr "Fällig in" + +#: includes/include.mycontenido.tasks.php:302 +msgid "Unnamed item" +msgstr "Unbenannter Eintrag" + +#: includes/include.mycontenido.tasks.php:307 +msgid "No end date set" +msgstr "Kein Enddatum definiert" + +#: includes/include.mycontenido.tasks.php:314 +msgid "No status set" +msgstr "Kein Status gesetzt" + +#: includes/include.mycontenido.tasks.php:338 +msgid "Delete item" +msgstr "Element löschen" + +#: includes/include.mycontenido.tasks.php:345 +msgid "Edit item" +msgstr "Element bearbeiten" + +#: includes/include.mycontenido.tasks.php:376 +msgid "Restrict display" +msgstr "Anzeige einschränken" + +#: includes/include.mycontenido.tasks.php:380 classes/class.version.php:522 +msgid "Refresh" +msgstr "Aktualisieren" + +#: includes/include.mycontenido.tasks.php:386 +msgid "Hide done tasks" +msgstr "Erledigte Aufgaben ausblenden" + +#: includes/include.mycontenido.tasks.php:401 +msgid "No tasks found" +msgstr "Keine Aufgaben gefunden" + +#: includes/include.systemsettings.php:47 +msgid "Please set this property in systemsettings directly" +msgstr "Bitte setzen Sie diese Einstellung direkt in den Systemeinstellungen" + +#: includes/include.systemsettings.php:157 +#: includes/include.clientsettings.php:172 +msgid "No defined properties" +msgstr "Keine definierten Eigenschaften" + +#: includes/include.systemsettings.php:167 +#: includes/include.clientsettings.php:181 +msgid "Add new variable" +msgstr "Neue Variable hinzufügen" + +#: includes/include.con_edit_form.php:134 +#: includes/include.tplcfg_edit_form.php:57 +#: external/backendedit/front_content.php:484 +#: external/frontend/front_content.php:494 +#, php-format +msgid "Article is in use by %s (%s)" +msgstr "Artikel wird benutzt von %s (%s)" + +#: includes/include.con_edit_form.php:208 +#: includes/include.con_art_overview.php:78 +#: includes/include.con_art_overview.php:746 +#: includes/include.stat_overview.php:89 includes/include.upl_artlist.php:81 +#: backend_search.php:492 +#: templates/standard/template.mycontenido_lastarticles.html:62 +msgid "Title" +msgstr "Titel" + +#: includes/include.con_edit_form.php:211 +#: includes/include.str_overview.php:509 +#: templates/standard/template.str_overview.html:133 +#: templates/standard/template.str_overview.html:227 +msgid "Alias" +msgstr "Alias" + +#: includes/include.con_edit_form.php:253 +msgid "Articlelink" +msgstr "Artikellink" + +#: includes/include.con_edit_form.php:260 +msgid "Select an entry to display link" +msgstr "Eintrag wählen, um einen Link anzuzeigen" + +#: includes/include.con_edit_form.php:261 +msgid "Article only" +msgstr "Nur Artikel" + +#: includes/include.con_edit_form.php:262 +msgid "Article with Category" +msgstr "Artikel mit Kategorie" + +#: includes/include.con_edit_form.php:263 +msgid "Article with Category and Language" +msgstr "Artikel mit Kategorie und Sprache" + +#: includes/include.con_edit_form.php:264 +msgid "Article with Language" +msgstr "Artikel mit Sprache" + +#: includes/include.con_edit_form.php:278 +msgid "Author (Creator)" +msgstr "erstellt von" + +#: includes/include.con_edit_form.php:288 +msgid "Author (Modifier)" +msgstr "verändert von" + +#: includes/include.con_edit_form.php:289 +msgid "Last modified" +msgstr "Änderungsdatum" + +#: includes/include.con_edit_form.php:293 +msgid "Publishing date" +msgstr "Veröffentlichungsdatum" + +#: includes/include.con_edit_form.php:297 +#: includes/include.con_art_overview.php:354 +msgid "not yet published" +msgstr "noch nicht veröffentlicht" + +#: includes/include.con_edit_form.php:300 +msgid "Publisher" +msgstr "veröffentlicht von" + +#: includes/include.con_edit_form.php:308 +msgid "Redirect" +msgstr "Weiterleitung" + +#: includes/include.con_edit_form.php:324 +msgid "New Window" +msgstr "Neues Fenster" + +#: includes/include.con_edit_form.php:350 +#: includes/include.con_art_overview.php:553 +msgid "Start article" +msgstr "Startartikel" + +#: includes/include.con_edit_form.php:354 +#: includes/include.con_art_overview.php:841 +msgid "Sort key" +msgstr "Sortierschlüssel" + +#: includes/include.con_edit_form.php:391 includes/cfg_language_de.inc.php:114 +msgid "Remove assignments" +msgstr "Zuweisungen entfernen" + +#: includes/include.con_edit_form.php:393 +msgid "Remove multiple category assignments" +msgstr "Mehrfachzuordnung entfernen" + +#: includes/include.con_edit_form.php:394 +msgid "" +"Do you really want to remove the assignments to all categories except the " +"current one?" +msgstr "" +"Möchten Sie wirklich alle Zuweisungen zu allen Kategorien außer " +"der aktuellen entfernen?" + +#: includes/include.con_edit_form.php:410 +msgid "" +"Language parts of the articles are existing in other languages and are " +"online. To change the category assignment, please set the other articles " +"offline first." +msgstr "" +"Sprachabhängige Teile dieses Artikels existieren in anderen Sprachen " +"und sind online. Um die Kategoriezuweisung zu verändern, setzen Sie die " +"anderen sprachabhängigen Teile zuerst offline." + +#: includes/include.con_edit_form.php:510 includes/grouprights_str.inc.php:76 +#: includes/rights_con.inc.php:78 includes/include.con_editcontent.php:387 +#: includes/grouprights_con.inc.php:78 includes/rights_str.inc.php:77 +#: includes/include.note.popup.php:93 +#: templates/standard/template.symbolhelp.html:41 +#: templates/standard/template.symbolhelp.html:472 +#: templates/standard/template.str_overview.html:124 +#: templates/standard/template.str_overview.html:224 +#: templates/standard/template.mycontenido_lastarticles.html:63 +#: templates/standard/template.log_main.html:52 +#: classes/class.cms_teaser.php:595 classes/class.ajax.php:153 +msgid "Category" +msgstr "Kategorie" + +#: includes/include.con_edit_form.php:549 +msgid "Choose Startdate" +msgstr "Startzeitpunkt wählen" + +#: includes/include.con_edit_form.php:550 +msgid "Choose Enddate" +msgstr "Endzeitpunkt wählen" + +#: includes/include.con_edit_form.php:648 +msgid "Select date" +msgstr "Datum auswählen" + +#: includes/include.con_edit_form.php:685 +msgid "Summary" +msgstr "Zusammenfassung" + +#: includes/include.CMS_EASYIMG.php:153 +msgid "Upload image" +msgstr "Bild hochladen" + +#: includes/include.CMS_EASYIMG.php:157 includes/include.client_edit.php:228 +#: includes/include.grouprights_overview.php:103 +#: includes/include.rights_overview.php:193 +msgid "Discard changes" +msgstr "Ängerungen verwerfen" + +#: includes/grouprights_str.inc.php:212 includes/rights_con.inc.php:223 +#: includes/grouprights_con.inc.php:237 includes/rights_str.inc.php:217 +msgid "" +"Apply rights for this category to all categories on the same level or above" +msgstr "" +"Rechte dieser Kategorie allen Kategorien auf derselben Ebene oder darü" +"ber zuweisen" + +#: includes/grouprights_str.inc.php:213 includes/rights_con.inc.php:224 +#: includes/grouprights_con.inc.php:238 includes/rights_str.inc.php:218 +msgid "" +"Apply rights for this category to all categories below the current category" +msgstr "" +"Rechte dieser Kategorie allen Kategorien unter dieser Kategorie zuweisen" + +#: includes/grouprights_str.inc.php:215 +#: includes/include.upl_dirs_overview.php:60 includes/rights_con.inc.php:227 +#: includes/include.str_overview.php:174 includes/grouprights_con.inc.php:241 +#: includes/rights_str.inc.php:221 +msgid "Close category" +msgstr "Kategorie schliessen" + +#: includes/include.upl_dirs_overview.php:153 +msgid "Failed to delete the following files:" +msgstr "Die folgenden Dateien konnten nicht gelöscht werden:" + +#: includes/include.upl_dirs_overview.php:159 +#, php-format +msgid "Failed to remove directory %s" +msgstr "Folgendes Verzeichnis konnte nicht verschoben werden: %s" + +#: includes/include.upl_dirs_overview.php:190 +msgid "Upload directory" +msgstr "Upload Verzeichnis" + +#: includes/include.upl_dirs_overview.php:194 +msgid "" +"The following directories contains invalid characters and were ignored: " +msgstr "" +"Die folgenden Verzeichnisnamen beinhalten ungültige Zeichen und wurden " +"daher ignoriert: " + +#: includes/include.upl_dirs_overview.php:197 +msgid "Please click here in order to rename automatically." +msgstr "" +"Bitte klicken Sie hier, um die Verzeichnisse automatisch umzubennennen." + +#: includes/include.upl_dirs_overview.php:319 +msgid "Categories" +msgstr "Kategorien" + +#: includes/include.upl_dirs_overview.php:400 +#: includes/include.upl_dirs_overview.php:547 +msgid "Delete directory" +msgstr "Verzeichnis löschen" + +#: includes/include.upl_dirs_overview.php:400 +#: includes/include.upl_dirs_overview.php:547 +msgid "Do you really want to delete the following directory:" +msgstr "" +"Möchten Sie das folgende Verzeichnis wirklich löschen:

    " + +#: includes/include.upl_dirs_overview.php:405 +#: includes/include.upl_dirs_overview.php:552 +msgid "Directory contains files" +msgstr "Verzeichnis enthält Dateien" + +#: includes/include.upl_dirs_overview.php:454 +msgid "Database Filesystem" +msgstr "Datenbank-Dateisystem" + +#: includes/include.tplcfg_edit_form.php:76 +#, php-format +msgid "Category Template configuration is in use by %s (%s)" +msgstr "Templatekonfiguration (Kategorie) wird benutzt von %s (%s)" + +#: includes/include.tplcfg_edit_form.php:276 +#: includes/include.con_art_overview.php:82 +#: includes/include.pretplcfg_edit_form.php:76 backend_search.php:496 +#: templates/standard/template.str_overview.html:230 +#: templates/standard/template.mycontenido_lastarticles.html:66 +msgid "Template" +msgstr "Template" + +#: includes/include.tplcfg_edit_form.php:352 +msgid "Module in container" +msgstr "Modul in Container" + +#: includes/include.tplcfg_edit_form.php:476 +msgid "Categorytemplate configuration" +msgstr "Kategorietemplate konfigurieren" + +#: includes/include.tplcfg_edit_form.php:479 +msgid "Articletemplate configuration" +msgstr "Artikeltemplate konfigurieren" + +#: includes/include.rights_menu.php:133 +#: includes/include.frontend.user_menu.php:273 +#: includes/include.frontend.left_top.php:395 +#, php-format +msgid "Do you really want to delete the user %s?" +msgstr "" +"Möchten Sie den folgenden Benutzer wirklich löschen:

    %s" + +#: includes/include.rights_menu.php:135 +#: includes/include.frontend.user_menu.php:275 +#: includes/cfg_language_de.inc.php:172 +#: includes/include.frontend.left_top.php:397 +msgid "Delete user" +msgstr "Benutzer löschen" + +#: includes/include.info.php:38 +#, fuzzy +msgid "" +"You can find a lot of information and a community forum on the ConLite Portal" +msgstr "" +"Alle Informationen zu ConLite und das ConLite Community Forum finden Sie auf " +"dem ConLite Portal" + +#: includes/include.CMS_HTMLHEAD.php:100 includes/include.CMS_HTML.php:98 +msgid "Save without leaving the editor" +msgstr "Speichern und im Editor bleiben" + +#: includes/include.CMS_HTMLHEAD.php:101 includes/include.CMS_HTML.php:99 +msgid "Save and close editor" +msgstr "Speichern und Editor schließen" + +#: includes/functions.tpl.php:436 includes/functions.con.php:1837 +#: includes/functions.str.php:1387 +#, php-format +msgid "%s (Copy)" +msgstr "%s (Kopie)" + +#: includes/include.con_left_top.php:135 +msgid "Ignore" +msgstr "Ignorieren" + +#: includes/include.con_left_top.php:136 classes/class.cms_filelist.php:444 +msgid "Date created" +msgstr "Erstelldatum" + +#: includes/include.con_left_top.php:137 classes/class.cms_filelist.php:447 +msgid "Date modified" +msgstr "Änderungsdatum" + +#: includes/include.con_left_top.php:138 +msgid "Date published" +msgstr "Veröffentlichungsdatum" + +#: includes/include.con_left_top.php:141 +msgid "Article Search" +msgstr "Artikelsuche" + +#: includes/include.con_left_top.php:237 +#: templates/standard/template.recipient_menu.html:92 +msgid "Search" +msgstr "Suche" + +#: includes/include.con_left_top.php:250 +msgid "Title/Content" +msgstr "Titel/Inhalt" + +#: includes/include.con_left_top.php:255 +msgid "Article ID" +msgstr "Artikel-ID" + +#: includes/include.con_left_top.php:260 +msgid "Datum" +msgstr "Datum" + +#: includes/include.con_left_top.php:265 +msgid "Date from" +msgstr "Datum von" + +#: includes/include.con_left_top.php:270 +msgid "Date to" +msgstr "Datum bis" + +#: includes/include.con_left_top.php:291 +msgid "Saved Searches" +msgstr "Gespeicherte Suchen" + +#: includes/include.con_left_top.php:302 +#: includes/include.mycontenido_lastarticles.php:137 +#: includes/main.login.php:211 +msgid "Recently edited articles" +msgstr "Zuletzt bearbeitete Artikel" + +#: includes/include.con_left_top.php:306 +msgid "My articles" +msgstr "Meine Artikel" + +#: includes/include.con_left_top.php:311 +msgid "Workflow" +msgstr "Workflow" + +#: includes/include.con_left_top.php:369 scripts/HTMLObj.js.php:254 +#: scripts/langref.php:12 +msgid "Choose template" +msgstr "Template wählen" + +#: includes/include.con_left_top.php:379 +msgid "Edit Category" +msgstr "Kategorie bearbeiten" + +#: includes/include.con_left_top.php:395 +msgid "Template:" +msgstr "Template:" + +#: includes/include.con_left_top.php:404 includes/include.con_left_top.php:405 +msgid "Configure Category" +msgstr "Kategorie konfigurieren" + +#: includes/include.con_left_top.php:407 includes/include.con_left_top.php:408 +msgid "Online / Offline" +msgstr "Online / Offline" + +#: includes/include.con_left_top.php:410 includes/include.con_left_top.php:411 +msgid "Lock / Unlock" +msgstr "Schützen / Freigeben" + +#: includes/include.con_left_top.php:428 +msgid "close all" +msgstr "alle schließen" + +#: includes/include.con_left_top.php:428 +#: includes/include.con_str_overview.php:612 +#: includes/include.str_overview.php:486 includes/include.str_overview.php:487 +#: includes/include.str_overview.php:488 +#: templates/standard/template.stat_overview.html:135 +msgid "Close all categories" +msgstr "Alle Kategorien schließen" + +#: includes/include.con_left_top.php:429 +msgid "open all" +msgstr "alle öffnen" + +#: includes/include.con_left_top.php:429 +#: includes/include.con_str_overview.php:613 +#: includes/include.str_overview.php:493 includes/include.str_overview.php:494 +#: includes/include.str_overview.php:495 +#: templates/standard/template.stat_overview.html:137 +msgid "Open all categories" +msgstr "Alle Kategorien öffnen" + +#: includes/include.con_left_top.php:439 +msgid "Synchronize from" +msgstr "Synchronisieren von" + +#: includes/include.con_left_top.php:472 includes/include.con_left_top.php:473 +msgid "Copy to current language" +msgstr "In die aktuelle Sprache kopieren" + +#: includes/include.con_left_top.php:474 includes/include.con_left_top.php:475 +msgid "Also copy subcategories" +msgstr "Unterkategorien mit kopieren" + +#: includes/include.con_art_overview.php:77 +#: includes/include.con_editcontent.php:382 +#: includes/include.con_subnav.php:104 backend_search.php:491 +#: templates/standard/template.symbolhelp.html:38 +#: templates/standard/template.symbolhelp.html:283 +#: templates/standard/template.log_main.html:53 +#: classes/class.cms_teaser.php:596 classes/class.ajax.php:170 +msgid "Article" +msgstr "Artikel" + +#: includes/include.con_art_overview.php:79 backend_search.php:493 +msgid "Changed" +msgstr "Geändert" + +#: includes/include.con_art_overview.php:80 backend_search.php:494 +msgid "Published" +msgstr "Veröffentlicht" + +#: includes/include.con_art_overview.php:81 +#: includes/include.rights_left_top.php:155 +#: includes/include.frontend.left_top.php:257 includes/include.mod_new.php:161 +#: backend_search.php:495 classes/class.cms_teaser.php:588 +#: classes/class.cms_filelist.php:738 +msgid "Sort order" +msgstr "Sortierreihenfolge" + +#: includes/include.con_art_overview.php:369 +msgid "Article is in use" +msgstr "Artikel wird benutzt" + +#: includes/include.con_art_overview.php:370 +#, php-format +msgid "Article in use by %s (%s)" +msgstr "Artikel wird benutzt von %s (%s)" + +#: includes/include.con_art_overview.php:436 backend_search.php:658 +msgid "Unfreeze article" +msgstr "Artikel auftauen" + +#: includes/include.con_art_overview.php:439 +#: includes/cfg_language_de.inc.php:98 backend_search.php:661 +msgid "Freeze article" +msgstr "Artikel einfrieren" + +#: includes/include.con_art_overview.php:446 +msgid "Article is frozen" +msgstr "Artikel ist eingefroren" + +#: includes/include.con_art_overview.php:449 +msgid "Article is not frozen" +msgstr "Artikel ist nicht eingefroren" + +#: includes/include.con_art_overview.php:472 backend_search.php:676 +msgid "Article properties" +msgstr "Artikeleigenschaften" + +#: includes/include.con_art_overview.php:486 +msgid "Copy article to the current language" +msgstr "Artikel in die aktuelle Sprache kopieren" + +#: includes/include.con_art_overview.php:547 backend_search.php:635 +msgid "Flag as start article" +msgstr "Als Startartikel markieren" + +#: includes/include.con_art_overview.php:549 backend_search.php:632 +msgid "Flag as normal article" +msgstr "Als normalen Artikel markieren" + +#: includes/include.con_art_overview.php:555 +msgid "Normal article" +msgstr "Normaler Artikel" + +#: includes/include.con_art_overview.php:569 backend_search.php:675 +#: templates/standard/template.symbolhelp.html:413 +msgid "Duplicate article" +msgstr "Artikel duplizieren" + +#: includes/include.con_art_overview.php:581 +#, php-format +msgid "Reminder for Article '%s'" +msgstr "Wiedervorlage für Artikel '%s'" + +#: includes/include.con_art_overview.php:584 +#, php-format +msgid "" +"Reminder for Article '%s'\n" +"Category: %s" +msgstr "" +"Wiedervorlage für Artikel '%s'\n" +"Kategorie: %s" + +#: includes/include.con_art_overview.php:595 +#: includes/include.mycontenido_lastarticles.php:221 +msgid "Article is online" +msgstr "Artikel ist online" + +#: includes/include.con_art_overview.php:603 +#: includes/include.mycontenido_lastarticles.php:224 +msgid "Article is offline" +msgstr "Artikel ist offline" + +#: includes/include.con_art_overview.php:625 +#, php-format +msgid "Are you sure to delete the following article:

    %s" +msgstr "" +"Möchten Sie den folgenden Artikel wirklich löschen:

    %s" + +#: includes/include.con_art_overview.php:626 +#: includes/cfg_language_de.inc.php:106 backend_search.php:678 +#: templates/standard/template.symbolhelp.html:425 +msgid "Delete article" +msgstr "Artikel löschen" + +#: includes/include.con_art_overview.php:771 +#: includes/include.con_art_overview.php:774 +#, php-format +msgid "Go to page: %s" +msgstr "Gehe zu Seite: %s" + +#: includes/include.con_art_overview.php:777 +msgid "with click select line for further treatment" +msgstr "mit Klick Zeile zur weiteren Bearbeitung auswählen" + +#: includes/include.con_art_overview.php:832 +#: includes/include.con_art_overview.php:938 +msgid "No articles found" +msgstr "Keine Artikel gefunden" + +#: includes/include.con_art_overview.php:838 +msgid "Alphabetical" +msgstr "Alphabetisch" + +#: includes/include.con_art_overview.php:839 +msgid "Last change" +msgstr "Letzte Änderung" + +#: includes/include.con_art_overview.php:840 +msgid "Published date" +msgstr "Veröffentlichungsdatum" + +#: includes/include.con_art_overview.php:860 +msgid "Sort articles:" +msgstr "Sortierung:" + +#: includes/include.con_art_overview.php:887 +msgid "Items per page:" +msgstr "Elemente/Seite:" + +#: includes/include.con_art_overview.php:988 +#: includes/include.con_art_overview.php:989 +#: templates/standard/template.symbolhelp.html:329 +msgid "Create new article" +msgstr "Neuen Artikel erstellen" + +#: includes/include.frontend.user_menu.php:53 +#: includes/include.frontend.left_top.php:58 +msgid "-- All fields --" +msgstr "-- Alle Felder --" + +#: includes/include.frontend.user_menu.php:53 +#: includes/include.frontend.user_menu.php:54 +#: includes/include.rights_overview.php:203 +#: includes/include.frontend.left_top.php:58 +#: includes/include.frontend.left_top.php:59 +#: includes/include.rights_create.php:150 +msgid "Username" +msgstr "Benutzername" + +#: includes/include.frontend.user_menu.php:112 +#: includes/include.rights_left_top.php:118 +#: includes/include.frontend.left_top.php:118 includes/include.mod_new.php:88 +#: classes/class.cms_teaser.php:423 classes/class.cms_filelist.php:465 +msgid "Ascending" +msgstr "Aufsteigend" + +#: includes/include.frontend.user_menu.php:112 +#: includes/include.rights_left_top.php:119 +#: includes/include.frontend.left_top.php:118 includes/include.mod_new.php:88 +#: classes/class.cms_teaser.php:426 classes/class.cms_filelist.php:468 +msgid "Descending" +msgstr "Absteigend" + +#: includes/include.frontend.user_menu.php:114 +#: includes/include.rights_left_top.php:123 +#: includes/include.frontend.left_top.php:193 includes/include.mod_new.php:94 +msgid "List options" +msgstr "Anzeigeoptionen" + +#: includes/include.frontend.user_menu.php:139 +#: includes/include.frontend.left_top.php:228 +msgid "-- All Groups --" +msgstr "-- Alle Gruppen --" + +#: includes/include.mycontenido.tasks.edit.php:43 +msgid "Edit Reminder item" +msgstr "Wiedervorlage bearbeiten" + +#: includes/include.mycontenido.tasks.edit.php:77 +msgid "E-Mail notification" +msgstr "E-Mail Benachrichtigung" + +#: includes/include.mycontenido.tasks.edit.php:140 +msgid "Progress" +msgstr "Fortschritt" + +#: includes/grouprights_tpl.inc.php:72 includes/rights_tpl.inc.php:73 +#: classes/class.ajax.php:105 classes/class.ajax.php:129 +msgid "Template name" +msgstr "Templatename" + +#: includes/include.upl_search_results.php:204 +#: includes/include.upl_search_results.php:209 +#: includes/include.upl_search_results.php:212 +#: includes/include.upl_edit.php:92 +msgid "Path" +msgstr "Pfad" + +#: includes/include.upl_search_results.php:246 +#: includes/include.upl_search_results.php:251 +#: includes/include.upl_search_results.php:254 +msgid "Relevance" +msgstr "Relevanz" + +#: includes/include.upl_search_results.php:260 +msgid "Searched for:" +msgstr "Suchbegriff:" + +#: includes/include.client_edit.php:52 +msgid "No client ID passed" +msgstr "Keine ClientID übergeben" + +#: includes/include.client_edit.php:65 +msgid "" +"Notice: In order to use this client, you must create a new language for it." +msgstr "" +"Hinweis: Um den neuen Mandanten zu nutzen, müssen Sie eine neue Sprache " +"dafür anlegen." + +#: includes/include.client_edit.php:69 +#, php-format +msgid "Please click %shere%s to create a new language." +msgstr "Bitte klicken Sie %shier%s, um dies zu tun." + +#: includes/include.client_edit.php:110 +msgid "Couldn't write the file config.php." +msgstr "Konnte die Datei config.php nicht schreiben" + +#: includes/include.client_edit.php:118 +#, php-format +msgid "Succesfully copied client-template to %s." +msgstr "Mandantentemplate erfolgreich nach %s kopiert." + +#: includes/include.client_edit.php:121 +#, php-format +msgid "" +"Cannot create directory %s . The client was created, but you have to copy " +"the frontend-template yourself" +msgstr "" +"Kann Verzeichnis %s nicht erstellen. Der Mandant wurde erstellt, das " +"Frontend-Template muß jedoch noch dorthin kopiert werden" + +#: includes/include.client_edit.php:125 +#, php-format +msgid "" +"The directory %s already exists. The client was created, but you have to " +"copy the frontend-template yourself" +msgstr "" +"Das Verzeichnis %s existiert bereits. Der Mandant wurde erstellt, das " +"Frontend-Template muß jedoch noch dorthin kopiert werden" + +#: includes/include.client_edit.php:129 +#, php-format +msgid "Client '%s' created." +msgstr "Mandant '%s erstellt." + +#: includes/include.client_edit.php:147 +msgid "" +"You changed the client path. You might need to copy the frontend to the new " +"location" +msgstr "" +"Der Mandanten-Pfad wurde geändert. Das Frontend muss eventuell an die " +"neue Position kopiert werden." + +#: includes/include.client_edit.php:245 +msgid "Client name" +msgstr "Name des Mandanten" + +#: includes/include.client_edit.php:261 +msgid "Server path" +msgstr "Server-Pfad" + +#: includes/include.client_edit.php:277 +msgid "Web address" +msgstr "Web-Adresse" + +#: includes/include.client_edit.php:286 +msgid "Error page category" +msgstr "Fehlerseiten-Kategorie" + +#: includes/include.client_edit.php:295 +msgid "Error page article" +msgstr "Fehlerseiten-Artikel" + +#: includes/include.client_edit.php:306 +msgid "Client logo" +msgstr "Mandantenlogo" + +#: includes/include.client_edit.php:315 +msgid "HTML" +msgstr "HTML" + +#: includes/include.client_edit.php:315 +msgid "XHTML" +msgstr "XHTML" + +#: includes/include.client_edit.php:315 +msgid "HTML5" +msgstr "HTML5" + +#: includes/include.client_edit.php:330 +msgid "Generate" +msgstr "Erstelle" + +#: includes/include.client_edit.php:341 +msgid "Copy frontend template" +msgstr "Frontend-Template kopieren" + +#: includes/include.rights_left_top.php:103 +#: includes/cfg_language_de.inc.php:171 includes/cfg_language_de.inc.php:174 +#: includes/include.frontend.left_top.php:178 +#: templates/standard/template.symbolhelp.html:1835 +msgid "Create user" +msgstr "Benutzer erstellen" + +#: includes/include.rights_left_top.php:147 +#: includes/include.frontend.left_top.php:249 includes/include.mod_new.php:153 +msgid "Items / page" +msgstr "Elemente / Seite" + +#: includes/include.rights_left_top.php:151 +#: includes/include.frontend.left_top.php:253 includes/include.mod_new.php:157 +msgid "Sort by" +msgstr "Sortieren nach" + +#: includes/include.rights_left_top.php:164 +#: includes/include.frontend.left_top.php:274 includes/include.mod_new.php:178 +msgid "Apply" +msgstr "Anwenden" + +#: includes/include.mycontenido_settings.php:57 +msgid "Old password incorrect" +msgstr "Altes Passwort nicht korrekt" + +#: includes/include.mycontenido_settings.php:62 +#: includes/include.rights_overview.php:132 +#: includes/include.rights_create.php:122 +msgid "Passwords don't match" +msgstr "Passwörter stimmen nicht überein" + +#: includes/include.mycontenido_settings.php:77 +msgid "Password changed" +msgstr "Passwort geändert" + +#: includes/include.mycontenido_settings.php:97 +#, php-format +msgid "Settings for %s" +msgstr "Einstellungen für %s" + +#: includes/include.mycontenido_settings.php:115 +msgid "Old password" +msgstr "Altes Passwort" + +#: includes/include.mycontenido_settings.php:117 +#: includes/include.rights_overview.php:223 +#: includes/include.rights_create.php:168 +msgid "Confirm new password" +msgstr "Neues Passwort bestätigen" + +#: includes/include.mycontenido_settings.php:121 +#: includes/include.rights_overview.php:230 +#: includes/include.rights_create.php:174 +msgid "E-Mail" +msgstr "E-Mail" + +#: includes/include.mycontenido_settings.php:125 +msgid "Use WYSIWYG Editor" +msgstr "WYSIWYG-Editor benutzen" + +#: includes/include.mycontenido_settings.php:129 +msgid "The format is equal to PHP's date() function." +msgstr "Das Format stimmt mit dem der PHP date()-Funktion überein" + +#: includes/include.mycontenido_settings.php:131 +msgid "Common date formattings" +msgstr "Gebräuchliche Datumsformatierungen" + +#: includes/include.mod_edit_form.php:54 includes/include.lay_overview.php:78 +#: includes/include.mod_overview.php:209 includes/include.str_overview.php:741 +msgid "No permission" +msgstr "Kein Zugriff" + +#: includes/include.mod_edit_form.php:58 +#: classes/contenido/class.module.php:395 +msgid "- Unnamed Module -" +msgstr "- Unbenanntes Modul -" + +#: includes/include.mod_edit_form.php:59 +msgid "" +msgstr "" + +#: includes/include.mod_edit_form.php:59 +msgid "Author: " +msgstr "Autor:" + +#: includes/include.mod_edit_form.php:59 +msgid "Version:" +msgstr "Version:" + +#: includes/include.mod_edit_form.php:77 includes/include.mod_package.php:219 +#: includes/include.mod_package.php:357 +#, php-format +msgid "Error while importing XML file: %s" +msgstr "Fehler beim importieren der XML-Datei %s" + +#: includes/include.mod_edit_form.php:88 +msgid "Module folder created" +msgstr "Modulverzeichnis erstellt" + +#: includes/include.mod_edit_form.php:91 +msgid "Error while creating module folder" +msgstr "Fehler beim Erstellen des Modulverzeichisses" + +#: includes/include.mod_edit_form.php:106 includes/include.mod_package.php:398 +#, php-format +msgid "Module is in use by %s (%s)" +msgstr "Modul wird benutzt von %s (%s)" + +#: includes/include.mod_edit_form.php:127 includes/cfg_language_de.inc.php:157 +msgid "Edit module" +msgstr "Modul bearbeiten" + +#: includes/include.mod_edit_form.php:299 +#: includes/include.mod_edit_form.php:301 +msgid "Custom" +msgstr "Benutzerdefiniert" + +#: includes/include.mod_edit_form.php:324 +#: includes/include.mod_edit_form.php:333 +#, php-format +msgid "Error in module. Error location: %s" +msgstr "Fehler in Modul. Fehlerquelle: %s" + +#: includes/include.mod_edit_form.php:327 +#: includes/include.mod_edit_form.php:336 +msgid "Module successfully compiled" +msgstr "Modul erfolgreich kompiliert" + +#: includes/include.mod_edit_form.php:371 +msgid "Create Folder" +msgstr "Verzeichnis erstellen" + +#: includes/include.mod_edit_form.php:405 +#: includes/include.mod_edit_form.php:408 includes/include.mod_new.php:111 +msgid "Input" +msgstr "Eingabe" + +#: includes/include.mod_edit_form.php:406 +#: includes/include.mod_edit_form.php:409 includes/include.mod_new.php:112 +msgid "Output" +msgstr "Ausgabe" + +#: includes/include.mod_edit_form.php:415 +msgid "" +"This module uses variables and/or functions which are probably not available " +"in this Contenido version. Please make sure that you use up-to-date modules." +msgstr "" +"Dieses Modul verwendet Variablen und/oder Funktionen, die in dieser " +"Contenido-Version nicht mehr vorhanden sind. Bitte stellen Sie sicher, dass " +"Sie aktuelle Module verwenden." + +#: includes/include.mod_edit_form.php:423 +#: includes/include.mod_translate.php:174 includes/include.mod_package.php:454 +msgid "Import from file" +msgstr "Aus Datei importieren" + +#: includes/include.mod_edit_form.php:424 +#: includes/include.mod_translate.php:173 includes/include.mod_package.php:455 +msgid "Export to file" +msgstr "In Datei exportieren" + +#: includes/include.mod_edit_form.php:440 +#: includes/include.mod_translate.php:184 includes/include.mod_package.php:472 +msgid "Mode" +msgstr "Modus" + +#: includes/include.mod_edit_form.php:442 +#: includes/include.mod_edit_form.php:444 +#: includes/include.mod_translate.php:185 includes/include.mod_package.php:476 +#: includes/include.mod_package.php:478 classes/class.cms_filelist.php:745 +msgid "File" +msgstr "Datei" + +#: includes/grouprights.inc.php:215 +msgid "Current group doesn't have any rights to any client/language." +msgstr "" +"Die aktuelle Gruppe hat keine Zugriffsrechte auf irgendeine(n) Sprache bzw " +"Mandant" + +#: includes/include.lay_overview.php:82 +msgid "Layout is in use, cannot delete" +msgstr "Layout wird benutzt, löschen nicht möglich" + +#: includes/include.lay_overview.php:92 includes/cfg_language_de.inc.php:147 +msgid "Delete layout" +msgstr "Layout löschen" + +#: includes/include.lay_overview.php:93 +#, php-format +msgid "Do you really want to delete the following layout:

    %s
    " +msgstr "" +"Möchten Sie das folgende Layout wirklich löschen:

    %s" + +#: includes/include.lay_overview.php:118 +#, php-format +msgid "The layout '%s' is used for following templates" +msgstr "Das Layout '%s' wird bei folgenden Templates benutzt" + +#: includes/include.stat_overview.php:47 includes/include.stat_overview.php:60 +msgid "Full statistics" +msgstr "Alle Statistiken" + +#: includes/include.stat_overview.php:76 +msgid "Yearly" +msgstr "Jährlich" + +#: includes/include.stat_overview.php:80 +msgid "Current" +msgstr "Aktuell" + +#: includes/include.stat_overview.php:92 +#: templates/standard/template.symbolhelp.html:89 +#: templates/standard/template.symbolhelp.html:1472 +msgid "Hits" +msgstr "Hits" + +#: includes/include.stat_overview.php:94 +msgid "Hits in this language" +msgstr "Hits in dieser Sprache" + +#: includes/include.mod_history.php:94 +msgid "Edit Module" +msgstr "Modul bearbeiten" + +#: includes/include.mod_history.php:133 +msgid "Code Input" +msgstr "Code Input" + +#: includes/include.mod_history.php:134 +msgid "Code Output" +msgstr "Code Output" + +#: includes/include.mod_history.php:152 +msgid "No module history available" +msgstr "Keine Modul-Historie verfügbar" + +#: includes/include.js_history.php:171 +msgid "No jscript history available" +msgstr "Keine JavaScript-Historie verfügbar" + +#: includes/include.js_history.php:179 includes/include.style_history.php:176 +#: includes/include.style_history.php:184 +msgid "No style history available" +msgstr "Keine Style-Historie verfügbar" + +#: includes/include.mod_translate.php:138 +#, php-format +msgid "Translate module '%s'" +msgstr "Modul übersetzen \"%s\"" + +#: includes/include.mod_translate.php:147 +msgid "Translated Name" +msgstr "Übersetzter Name" + +#: includes/include.mod_translate.php:157 +msgid "Original module string" +msgstr "Ursprünglicher Modulstring" + +#: includes/include.mod_translate.php:157 +#, php-format +msgid "Translation for %s" +msgstr "Übersetzung für %s" + +#: includes/include.mod_translate.php:165 +msgid "" +"Hint: Hit ALT+SHIFT+S to save the translated entry and advance to the next " +"string." +msgstr "" +"Hinweis: Drücken Sie ALT+SHIFT+S, um den aktuellen Eintrag zu speichern " +"und zur nächsten Zeichenkette zu springen." + +#: includes/include.mod_translate.php:166 +msgid "String list" +msgstr "Zeichenkettenliste" + +#: includes/include.mod_package.php:139 +msgid "No elements available" +msgstr "Keine Elemente vorhanden" + +#: includes/include.mod_package.php:188 +msgid "Javascript files" +msgstr "Javascript-Dateien" + +#: includes/include.mod_package.php:189 +msgid "Module template files" +msgstr "Modul-Template-Dateien" + +#: includes/include.mod_package.php:190 +msgid "Style files" +msgstr "Style-Dateien" + +#: includes/include.mod_package.php:191 +#: templates/standard/template.symbolhelp.html:53 +#: templates/standard/template.symbolhelp.html:822 +msgid "Layouts" +msgstr "Layouts" + +#: includes/include.mod_package.php:192 +msgid "Translations" +msgstr "Übersetzung" + +#: includes/include.mod_package.php:238 +msgid "Skip" +msgstr "Überspringen" + +#: includes/include.mod_package.php:238 +msgid "Append" +msgstr "Hinzufügen" + +#: includes/include.mod_package.php:238 +msgid "Overwrite" +msgstr "Überschreiben" + +#: includes/include.mod_package.php:239 +msgid "OK" +msgstr "OK" + +#: includes/include.mod_package.php:240 +msgid "Assign" +msgstr "Zuordnen" + +#: includes/include.mod_package.php:241 +msgid "Conflict" +msgstr "Konflikt" + +#: includes/include.mod_package.php:242 +msgid "Ignored" +msgstr "Ignoriert" + +#: includes/include.mod_package.php:243 +msgid "- Select -" +msgstr "- Auswählen -" + +#: includes/include.mod_package.php:254 +#: templates/standard/template.log_main.html:26 +#: templates/standard/template.log_main.html:51 +msgid "Action" +msgstr "Aktion" + +#: includes/include.mod_package.php:311 +#: templates/standard/template.symbolhelp.html:181 +#: scripts/messageBox.js.php:79 scripts/langref.php:21 +msgid "Cancel" +msgstr "Abbrechen" + +#: includes/include.mod_package.php:312 +msgid "Import" +msgstr "Import" + +#: includes/include.mod_package.php:361 +msgid "Import was not succesful, please check data and try again" +msgstr "" +"Import nicht erfolgreich, bitte überprüfen Sie die Daten und " +"versuchen Sie es erneut" + +#: includes/include.mod_package.php:362 +msgid "Retry" +msgstr "Wiederholen" + +#: includes/include.mod_package.php:366 +msgid "Import succesfully finished" +msgstr "Import erfolgreich abgeschlossen" + +#: includes/include.mod_package.php:367 +msgid "Finish" +msgstr "Beenden" + +#: includes/include.mod_package.php:421 +msgid "Edit package" +msgstr "Package bearbeiten" + +#: includes/include.mod_package.php:442 +msgid "Package GUID" +msgstr "Package GUID" + +#: includes/include.clientsettings.php:50 +msgid "Select range" +msgstr "Bereich auswählen" + +#: includes/include.clientsettings.php:53 +msgid "Language independent" +msgstr "Sprachunabhängig" + +#: includes/include.clientsettings.php:79 +msgid "Range" +msgstr "Bereich" + +#: includes/include.system_db_backup.php:35 +msgid "Backupfolder missing or not writable!" +msgstr "Sicherungsverzeichnis fehlt oder nicht beschreibbar!" + +#: includes/include.system_db_backup.php:54 +msgid "Start your Backup!" +msgstr "Starte das Backup!" + +#: includes/include.system_db_backup.php:88 +#, fuzzy +msgid "Permission denied!" +msgstr "Zugriff verweigert" + +#: includes/include.system_db_backup.php:99 +msgid "Starting Backup." +msgstr "Backup startet." + +#: includes/include.system_db_backup.php:216 +msgid "Backup in Progress!" +msgstr "Backup in Bearbeitung" + +#: includes/include.system_db_backup.php:223 +#: includes/include.system_db_backup.php:248 +msgid "Tables saved: " +msgstr "Tabellen gespeichert:" + +#: includes/include.system_db_backup.php:223 +msgid "Last processed: " +msgstr "Zuletzt bearbeitet:" + +#: includes/include.system_db_backup.php:224 +#: includes/include.system_db_backup.php:248 +msgid "Pageviews: " +msgstr "Seitenaufrufe:" + +#: includes/include.system_db_backup.php:247 +msgid "Backup done!" +msgstr "Backup fertig!" + +#: includes/include.system_db_backup.php:252 +msgid "Go Back to Overview" +msgstr "Zurück zur Übersicht" + +#: includes/include.system_db_backup.php:286 +msgid "File successfully deleted." +msgstr "Datei erfolgreich gelöscht!" + +#: includes/include.system_db_backup.php:301 +msgid "Download File" +msgstr "Datei herunterladen" + +#: includes/include.upl_artlist.php:66 +msgid "Use this category" +msgstr "Diese Kategorie verwenden" + +#: includes/include.upl_artlist.php:81 +#: templates/standard/template.mycontenido_lastarticles.html:61 +msgid "Start" +msgstr "Start" + +#: includes/include.upl_artlist.php:81 +#: templates/standard/template.mycontenido_lastarticles.html:65 +msgid "Modified" +msgstr "Geändert" + +#: includes/include.upl_artlist.php:81 +msgid "Sort Order" +msgstr "Sortierreihenfolge" + +#: includes/include.upl_artlist.php:81 +msgid "Online" +msgstr "Online" + +#: includes/include.js_left_top.php:50 includes/cfg_language_de.inc.php:206 +msgid "Create script" +msgstr "Script erstellen" + +#: includes/include.stat_menu.php:37 +msgid "Current Report" +msgstr "Aktuelle Statistik" + +#: includes/include.stat_menu.php:45 +msgid "Statistics Overview" +msgstr "Statistikübersicht" + +#: includes/include.stat_menu.php:56 +msgid "Archived Statistics" +msgstr "Archivierte Statistiken" + +#: includes/include.con_editcontent.php:215 +msgid "Close editor" +msgstr "Editor schließen" + +#: includes/include.con_editcontent.php:216 +msgid "Close editor and save changes" +msgstr "Editor schließen und Änderungen speichern" + +#: includes/include.con_editcontent.php:217 +msgid "Do you want to save changes?" +msgstr "Möchten Sie die Änderungen speichern?" + +#: includes/include.con_editcontent.php:375 +msgid "No template assigned to the category
    and/or the article" +msgstr "Kein Template mit einer Kategorie
    und/oder einem Artikel assoziiert" + +#: includes/include.con_editcontent.php:376 +msgid "The code for the following article
    couldnt be generated:" +msgstr "" +"Der Code für den folgenden Artikel
    konnte nicht erstellt werden:" + +#: includes/include.con_editcontent.php:397 +#: includes/include.system_purge.php:195 +#: templates/standard/template.log_main.html:18 +#: templates/standard/template.log_main.html:48 +#: classes/class.navigation.php:340 classes/class.navigation.php:343 +msgid "Client" +msgstr "Mandant" + +#: includes/functions.con.php:331 includes/functions.con.php:518 +msgid "Default title" +msgstr "Standardtitel" + +#: includes/include.lay_history.php:87 includes/include.lay_edit_form.php:186 +msgid "Edit Layout" +msgstr "Layout bearbeiten" + +#: includes/include.lay_history.php:137 +msgid "No layout history available" +msgstr "Keine Layout-Historie verfügbar" + +#: includes/include.upl_edit.php:91 +msgid "File name" +msgstr "Dateiname" + +#: includes/include.upl_edit.php:93 +msgid "Replace file" +msgstr "Datei ersetzen" + +#: includes/include.upl_edit.php:94 +msgid "Media name" +msgstr "Medienname" + +#: includes/include.upl_edit.php:96 +msgid "Keywords" +msgstr "Schlüsselwörter" + +#: includes/include.upl_edit.php:97 +msgid "Internal notes" +msgstr "Interne Notiz" + +#: includes/include.upl_edit.php:98 +msgid "Copyright" +msgstr "Copyright" + +#: includes/include.upl_edit.php:99 +msgid "Protection" +msgstr "Schutz" + +#: includes/include.upl_edit.php:100 +#: templates/standard/template.con_edit_form.html:141 +msgid "Time control" +msgstr "Zeitsteuerung" + +#: includes/include.upl_edit.php:200 +msgid "Protected for non-logged in users" +msgstr "Geschützt für nichteingeloggte Benutzer" + +#: includes/include.upl_edit.php:209 +#: templates/standard/template.con_edit_form.html:144 +msgid "Use time control" +msgstr "Zeitsteuerung aktivieren" + +#: includes/include.upl_edit.php:215 +#: templates/standard/template.con_edit_form.html:146 +#: templates/standard/template.log_main.html:30 +msgid "Start date" +msgstr "Startdatum" + +#: includes/include.upl_edit.php:313 +#, php-format +msgid "Could not load file %s" +msgstr "Konnte Datei %s nicht laden" + +#: includes/functions.file.php:206 +msgid "Please insert filename." +msgstr "Bitte Dateinamen angeben." + +#: includes/functions.file.php:218 +#, php-format +msgid "Could not open file %s" +msgstr "Konnte Datei %s nicht öffnen" + +#: includes/functions.file.php:223 +#, php-format +msgid "Could not write file %s" +msgstr "Konnte Datei %s nicht schreiben" + +#: includes/functions.file.php:234 includes/functions.file.php:338 +#, php-format +msgid "%s is not writable" +msgstr "%s ist nicht schreibbar" + +#: includes/functions.file.php:255 +#, php-format +msgid "Can not open file%s " +msgstr "Kann Datei %s nicht öffnen" + +#: includes/functions.file.php:304 +msgid "Unable to change file access permission." +msgstr "Konnte die Dateisystem-Berechtigungen nicht ändern." + +#: includes/functions.file.php:308 +#, php-format +msgid "Unable to create file %s" +msgstr "Konnte Datei %s nicht erstellen" + +#: includes/functions.file.php:334 +#, php-format +msgid "Can not rename file %s" +msgstr "Konnte Datei %s nicht umbenennen" + +#: includes/functions.file.php:361 +msgid "Wrong filename." +msgstr "Falscher Dateiname." + +#: includes/include.mycontenido_lastarticles.php:293 +msgid "No article found" +msgstr "Keine Artikel gefunden" + +#: includes/include.grouprights_overview.php:67 +msgid "Changes couldn't saved" +msgstr "Änderungen nicht gespeichert" + +#: includes/include.grouprights_overview.php:112 +msgid "Groupname" +msgstr "Gruppenname" + +#: includes/include.grouprights_overview.php:208 +#: includes/include.rights_overview.php:352 +msgid "Area/Type" +msgstr "Area/Type" + +#: includes/include.grouprights_overview.php:222 +#: includes/include.rights_overview.php:366 +msgid "User-defined properties" +msgstr "Benutzerdefinierte Eigenschaften" + +#: includes/include.upl_files_upload.php:51 +msgid "Upload" +msgstr "Hochladen" + +#: includes/include.upl_files_upload.php:63 +#: includes/cfg_language_de.inc.php:136 includes/cfg_language_de.inc.php:144 +msgid "Upload files" +msgstr "Dateien hochladen" + +#: includes/include.lay_edit_form.php:46 +msgid "-- New Layout --" +msgstr "-- Neues Layout --" + +#: includes/include.lay_edit_form.php:56 +msgid "Layout deleted" +msgstr "Layout gelöscht" + +#: includes/include.lay_edit_form.php:128 +#, php-format +msgid "Container %s was defined %s times" +msgstr "Container %s wurde %sx definiert" + +#: includes/include.lay_edit_form.php:141 +msgid "" +"The body tag does not exist in the layout. This is a requirement for the in-" +"site editing." +msgstr "" +"Der body-Tag existiert nicht in diesem Layout. Dies ist eine Voraussetzung " +"für das In-Site-Editing." + +#: includes/include.lay_edit_form.php:147 +msgid "" +"The head tag does not exist in the layout. This is a requirement for the in-" +"site editing." +msgstr "" +"Der head-Tag existiert nicht in diesem Layout. Dies ist eine Voraussetzung " +"für das In-Site-Editing." + +#: includes/include.lay_edit_form.php:173 +#: includes/include.html_tpl_edit_form.php:185 +#, php-format +msgid "Tag '%s' %s has no end tag (start tag is on line %s char %s)" +msgstr "" +"Tag '%s' %s hat keinen End-Tag (Start-Tag befindet sich auf Zeile %s Zeichen " +"%s)" + +#: includes/include.lay_edit_form.php:202 +msgid "On save, apply default modules to new containers" +msgstr "Beim Speichern alle Default-Module in neue Container zuweisen" + +#: includes/include.rights_overview.php:75 +msgid "User deleted" +msgstr "Benutzer gelöscht" + +#: includes/include.rights_overview.php:144 +#: includes/include.rights_overview.php:149 +msgid "An error occured while saving user info." +msgstr "" +"Ein Fehler ist während des Sendens des Bugreports aufgetreten! Bitte " +"versuchen Sie es noch einmal" + +#: includes/include.rights_overview.php:236 +#: includes/include.rights_create.php:180 +msgid "Phone number" +msgstr "Telefonnummer" + +#: includes/include.rights_overview.php:242 +#: includes/include.rights_create.php:186 +msgid "Street" +msgstr "Strasse" + +#: includes/include.rights_overview.php:248 +#: includes/include.rights_create.php:192 +msgid "ZIP code" +msgstr "Postleitzahl" + +#: includes/include.rights_overview.php:254 +#: includes/include.rights_create.php:198 +msgid "City" +msgstr "Stadt" + +#: includes/include.rights_overview.php:373 +#: includes/include.rights_create.php:269 +msgid "Use WYSIWYG-Editor" +msgstr "WYSIWYG-Editor benutzen" + +#: includes/include.rights_overview.php:398 +#: includes/include.rights_create.php:290 +msgid "Valid from" +msgstr "Gültig von" + +#: includes/include.rights_overview.php:418 +#: includes/include.rights_create.php:307 +msgid "Valid to" +msgstr "Gültig bis" + +#: includes/include.rights_overview.php:436 +msgid "This account is currently inactive." +msgstr "Dieser Benutzer ist momentan deaktiviert." + +#: includes/include.rights_overview.php:439 +msgid "This account is currently active." +msgstr "Dieser Benutzer ist momentan aktiviert." + +#: includes/include.pretplcfg_edit_form.php:101 +#, php-format +msgid "Module in Container %s" +msgstr "Modul in Container %s" + +#: includes/include.pretplcfg_edit_form.php:150 +msgid "Template preconfiguration" +msgstr "Template Vorkonfiguration" + +#: includes/include.mod_overview.php:198 +msgid "Module in use, cannot delete" +msgstr "Modul wird benutzt, löschen nicht möglich" + +#: includes/include.mod_overview.php:200 +msgid "Module in filesystem, cannot delete" +msgstr "Modul liegt im Dateisystem und kann nicht gelöscht werden" + +#: includes/include.mod_overview.php:204 includes/cfg_language_de.inc.php:154 +msgid "Delete module" +msgstr "Modul löschen" + +#: includes/include.mod_overview.php:205 +#, php-format +msgid "Do you really want to delete the following module:

    %s
    " +msgstr "" +"Möchten Sie das folgende Modul wirklich löschen:

    %s" + +#: includes/include.mod_overview.php:271 +#, php-format +msgid "The module '%s' is used for following templates" +msgstr "Das Modul '%s' wird bei folgenden Templates benutzt" + +#: includes/include.lang_left_top.php:80 includes/cfg_language_de.inc.php:189 +msgid "Create language" +msgstr "Sprache erstellen für" + +#: includes/include.frontend.group.subnav.php:40 includes/main.login.php:210 +msgid "Overview" +msgstr "Übersicht" + +#: includes/include.frontend.group_edit.php:56 +msgid "-- new group --" +msgstr "-- Neue Gruppe --" + +#: includes/include.frontend.group_edit.php:121 +msgid "Could not set new group name: Group already exists" +msgstr "Konnte Gruppennamen nicht setzen: Gruppe existiert bereits" + +#: includes/include.frontend.group_edit.php:227 +msgid "Default group" +msgstr "Standardgruppe" + +#: includes/include.frontend.group_edit.php:275 +#: includes/cfg_language_de.inc.php:180 +msgid "Edit group" +msgstr "Gruppe bearbeiten" + +#: includes/grouprights_members.inc.php:208 +msgid "Manage group members" +msgstr "Gruppenmitglieder verwalten" + +#: includes/include.style_left_top.php:50 +msgid "Create style" +msgstr "Style erstellen" + +#: includes/main.login.php:67 +msgid "No Login Information available." +msgstr "Keine Login-Informationen verfügbar." + +#: includes/main.login.php:74 +msgid "" +"You're logged in with a temporary password. Please change your password." +msgstr "" +"Sie haben sich mit einem temporären Passwort eingeloggt. Bitte ä" +"ndern Sie Ihr Passwort." + +#: includes/main.login.php:79 +msgid "" +"The setup directory still exists. Please remove the setup directory before " +"you continue." +msgstr "" +"Das Setupverzeichnis existiert noch. Bitte löschen Sie das " +"Setupverzeichnis, bevor Sie fortfahren." + +#: includes/main.login.php:95 +msgid "" +"The sysadmin and/or the admin account still contains a well-known default " +"password. Please change immediately." +msgstr "" +"Der Sysadmin und/oder Admin Account ist noch auf das Standardpasswort " +"gesetzt. Bitte ändern Sie das Passwort umgehend." + +#: includes/main.login.php:109 +msgid "Welcome" +msgstr "Willkommen" + +#: includes/main.login.php:110 +msgid "Last login" +msgstr "Letzter Login" + +#: includes/main.login.php:128 includes/main.login.php:165 +#, php-format +msgid "Client %s (%s) has no languages" +msgstr "Mandant %s (%s) hat keine Sprache" + +#: includes/main.login.php:148 +msgid "Change client" +msgstr "Mandant wechseln" + +#: includes/main.login.php:153 +msgid "No clients available!" +msgstr "Keine Mandanten verfügbar!" + +#: includes/main.login.php:205 +#, php-format +msgid "Reminder list: %d Task open" +msgstr "Wiedervorlage: %d Aufgabe offen" + +#: includes/main.login.php:207 +#, php-format +msgid "Reminder list: %d Tasks open" +msgstr "Wiedervorlage: %d Aufgaben offen" + +#: includes/main.login.php:238 +msgid "Symbol help" +msgstr "Symbolhilfe" + +#: includes/main.login.php:241 +msgid "Contenido Manual" +msgstr "Contenido Redakteurshandbuch" + +#: includes/cfg_language_de.inc.php:99 +msgid "Make category online" +msgstr "Kategorie online setzen" + +#: includes/cfg_language_de.inc.php:100 +msgid "Change template" +msgstr "Template wechseln" + +#: includes/cfg_language_de.inc.php:101 +msgid "Set start article" +msgstr "Startartikel festlegen" + +#: includes/cfg_language_de.inc.php:102 +msgid "Make article online" +msgstr "Artikel online setzen" + +#: includes/cfg_language_de.inc.php:103 +msgid "Syncronize Category" +msgstr "Kategorie synchronisieren" + +#: includes/cfg_language_de.inc.php:104 +msgid "Syncronize Article" +msgstr "Artikel synchronisieren" + +#: includes/cfg_language_de.inc.php:105 includes/cfg_language_de.inc.php:124 +#: includes/include.str_overview.php:963 includes/include.str_overview.php:965 +#: templates/standard/template.str_overview.html:139 +msgid "Protect category" +msgstr "Kategorie schützen" + +#: includes/cfg_language_de.inc.php:107 +msgid "Edit template configuration" +msgstr "Template-Konfiguration bearbeiten" + +#: includes/cfg_language_de.inc.php:108 +msgid "Duplicate Article" +msgstr "Artikel duplizieren" + +#: includes/cfg_language_de.inc.php:109 +msgid "Expand boxes" +msgstr "Boxen ausklappen/einklappen" + +#: includes/cfg_language_de.inc.php:110 backend_search.php:677 +#: templates/standard/template.symbolhelp.html:377 +msgid "Configure template" +msgstr "Template konfigurieren" + +#: includes/cfg_language_de.inc.php:111 +msgid "Create article" +msgstr "Neuen Artikel erstellen" + +#: includes/cfg_language_de.inc.php:112 +msgid "Configure article" +msgstr "Artikel konfigurieren" + +#: includes/cfg_language_de.inc.php:113 +msgid "Save article" +msgstr "Artikel speichern" + +#: includes/cfg_language_de.inc.php:115 includes/cfg_language_de.inc.php:117 +msgid "Edit article" +msgstr "Artikel bearbeiten" + +#: includes/cfg_language_de.inc.php:116 +msgid "Edit article properties" +msgstr "Artikeleigenschaften bearbeiten" + +#: includes/cfg_language_de.inc.php:118 +msgid "Help" +msgstr "Hilfe" + +#: includes/cfg_language_de.inc.php:120 +#: templates/standard/template.symbolhelp.html:524 +msgid "Rename category" +msgstr "Kategorie umbenennen" + +#: includes/cfg_language_de.inc.php:121 +msgid "New category" +msgstr "Neue Kategorie" + +#: includes/cfg_language_de.inc.php:122 +msgid "Set category on- or offline" +msgstr "Kategorie on- oder offline setzen" + +#: includes/cfg_language_de.inc.php:123 +msgid "Disable category" +msgstr "Kategorie schützen" + +#: includes/cfg_language_de.inc.php:125 +msgid "Frontend access" +msgstr "Frontend-Zugriff" + +#: includes/cfg_language_de.inc.php:126 +msgid "Delete category" +msgstr "Kategorie löschen" + +#: includes/cfg_language_de.inc.php:127 +msgid "Move category up" +msgstr "Eine Kategorie nach oben verschieben" + +#: includes/cfg_language_de.inc.php:128 +msgid "Move category down" +msgstr "Eine Kategorie nach unten verschieben" + +#: includes/cfg_language_de.inc.php:129 +#: templates/standard/template.symbolhelp.html:665 +msgid "Move category" +msgstr "Kategorie verschieben" + +#: includes/cfg_language_de.inc.php:130 +msgid "Create new tree" +msgstr "Neuen Baum anlegen" + +#: includes/cfg_language_de.inc.php:131 +#: templates/standard/template.symbolhelp.html:701 +msgid "Duplicate category" +msgstr "Kategorie duplizieren" + +#: includes/cfg_language_de.inc.php:132 includes/include.str_overview.php:949 +#: includes/include.str_overview.php:952 +#: templates/standard/template.symbolhelp.html:314 +#: templates/standard/template.symbolhelp.html:506 +#: templates/standard/template.str_overview.html:148 +msgid "Configure category" +msgstr "Kategorie konfigurieren" + +#: includes/cfg_language_de.inc.php:133 +msgid "Edit category" +msgstr "Kategorie bearbeiten" + +#: includes/cfg_language_de.inc.php:135 includes/cfg_language_de.inc.php:145 +msgid "Create directory" +msgstr "Verzeichnis erstellen" + +#: includes/cfg_language_de.inc.php:137 +msgid "Delete files" +msgstr "Dateien löschen" + +#: includes/cfg_language_de.inc.php:138 +msgid "Remove directory" +msgstr "Verzeichnis löschen" + +#: includes/cfg_language_de.inc.php:139 +msgid "Rename directory" +msgstr "Verzeichnis umbenennen" + +#: includes/cfg_language_de.inc.php:140 +msgid "Modify file" +msgstr "Datei modifizieren" + +#: includes/cfg_language_de.inc.php:141 +msgid "Rename file" +msgstr "Datei umbenennen" + +#: includes/cfg_language_de.inc.php:142 +msgid "Multidelete Files" +msgstr "Mehrfachlöschung" + +#: includes/cfg_language_de.inc.php:148 +msgid "Modify layout" +msgstr "Layout bearbeiten" + +#: includes/cfg_language_de.inc.php:149 +msgid "Create layout" +msgstr "Layout erstellen" + +#: includes/cfg_language_de.inc.php:150 includes/cfg_language_de.inc.php:155 +#: includes/cfg_language_de.inc.php:201 includes/cfg_language_de.inc.php:207 +#: includes/cfg_language_de.inc.php:213 +msgid "Manage History" +msgstr "Historie verwalten" + +#: includes/cfg_language_de.inc.php:151 includes/cfg_language_de.inc.php:156 +#: includes/cfg_language_de.inc.php:202 includes/cfg_language_de.inc.php:208 +#: includes/cfg_language_de.inc.php:214 +msgid "Truncate History" +msgstr "Historie löschen" + +#: includes/cfg_language_de.inc.php:158 +msgid "Create module" +msgstr "Modul erstellen" + +#: includes/cfg_language_de.inc.php:159 +msgid "Import/Export module" +msgstr "Modul importieren/exportieren" + +#: includes/cfg_language_de.inc.php:160 +msgid "Translate modules" +msgstr "Modul übersetzen" + +#: includes/cfg_language_de.inc.php:161 +msgid "Translation import/export" +msgstr "Übersetzungen importieren/exportieren" + +#: includes/cfg_language_de.inc.php:162 +msgid "Import/Export package" +msgstr "Paket importieren/exportieren" + +#: includes/cfg_language_de.inc.php:166 +msgid "Create template" +msgstr "Template erstellen" + +#: includes/cfg_language_de.inc.php:169 +msgid "Visual edit" +msgstr "Visuelles Bearbeiten" + +#: includes/cfg_language_de.inc.php:173 +msgid "Save user area rights" +msgstr "User-Bereichsrechte speichern" + +#: includes/cfg_language_de.inc.php:175 +msgid "Edit rights" +msgstr "Rechte bearbeiten" + +#: includes/cfg_language_de.inc.php:178 +msgid "Delete group members" +msgstr "Gruppenmitglieder löschen" + +#: includes/cfg_language_de.inc.php:179 +msgid "Add group members" +msgstr "Gruppenmitglied hinzufügen" + +#: includes/cfg_language_de.inc.php:184 +msgid "Show statistics" +msgstr "Statistik anzeigen" + +#: includes/cfg_language_de.inc.php:186 includes/include.lang_overview.php:68 +msgid "Activate language" +msgstr "Sprache aktivieren" + +#: includes/cfg_language_de.inc.php:187 includes/include.lang_overview.php:72 +msgid "Deactivate language" +msgstr "Sprache deaktivieren" + +#: includes/cfg_language_de.inc.php:188 +msgid "Rename language" +msgstr "Sprache umbenennen" + +#: includes/cfg_language_de.inc.php:190 includes/include.lang_overview.php:78 +msgid "Delete language" +msgstr "Sprache löschen" + +#: includes/cfg_language_de.inc.php:193 +msgid "Linkchecker" +msgstr "Linkchecker" + +#: includes/cfg_language_de.inc.php:194 +msgid "Linkchecker Whitelist" +msgstr "Linkchecker Whitelist" + +#: includes/cfg_language_de.inc.php:196 +msgid "Install/Remove plugins" +msgstr "Plugins installieren/deinstallieren" + +#: includes/cfg_language_de.inc.php:198 +msgid "Modify CSS" +msgstr "CSS modifizieren" + +#: includes/cfg_language_de.inc.php:199 +msgid "Create CSS" +msgstr "CSS erstellen" + +#: includes/cfg_language_de.inc.php:200 +msgid "Delete CSS" +msgstr "CSS löschen" + +#: includes/cfg_language_de.inc.php:204 +msgid "Edit script" +msgstr "Script bearbeiten" + +#: includes/cfg_language_de.inc.php:205 +msgid "Delete script" +msgstr "Script löschen" + +#: includes/cfg_language_de.inc.php:210 +msgid "Modify HTML-Template" +msgstr "HTML-Template verändern" + +#: includes/cfg_language_de.inc.php:211 +msgid "Create HTML-Template" +msgstr "HTML-Template erstellen" + +#: includes/cfg_language_de.inc.php:212 +msgid "Delete HTML-Template" +msgstr "HTML-Template löschen" + +#: includes/cfg_language_de.inc.php:216 +msgid "Edit newsletter" +msgstr "Newsletter bearbeiten" + +#: includes/cfg_language_de.inc.php:217 +#: templates/standard/template.symbolhelp.html:1279 +msgid "Create newsletter" +msgstr "Newsletter erzeugen" + +#: includes/cfg_language_de.inc.php:218 +msgid "Delete newsletter" +msgstr "Newsletter löschen" + +#: includes/cfg_language_de.inc.php:219 +msgid "Duplicate newsletter" +msgstr "Newsletter kopieren" + +#: includes/cfg_language_de.inc.php:220 +msgid "Add newsletter dispatch job" +msgstr "Newsletter Versand-Job erzeugen" + +#: includes/cfg_language_de.inc.php:221 +msgid "Change global HTML newsletter settings" +msgstr "Globale HTML-Newsletter-Einstellungen ändern" + +#: includes/cfg_language_de.inc.php:222 +msgid "Send test newsletter (to groups)" +msgstr "Test-Newsletter versenden (an Gruppen)" + +#: includes/cfg_language_de.inc.php:223 +msgid "Delete dispatch job" +msgstr "Newsletter Versand-Job löschen" + +#: includes/cfg_language_de.inc.php:224 +msgid "Remove recipient from dispatch job" +msgstr "Empfänger aus Newsletter-Job herausnehmen" + +#: includes/cfg_language_de.inc.php:225 +msgid "Run job" +msgstr "Job ausführen" + +#: includes/cfg_language_de.inc.php:226 +msgid "View dispatch job details" +msgstr "Newsletter Versand-Job-Details ansehen" + +#: includes/cfg_language_de.inc.php:228 +msgid "Edit recipient" +msgstr "Empfänger bearbeiten" + +#: includes/cfg_language_de.inc.php:229 +#: templates/standard/template.symbolhelp.html:1373 +msgid "Create recipient" +msgstr "Empfänger erzeugen" + +#: includes/cfg_language_de.inc.php:230 +msgid "Delete recipient" +msgstr "Empfänger löschen" + +#: includes/cfg_language_de.inc.php:231 +msgid "Purge recipients" +msgstr "Empfänger aufräumen" + +#: includes/cfg_language_de.inc.php:232 +msgid "Import recipients" +msgstr "Empfänger importieren" + +#: includes/cfg_language_de.inc.php:233 +msgid "Execute recipients import" +msgstr "Empfänger-Import ausführen" + +#: includes/cfg_language_de.inc.php:234 +msgid "Delete recipient group" +msgstr "Empfängergruppe löschen" + +#: includes/cfg_language_de.inc.php:235 +#: templates/standard/template.symbolhelp.html:1409 +msgid "Create recipient group" +msgstr "Empfängergruppe erstellen" + +#: includes/cfg_language_de.inc.php:236 +msgid "Delete recipient from group" +msgstr "Empfänger aus Gruppe entfernen" + +#: includes/cfg_language_de.inc.php:237 +msgid "Save recipient group" +msgstr "Änderungen an Empfängergruppe speichern" + +#: includes/cfg_language_de.inc.php:239 +msgid "Edit own MyContenido settings" +msgstr "Eigene MyConLite-Einstellungen bearbeiten" + +#: includes/cfg_language_de.inc.php:240 +msgid "Delete reminder item" +msgstr "Wiedervorlage löschen" + +#: includes/cfg_language_de.inc.php:241 +msgid "Save todo item" +msgstr "Todo-Eintrag speichern" + +#: includes/cfg_language_de.inc.php:244 +msgid "Edit client" +msgstr "Mandant bearbeiten" + +#: includes/cfg_language_de.inc.php:245 +msgid "Remove client" +msgstr "Mandant löschen" + +#: includes/cfg_language_de.inc.php:246 +msgid "Delete clientsetting" +msgstr "Mandanteneinstellungen löschen" + +#: includes/cfg_language_de.inc.php:247 +msgid "Edit clientsetting" +msgstr "Mandanteneinstellungen bearbeiten" + +#: includes/cfg_language_de.inc.php:248 +msgid "Save clientsetting" +msgstr "Mandanteneinstellungen speichern" + +#: includes/cfg_language_de.inc.php:249 +msgid "Create/Edit articlespecifications" +msgstr "Artikelspezifikation erstellen/bearbeiten" + +#: includes/cfg_language_de.inc.php:250 +msgid "Delete articlespecifications" +msgstr "Artikelspezifikation löschen" + +#: includes/cfg_language_de.inc.php:251 +msgid "Define default articlespecification" +msgstr "Standard Artikelspezifikation definieren" + +#: includes/cfg_language_de.inc.php:252 +msgid "Edit articlespecifications" +msgstr "Artikelspezifikationen bearbeiten" + +#: includes/cfg_language_de.inc.php:253 +msgid "Make articlespecifications online" +msgstr "Artikelspezifikationen online setzen" + +#: includes/cfg_language_de.inc.php:255 +msgid "Save frontenduser" +msgstr "Frontendbenutzer speichern" + +#: includes/cfg_language_de.inc.php:256 +msgid "Create frontenduser" +msgstr "Frontendbenutzer erstellen" + +#: includes/cfg_language_de.inc.php:257 includes/cfg_language_de.inc.php:263 +msgid "Delete frontenduser" +msgstr "Frontendbenutzer löschen" + +#: includes/cfg_language_de.inc.php:258 +msgid "Delete frontendgroup" +msgstr "Frontendbenutzergruppe löschen" + +#: includes/cfg_language_de.inc.php:259 +msgid "Save frontendgroup" +msgstr "Frontendbenutzergruppe speichern" + +#: includes/cfg_language_de.inc.php:260 includes/cfg_language_de.inc.php:261 +msgid "Create frontendgroup" +msgstr "Frontendbenutzergruppe erstellen" + +#: includes/cfg_language_de.inc.php:262 +msgid "Add frontendusers" +msgstr "Frontendbenutzer hinzufügen" + +#: includes/cfg_language_de.inc.php:264 +msgid "Save frontendgroup permissions" +msgstr "Frontendbenutzergruppe-Berechtigungen speichern" + +#: includes/cfg_language_de.inc.php:266 +msgid "Delete system property" +msgstr "Systemeinstellung löschen" + +#: includes/cfg_language_de.inc.php:267 +msgid "Edit system property" +msgstr "Systemeinstellung bearbeiten" + +#: includes/cfg_language_de.inc.php:268 +msgid "Save system property" +msgstr "Systemeinstellung speichern" + +#: includes/cfg_language_de.inc.php:270 +msgid "Empty log" +msgstr "Log leeren" + +#: includes/cfg_language_de.inc.php:271 +msgid "Edit Systemconfigration" +msgstr "Systemkonfiguration bearbeiten" + +#: includes/cfg_language_de.inc.php:272 +msgid "Do system purge" +msgstr "Systembereinigung ausführen" + +#: includes/cfg_language_de.inc.php:274 +msgid "Show log" +msgstr "Log anzeigen" + +#: includes/cfg_language_de.inc.php:276 main.loginform.php:159 +msgid "Login" +msgstr "Login" + +#: includes/cfg_language_de.inc.php:277 +msgid "Request password?" +msgstr "Passwort vergessen?" + +#: includes/cfg_language_de.inc.php:279 +msgid "Delete note" +msgstr "Notiz löschen" + +#: includes/cfg_language_de.inc.php:280 +msgid "Save note" +msgstr "Notiz speichern" + +#: includes/cfg_language_de.inc.php:282 +msgid "Send mail" +msgstr "E-Mail senden" + +#: includes/cfg_language_de.inc.php:283 +msgid "Fake permissions" +msgstr "Berechtigungen emulieren" + +#: includes/include.style_history.php:126 +msgid "Edit Style" +msgstr "Style bearbeiten" + +#: includes/include.frontend.left_top.php:141 +msgid "Frontend users" +msgstr "Frontend-Benutzer" + +#: includes/include.frontend.left_top.php:148 +msgid "Frontend groups" +msgstr "Frontend-Gruppen" + +#: includes/include.frontend.left_top.php:261 +msgid "Show group" +msgstr "Gruppe anzeigen" + +#: includes/include.frontend.left_top.php:269 includes/include.mod_new.php:173 +msgid "Search in" +msgstr "Suche in" + +#: includes/include.mod_new.php:69 +msgid "New module" +msgstr "Neues Modul" + +#: includes/include.mod_new.php:72 +msgid "Sync module" +msgstr "Module synchronisieren" + +#: includes/include.mod_new.php:97 includes/include.mod_new.php:107 +#: includes/include.mod_new.php:127 +msgid "-- All --" +msgstr "-- Alle --" + +#: includes/include.mod_new.php:108 +msgid "Modulname" +msgstr "Modulname" + +#: includes/include.mod_new.php:128 +msgid "-- Without type --" +msgstr "-- Ohne Typ --" + +#: includes/include.mod_new.php:165 +msgid "Type filter" +msgstr "Art des Moduls" + +#: includes/functions.lang.php:119 +msgid "" +"Could not set the language-ID in the file 'config.php'. Please set the " +"language manually." +msgstr "" +"Konnte die Sprach-ID in der Datei \"config.php\" nicht setzen. Bitte Sprach-" +"ID manuell setzen." + +#: includes/functions.lang.php:591 +msgid "Could not delete language" +msgstr "Konnte Sprache nicht löschen" + +#: includes/include.str_overview.php:511 +#, php-format +msgid "" +"Do you really want to duplicate the following category:

    %s

    Notice: The duplicate process can take up to several minutes, " +"depending on how many subitems and articles you've got." +msgstr "" +"Soll die folgende Kategorie wirklich dupliziert werden:

    %s

    Hinweis: Der Duplizierungsprozess kann mehrere Minuten dauern, " +"abhängig von der Anzahl der Artikel und Unterkategorien." + +#: includes/include.str_overview.php:513 +#, php-format +msgid "Do you really want to delete the following category:

    %s" +msgstr "" +"Möchten Sie die folgende Kategorie wirklich löschen:

    %s" + +#: includes/include.str_overview.php:920 +msgid "Create new category" +msgstr "Neue Kategorie erstellen" + +#: includes/include.str_overview.php:993 +#, php-format +msgid "Cancel moving %s" +msgstr "Verschieben von %s abbrechen" + +#: includes/include.html_tpl_left_top.php:50 +msgid "Create module template" +msgstr "Modul-Template erstellen" + +#: includes/include.lang_overview.php:77 +#, php-format +msgid "Do you really want to delete the language %s?" +msgstr "Möchten Sie die Sprache %s wirklich löschen?" + +#: includes/include.lang_overview.php:118 +msgid "Language deleted" +msgstr "Sprache gelöscht" + +#: includes/include.system_sysvalues.php:79 +#: includes/include.system_sysvalues.php:123 +msgid "No error log entries found" +msgstr "Keine Einträge im Errorlog gefunden" + +#: includes/include.system_sysvalues.php:83 +msgid "No error log file found" +msgstr "Keine Errorlog-Datei gefunden" + +#: includes/include.system_sysvalues.php:116 +msgid "No install error log entries found" +msgstr "Keine Einträge im install error log gefunden." + +#: includes/include.frontend.group_menu.php:51 +msgid "Delete frontend group" +msgstr "Frontend-Gruppe löschen" + +#: includes/include.frontend.group_menu.php:52 +#, php-format +msgid "Do you really want to delete the following frontend group:
    %s" +msgstr "" +"Möchten Sie die folgende Frontend-Gruppe wirklich löschen:
    " +"%s" + +#: includes/include.rights_create.php:53 +msgid "Username can't be empty" +msgstr "Benutzername darf nicht leer sein" + +#: includes/include.rights_create.php:85 +msgid "User created" +msgstr "Benutzer erstellt" + +#: includes/include.rights_create.php:106 +msgid "Username already exists" +msgstr "Benutzername existiert bereits" + +#: includes/include.rights_create.php:110 +msgid "Unknown error" +msgstr "Unbekannter Fehler" + +#: includes/functions.mod.php:200 +msgid "Please do not use short open Tags. (Use
    %s
    " +msgstr "" +"Möchten Sie den folgenden Mandant wirklich löschen:

    %s" + +#: includes/include.note.popup.php:63 +msgid "Add note" +msgstr "Notiz hinzufügen" + +#: includes/include.note.popup.php:75 +msgid "No category" +msgstr "Keine Kategorie" + +#: includes/include.note.popup.php:92 +msgid "Note" +msgstr "Notiz" + +#: includes/functions.lay.php:66 +msgid "-- Unnamed Layout --" +msgstr "-- Unbenanntes Layout --" + +#: includes/include.system_purge.php:79 includes/include.system_purge.php:87 +#: includes/include.system_purge.php:95 includes/include.system_purge.php:103 +#: includes/include.system_purge.php:112 +msgid "Client " +msgstr "Mandant" + +#: includes/include.system_purge.php:80 includes/include.system_purge.php:128 +#: includes/include.system_purge.php:135 +#, php-format +msgid "The entries of %s table are not deleted!" +msgstr "Einträge von der Tabelle %s wurden nicht gelöscht!" + +#: includes/include.system_purge.php:88 +#, php-format +msgid "The %s is not updated!" +msgstr "Tabelle %s ist nicht akutalisiert!" + +#: includes/include.system_purge.php:96 +msgid "The cache is not deleted!" +msgstr "Cache wurde nicht gelöscht" + +#: includes/include.system_purge.php:104 +msgid "The log is not deleted!" +msgstr "Log-Datei wurde nicht geleert" + +#: includes/include.system_purge.php:113 +msgid "The history is not deleted!" +msgstr "Versionierung wurde nicht gelöscht!" + +#: includes/include.system_purge.php:143 +msgid "The contenido log is not cleaned!" +msgstr "ConLite Log-Datei wurde nicht geleert" + +#: includes/include.system_purge.php:150 +msgid "The contenido cache is not deleted!" +msgstr "ConLite Cache wurde nicht gelöscht!" + +#: includes/include.system_purge.php:157 +msgid "The contenido cronjobs are not cleaned!" +msgstr "ConLite Cronjob-Dateien wurden nicht geleert!" + +#: includes/include.system_purge.php:164 +msgid "Update of sequence table not completed!" +msgstr "Aktualisierung der Sequence Tabelle nicht komplett " + +#: includes/include.system_purge.php:169 +msgid "The changes were successfully executed." +msgstr "Die Änderungen wurden erfolgreich ausgeführt." + +#: includes/include.system_purge.php:171 +msgid "The changes were not all successfully completed." +msgstr "" +"Die Änderungen wurden teilweise nicht erfolgreich ausgeführt." + +#: includes/include.system_purge.php:190 includes/include.system_purge.php:214 +msgid "System purge" +msgstr "System Bereinigen" + +#: includes/include.system_purge.php:191 +msgid "No Client selected!" +msgstr "Kein Mandant ausgewählt!" + +#: includes/include.system_purge.php:196 +msgid "all clients" +msgstr "alle Mandanten" + +#: includes/include.system_purge.php:197 +msgid "from list" +msgstr "aus Liste" + +#: includes/include.system_purge.php:198 +msgid "Select clients" +msgstr "Mandanten Auswahl" + +#: includes/include.system_purge.php:199 includes/include.system_purge.php:201 +#: includes/include.system_purge.php:209 +#, php-format +msgid "Reset the table %s" +msgstr "Tabelle %s leeren" + +#: includes/include.system_purge.php:200 +#, php-format +msgid "Activate the code generation in %s" +msgstr "Code-Generierung in der Tabelle %s" + +#: includes/include.system_purge.php:202 +msgid "Clear client cache" +msgstr "Cache-Dateien löschen" + +#: includes/include.system_purge.php:203 +msgid "Clear client log file" +msgstr "Log-Datei leeren" + +#: includes/include.system_purge.php:204 +msgid "Clear client history" +msgstr "Versionierung löschen" + +#: includes/include.system_purge.php:205 +msgid "Keep last histories" +msgstr "Letzten Versionierungen beibehalten" + +#: includes/include.system_purge.php:207 +msgid "Contenido" +msgstr "ConLite" + +#: includes/include.system_purge.php:208 +msgid "Clear contenido log file" +msgstr "ConLite Log-Datei leeren" + +#: includes/include.system_purge.php:210 +msgid "Clear contenido cache" +msgstr "ConLite Cache löschen" + +#: includes/include.system_purge.php:211 +msgid "Reset cronjobs" +msgstr "Job-Dateien von Cronjob leeren" + +#: includes/include.system_purge.php:212 +msgid "Update sequence table" +msgstr "Sequence-Tabelle aktualisiert" + +#: includes/include.system_purge.php:215 +msgid "These changes can not be cancelled." +msgstr "Die Änderungen können Sie nicht rückgängig machen." + +#: includes/include.system_purge.php:215 +msgid "Do you really want to complete it?" +msgstr "Wollen Sie diese Aktion wirklich ausführen!" + +#: includes/include.system_purge.php:220 +msgid "No action selected!" +msgstr "Keine Aktion ausgewählt!" + +#: includes/include.system_purge.php:222 +msgid "Send" +msgstr "Gesendet" + +#: backend_search.php:328 +msgid "Thank you for saving this search from extinction !" +msgstr "Vielen Dank für die Speicherung dieser Suche!" + +#: backend_search.php:490 +msgid "Search results" +msgstr "Suchergebnisse" + +#: backend_search.php:506 +msgid "Missing search value." +msgstr "Suchwert fehlt." + +#: backend_search.php:507 backend_search.php:734 +msgid "No article found." +msgstr "Keine Artikel gefunden." + +#: backend_search.php:672 +msgid "Reminder" +msgstr "Erinnerung" + +#: backend_search.php:674 classes/class.todo.php:158 +#: classes/class.todo.php:161 +msgid "Set reminder / add to todo list" +msgstr "Wiedervorlage setzen / zur Todo-Liste hinzufügen" + +#: backend_search.php:679 +msgid "Do you really want to delete following article" +msgstr "Möchten Sie wirklich die folgende Datei löschen:
    " + +#: backend_search.php:765 +msgid "Search Name" +msgstr "Bezeichnung" + +#: backend_search.php:767 +msgid "Store" +msgstr "Speichern" + +#: backend_search.php:772 +msgid "Save this Search" +msgstr "Suche speichern" + +#: external/backendedit/front_content.php:331 +#: external/backendedit/front_content.php:386 +#: external/frontend/front_content.php:348 +#: external/frontend/front_content.php:396 +msgid "No start article for this category" +msgstr "Kein Startartikel für diese Kategorie" + +#: templates/standard/template.symbolhelp.html:23 +msgid "Table of contents" +msgstr "Inhaltsverzeichnis" + +#: templates/standard/template.symbolhelp.html:29 +#: templates/standard/template.symbolhelp.html:135 +msgid "Common" +msgstr "Allgemeines" + +#: templates/standard/template.symbolhelp.html:35 +#: templates/standard/template.symbolhelp.html:277 +msgid "Content" +msgstr "Content" + +#: templates/standard/template.symbolhelp.html:44 +#: templates/standard/template.symbolhelp.html:740 +msgid "File management" +msgstr "Dateiverwaltung" + +#: templates/standard/template.symbolhelp.html:50 +#: templates/standard/template.symbolhelp.html:816 +msgid "Style" +msgstr "Style" + +#: templates/standard/template.symbolhelp.html:56 +#: templates/standard/template.symbolhelp.html:904 +msgid "Modules" +msgstr "Module" + +#: templates/standard/template.symbolhelp.html:59 +#: templates/standard/template.symbolhelp.html:985 +msgid "Templates" +msgstr "Templates" + +#: templates/standard/template.symbolhelp.html:62 +#: templates/standard/template.symbolhelp.html:1055 +msgid "CSS editor" +msgstr "CSS-Editor" + +#: templates/standard/template.symbolhelp.html:65 +#: templates/standard/template.symbolhelp.html:1110 +msgid "Script editor" +msgstr "Scripteditor" + +#: templates/standard/template.symbolhelp.html:68 +#: templates/standard/template.symbolhelp.html:1165 +msgid "Module Templates" +msgstr "Modul-Templates" + +#: templates/standard/template.symbolhelp.html:74 +#: templates/standard/template.symbolhelp.html:1242 +msgid "Extras" +msgstr "Extras" + +#: templates/standard/template.symbolhelp.html:77 +#: templates/standard/template.symbolhelp.html:1248 +msgid "Newsletter" +msgstr "Newsletter" + +#: templates/standard/template.symbolhelp.html:80 +msgid "Recipients" +msgstr "Empfänger" + +#: templates/standard/template.symbolhelp.html:86 +#: templates/standard/template.symbolhelp.html:1466 +msgid "Statistics" +msgstr "Statistiken" + +#: templates/standard/template.symbolhelp.html:95 +#: templates/standard/template.symbolhelp.html:1548 +msgid "Administration" +msgstr "Administration" + +#: templates/standard/template.symbolhelp.html:98 +#: templates/standard/template.symbolhelp.html:1554 +msgid "Users" +msgstr "Benutzer" + +#: templates/standard/template.symbolhelp.html:101 +#: templates/standard/template.symbolhelp.html:1609 +msgid "Groups" +msgstr "Gruppen" + +#: templates/standard/template.symbolhelp.html:104 +#: templates/standard/template.symbolhelp.html:1664 +msgid "Languages" +msgstr "Sprachen" + +#: templates/standard/template.symbolhelp.html:107 +#: templates/standard/template.symbolhelp.html:1734 +msgid "Clients" +msgstr "Mandanten" + +#: templates/standard/template.symbolhelp.html:129 +msgid "Table of Contents" +msgstr "Inhaltsverzeichnis" + +#: templates/standard/template.symbolhelp.html:166 +msgid "Execute query / Save" +msgstr "Anfrage senden / Speichern" + +#: templates/standard/template.symbolhelp.html:196 +#: classes/class.request.password.php:247 +msgid "Submit" +msgstr "Absenden" + +#: templates/standard/template.symbolhelp.html:208 +msgid "Change to MyContenido (Personal Settings)" +msgstr "Zu MyConLite wechseln (Persönliche Einstellungen)" + +#: templates/standard/template.symbolhelp.html:220 +msgid "Information (Impressum)" +msgstr "Information (Impressum)" + +#: templates/standard/template.symbolhelp.html:235 +msgid "Logout" +msgstr "Ausloggen" + +#: templates/standard/template.symbolhelp.html:341 +msgid "Article is start article / is not start article" +msgstr "Artikel ist Startartikel / kein Startartikel" + +#: templates/standard/template.symbolhelp.html:353 +#: templates/standard/template.symbolhelp.html:868 +#: templates/standard/template.symbolhelp.html:949 +msgid "Set template / Add to To-Do list" +msgstr "Template setzen / zur Todo-Liste hinzufügen" + +#: templates/standard/template.symbolhelp.html:365 +msgid "Configure article properties" +msgstr "Artikeleigenschaften bearbeiten" + +#: templates/standard/template.symbolhelp.html:389 +msgid "Element is online / offline (change through click)" +msgstr "Element ist online / offline (Durch Klick ändern)" + +#: templates/standard/template.symbolhelp.html:401 +msgid "Element is protected / accessible (change through click)" +msgstr "Element ist geschützt / erreichbar (Ändern durch Klick)" + +#: templates/standard/template.symbolhelp.html:439 +msgid "Lock / unlock folder (change through click)" +msgstr "Kategorie sperren / entsperren (Ändern durch Klick)" + +#: templates/standard/template.symbolhelp.html:451 +msgid "Set folder offline / online (change through click)" +msgstr "Ordner offline / online setzen (Ändern durch Klick)" + +#: templates/standard/template.symbolhelp.html:542 +msgid "Create category" +msgstr "Kategorie erzeugen" + +#: templates/standard/template.symbolhelp.html:560 +msgid "Set category online / offline" +msgstr "Kategorie online / offline setzen" + +#: templates/standard/template.symbolhelp.html:578 +msgid "Category is online and unprotected / protected" +msgstr "Kategorie ist online und ungeschützt / geschützt" + +#: templates/standard/template.symbolhelp.html:596 +msgid "Category is offline and unprotected / protected" +msgstr "Kategorie ist offline und ungeschützt / geschützt" + +#: templates/standard/template.symbolhelp.html:614 +msgid "Category is online, contains an error and is unprotected / protected" +msgstr "" +"Kategorie ist online, enthält einen Fehler und ist ungeschützt / " +"geschützt" + +#: templates/standard/template.symbolhelp.html:632 +msgid "Category is offline, contains an error and is unprotected / protected" +msgstr "" +"Kategorie ist offline, ist fehlerhaft und ist ungeschützt / geschü" +"tzt" + +#: templates/standard/template.symbolhelp.html:650 +msgid "Move up one category" +msgstr "Eine Kategorie nach oben verschieben" + +#: templates/standard/template.symbolhelp.html:683 +msgid "Select move target" +msgstr "Verschiebeziel auswählen" + +#: templates/standard/template.symbolhelp.html:716 +#: templates/standard/template.symbolhelp.html:880 +#: templates/standard/template.symbolhelp.html:961 +#: templates/standard/template.symbolhelp.html:1031 +#: templates/standard/template.symbolhelp.html:1086 +#: templates/standard/template.symbolhelp.html:1141 +#: templates/standard/template.symbolhelp.html:1196 +#: templates/standard/template.symbolhelp.html:1306 +#: templates/standard/template.symbolhelp.html:1421 +#: templates/standard/template.symbolhelp.html:1585 +#: templates/standard/template.symbolhelp.html:1640 +#: templates/standard/template.symbolhelp.html:1710 +#: templates/standard/template.symbolhelp.html:1765 +#: templates/standard/template.symbolhelp.html:1871 +msgid "Delete / Delete not available" +msgstr "Löschen / Löschen nicht verfügbar" + +#: templates/standard/template.symbolhelp.html:762 +msgid "Root upload folder" +msgstr "Basis-Uploadverzeichnis" + +#: templates/standard/template.symbolhelp.html:780 +msgid "Regular folder" +msgstr "Normaler Ordner" + +#: templates/standard/template.symbolhelp.html:853 +msgid "Layout in use" +msgstr "Layout wird verwendet" + +#: templates/standard/template.symbolhelp.html:934 +msgid "Module in use" +msgstr "Modul wird verwendet" + +#: templates/standard/template.symbolhelp.html:1294 +msgid "Copy newsletter" +msgstr "Newsletter kopieren" + +#: templates/standard/template.symbolhelp.html:1330 +#: templates/standard/template.symbolhelp.html:1361 +msgid "Recipient" +msgstr "Empfänger" + +#: templates/standard/template.symbolhelp.html:1385 +msgid "Remove recipient" +msgstr "Empfänger entfernen" + +#: templates/standard/template.symbolhelp.html:1397 +msgid "Recipient group" +msgstr "Empfängergruppe" + +#: templates/standard/template.symbolhelp.html:1503 +msgid "Article is online / offline" +msgstr "Artikel ist online / offline" + +#: templates/standard/template.symbolhelp.html:1695 +msgid "Language active / not active" +msgstr "Sprache ist aktiv / nicht aktiv" + +#: templates/standard/template.symbolhelp.html:1823 +#: templates/standard/template.log_main.html:22 +#: templates/standard/template.log_main.html:50 +#: classes/class.navigation.php:360 +msgid "User" +msgstr "Benutzer" + +#: templates/standard/template.symbolhelp.html:1847 +msgid "User group" +msgstr "Benutzergruppe" + +#: templates/standard/template.symbolhelp.html:1859 +msgid "Create user group" +msgstr "Benutzergruppe erzeugen" + +#: templates/standard/template.info.html:15 +msgid "Concept and Implementation" +msgstr "Konzept und Implementierung" + +#: templates/standard/template.info.html:15 +msgid "Germany" +msgstr "Deutschland" + +#: templates/standard/template.info.html:15 +msgid "Phone" +msgstr "Telefon" + +#: templates/standard/template.system_variables.html:16 +msgid "Your system configuration" +msgstr "Ihre Systemkonfiguration" + +#: templates/standard/template.system_variables.html:21 +msgid "Variable" +msgstr "Variable" + +#: templates/standard/template.system_variables.html:22 +msgid "Local value" +msgstr "Lokaler Wert" + +#: templates/standard/template.system_variables.html:37 +msgid "Contenido Error Log" +msgstr "Contenido Fehlerlog" + +#: templates/standard/template.system_variables.html:50 +msgid "clear error log" +msgstr "Fehlerlog leeren" + +#: templates/standard/template.system_variables.html:58 +msgid "Contenido Upgrade Error Log" +msgstr "Contenido Upgrade-Fehlerlog" + +#: templates/standard/template.system_variables.html:72 +msgid "clear upgrade error log" +msgstr "Upgrade-Fehlerlog leeren" + +#: templates/standard/template.rights_inc.html:24 +msgid "Client / Language" +msgstr "Mandant / Sprache" + +#: templates/standard/template.str_overview.html:157 +msgid "Category is a tree" +msgstr "Kategorie ist ein Baum" + +#: templates/standard/template.str_overview.html:164 +msgid "Position of category" +msgstr "Position der Kategorie" + +#: templates/standard/template.con_edit_form.html:153 +msgid "When expired, move to category" +msgstr "Nach Endzeitpunkt in diese Kategorie verschieben" + +#: templates/standard/template.con_edit_form.html:155 +msgid "Make online after move" +msgstr "Nach Verschieben Artikel online lassen" + +#: templates/standard/template.con_edit_form.html:184 +msgid "Page title" +msgstr "Seitentitel" + +#: templates/standard/template.con_edit_form.html:190 +msgid "Meta tags" +msgstr "Meta-Tags" + +#: templates/standard/template.mycontenido_lastarticles.html:35 +msgid "Your clients" +msgstr "Ihre Mandanten" + +#: templates/standard/template.mycontenido_lastarticles.html:67 +#: classes/class.notification.php:126 +msgid "Info" +msgstr "Information" + +#: templates/standard/template.welcome.html:22 +msgid "Available clients" +msgstr "Verfügbare Mandanten" + +#: templates/standard/template.welcome.html:42 +msgid "Currently" +msgstr "Momentan" + +#: templates/standard/template.welcome.html:42 +msgid "Users online" +msgstr "Benutzer online" + +#: templates/standard/template.welcome.html:50 +msgid "Contact System Administrators" +msgstr "Kontakt Systemadministrator(en)" + +#: templates/standard/template.upl_files_overview.html:61 +msgid "Sort files" +msgstr "Dateisortierung" + +#: templates/standard/template.upl_files_overview.html:82 +#: classes/class.cms_filelist.php:438 +msgid "Filename" +msgstr "Dateiname" + +#: templates/standard/template.upl_files_overview.html:86 +#: classes/class.cms_filelist.php:441 +msgid "File size" +msgstr "Dateigröße" + +#: templates/standard/template.upl_files_overview.html:88 +msgid "Image size" +msgstr "Bildgröße" + +#: templates/standard/template.recipient_menu.html:88 +#: templates/standard/template.log_main.html:38 +msgid "Limit" +msgstr "Beschränkung" + +#: templates/standard/template.log_main.html:14 +#: classes/class.cms_filelist.php:722 +msgid "Filter" +msgstr "Filter" + +#: templates/standard/template.log_main.html:49 +msgid "Date" +msgstr "Datum" + +#: cronjobs/send_reminder.php:97 +#, php-format +msgid "" +"Hello %s,\n" +"\n" +"you've got a new reminder for the client '%s' at\n" +"%s:\n" +"\n" +"%s" +msgstr "" +"Hallo %s,\n" +"\n" +"Du hast eine Wiedervorlage erhalten für den Mandanten '%s' bei\n" +"%s:\n" +"\n" +"%s" + +#: main.loginform.php:70 +msgid "" +"Contenido is in maintenance mode. Only sysadmins are allowed to login. " +"Please try again later." +msgstr "" +"Contenido befindet sich im Wartungsmodus. Nur Systemadministratoren kö" +"nnen sich einloggen. Bitte versuchen Sie es zu einem späteren Zeitpunkt " +"erneut." + +#: main.loginform.php:158 +msgid "ConLite Backend" +msgstr "ConLite Backend" + +#: main.loginform.php:169 +msgid "Invalid Login or Password!" +msgstr "Login fehlgeschlagen!" + +#: main.loginform.php:176 +msgid "Password" +msgstr "Passwort" + +#: classes/class.versionFile.php:131 +msgid "Can not open file " +msgstr "Konnte Datei %s nicht Öffnen" + +#: classes/class.request.password.php:251 +msgid "Please enter your login" +msgstr "Bitte geben Sie hier Ihren Login ein" + +#: classes/class.request.password.php:257 +msgid "Hide request" +msgstr "Fenster schliessen" + +#: classes/class.request.password.php:301 +#, php-format +msgid "Password requests are allowed every %s minutes." +msgstr "Passwörter können nur alle %s Minuten angefordert werden." + +#: classes/class.request.password.php:309 +#: classes/class.request.password.php:322 +msgid "No matching data found. Please contact your systemadministrator." +msgstr "" +"Keine passenden Daten gefunden. Bitte wenden Sie sich an Ihren System-" +"Administrator." + +#: classes/class.request.password.php:315 +msgid "New password was submitted to your e-mail address." +msgstr "Das neue Passwort wurde soeben an Ihre E-Mailadresse gesendet." + +#: classes/class.request.password.php:358 +#, php-format +msgid "" +"Dear Contenidouser %s,\n" +"\n" +"Your password to log in Content Management System Contenido is: %s\n" +"\n" +"Best regards\n" +"\n" +"Your Contenido sysadmin" +msgstr "" +"Lieber ConLite-User %s,\n" +"\n" +"Ihr Passwort für das Login in das Content Management System ConLite " +"ist: %s\n" +"\n" +"Viele Grüße\n" +"\n" +"Ihr ConLite Systemadministrator" + +#: classes/class.request.password.php:374 +msgid "Your new password for Contenido Backend" +msgstr "Ihr neues Passwort für das ConLite Backend" + +#: classes/class.notification.php:114 scripts/langref.php:14 +#: scripts/articleObject.js.php:228 scripts/articleObject.js.php:231 +msgid "Error" +msgstr "Fehler" + +#: classes/class.notification.php:120 +msgid "Warning" +msgstr "Warnung" + +#: classes/class.notification.php:133 +msgid "Notification" +msgstr "Hinweis" + +#: classes/widgets/class.widgets.datawidgets.php:314 +#: classes/widgets/class.widgets.datawidgets.php:315 +msgid "Clear contents" +msgstr "Inhalt leeren" + +#: classes/widgets/class.widgets.pager.php:47 +#: classes/widgets/class.widgets.pager.php:51 +msgid "Paging" +msgstr "Seitennavigation" + +#: classes/widgets/class.widgets.pager.php:85 +msgid "First page" +msgstr "Erste Seite" + +#: classes/widgets/class.widgets.pager.php:92 +msgid "Previous page" +msgstr "Vorherige Seite" + +#: classes/widgets/class.widgets.pager.php:106 +#, php-format +msgid "Page %s" +msgstr "Seite %s" + +#: classes/widgets/class.widgets.pager.php:122 +msgid "Next page" +msgstr "Nächste Seite" + +#: classes/widgets/class.widgets.pager.php:132 +msgid "Last page" +msgstr "Letzte Seite" + +#: classes/con2con/class.filehandler.php:451 +#, fuzzy +msgid "Wrong file name." +msgstr "Falscher Dateiname." + +#: classes/con2con/class.filehandler.php:467 +#, fuzzy +msgid "Please insert file name." +msgstr "Bitte Dateinamen angeben." + +#: classes/class.cms_teaser.php:386 +msgid "Block Style" +msgstr "Blockdarstellung" + +#: classes/class.cms_teaser.php:389 +msgid "Blog Style" +msgstr "Listendarstellung" + +#: classes/class.cms_teaser.php:451 +msgid "Scaled" +msgstr "Skaliert" + +#: classes/class.cms_teaser.php:454 +msgid "Cropped" +msgstr "Zugeschnitten" + +#: classes/class.cms_teaser.php:480 +msgid "Sort Sequence" +msgstr "Sortierreihenfolge" + +#: classes/class.cms_teaser.php:483 +msgid "Creationdate" +msgstr "Erstellungsdatum" + +#: classes/class.cms_teaser.php:486 +msgid "Publisheddate" +msgstr "Veröffentlichungsdatum" + +#: classes/class.cms_teaser.php:489 +msgid "Modificationdate" +msgstr "Änderungsdatum" + +#: classes/class.cms_teaser.php:578 +msgid "Teasersettings" +msgstr "Teasereinstellungen" + +#: classes/class.cms_teaser.php:579 +msgid "Teasertitle" +msgstr "Teaserüberschrift" + +#: classes/class.cms_teaser.php:580 +msgid "Teaser Startarticle" +msgstr "Teaser Startartikel" + +#: classes/class.cms_teaser.php:581 +msgid "Sourcecategory" +msgstr "Quellkategorie" + +#: classes/class.cms_teaser.php:582 +msgid "Number of Articles" +msgstr "Anzahl der Artikel" + +#: classes/class.cms_teaser.php:583 classes/class.cms_filelist.php:724 +msgid "General Settings" +msgstr "Allgemeine Einstellungen" + +#: classes/class.cms_teaser.php:584 +msgid "Teaser Style" +msgstr "Teaser Darstellung" + +#: classes/class.cms_teaser.php:585 +msgid "Advanced Teaser Settings" +msgstr "Erweiterte Teaser Einstellungen" + +#: classes/class.cms_teaser.php:586 +msgid "Teaser Filter" +msgstr "Teaser Filter" + +#: classes/class.cms_teaser.php:587 +msgid "Teaser Sort" +msgstr "Teaser Sortierung" + +#: classes/class.cms_teaser.php:589 +msgid "Source Headline" +msgstr "Quelle Überschrift" + +#: classes/class.cms_teaser.php:590 +msgid "Source Settings" +msgstr "Quelleinstellungen" + +#: classes/class.cms_teaser.php:591 +msgid "Source Text" +msgstr "Quelle Text" + +#: classes/class.cms_teaser.php:592 +msgid "Source Image" +msgstr "Quelle Bild" + +#: classes/class.cms_teaser.php:593 +msgid "Source Date" +msgstr "Quelle Datum" + +#: classes/class.cms_teaser.php:598 classes/class.cms_filelist.php:720 +msgid "General" +msgstr "Allgemein" + +#: classes/class.cms_teaser.php:599 +msgid "Advanced" +msgstr "Erweitert" + +#: classes/class.cms_teaser.php:600 classes/class.cms_filelist.php:721 +msgid "Manual" +msgstr "Manuell" + +#: classes/class.cms_teaser.php:601 +msgid "Included Articles" +msgstr "Eingebundene Artikel" + +#: classes/class.cms_teaser.php:602 +msgid "Add Article" +msgstr "Artikel hinzufügen" + +#: classes/class.cms_teaser.php:603 +msgid "Manual Teaser Settings" +msgstr "Manuelle Teaser Einstellungen" + +#: classes/class.cms_teaser.php:604 +msgid "Manual Teaser" +msgstr "Manueller Teaser" + +#: classes/class.cms_teaser.php:607 +msgid "Size Settings" +msgstr "Größeneinstellungen" + +#: classes/class.cms_teaser.php:608 +msgid "Characterlength" +msgstr "Zeichenanzahl" + +#: classes/class.cms_teaser.php:609 +msgid "Imagewidth" +msgstr "Bildbreite" + +#: classes/class.cms_teaser.php:610 +msgid "Imageheight" +msgstr "Bildhöhe" + +#: classes/class.cms_teaser.php:611 +msgid "Image Scale" +msgstr "Bildskalierung" + +#: classes/class.cms_teaser.php:648 +msgid "Add" +msgstr "Hinzufügen" + +#: classes/class.ajax.php:111 classes/class.ajax.php:135 +#: classes/class.ajax.php:185 +msgid "No data found!" +msgstr "Keine Daten gefunden!" + +#: classes/class.ajax.php:160 +msgid "idcat" +msgstr "idcat" + +#: classes/class.ajax.php:161 classes/class.ajax.php:178 +msgid "idlang" +msgstr "idlang" + +#: classes/class.ajax.php:177 +msgid "idart" +msgstr "idart" + +#: classes/class.cms_date.php:212 +msgid "Please Choose Format" +msgstr "Format Auswählen" + +#: classes/datatypes/class.datatype.datetime.php:165 +msgid "Saturday" +msgstr "Samstag" + +#: classes/class.version.php:199 +#, php-format +msgid "Alternative path %s does not exist. Version was saved in frondendpath." +msgstr "" +"Der alternative Pfad %s existiert nicht. Die Verison wurde im Frontendpfad " +"gespeichert." + +#: classes/class.version.php:538 +msgid "Clear layout history" +msgstr "Layouthistorie löschen" + +#: classes/class.version.php:539 +msgid "Do you really want to clear layout history?" +msgstr "Möchten Sie wirklich die Layouthistorie löschen?" + +#: classes/class.version.php:539 +msgid "Note: This only affects the current layout." +msgstr "Hinweis: Dies betrifft nur das aktuelle Layout." + +#: classes/class.version.php:542 +msgid "Clear module history" +msgstr "Modulhistorie löschen" + +#: classes/class.version.php:543 +msgid "Do you really want to clear module history?" +msgstr "Möchte Sie wirklich die Modulhistorie löschen?" + +#: classes/class.version.php:543 +msgid "Note: This only affects the current module." +msgstr "Hinweis: Dies betrifft nur das aktuelle Modul." + +#: classes/class.version.php:546 +msgid "Clear style history" +msgstr "Stylehistorie löschen" + +#: classes/class.version.php:547 +msgid "Do you really want to clear style history?" +msgstr "Möchten Sie wirklich die Stylehistorie löschen?" + +#: classes/class.version.php:547 +msgid "Note: This only affects the current style." +msgstr "Hinweis: Dies betrifft nur das aktuelle Style." + +#: classes/class.version.php:550 +msgid "Clear Java-Script history" +msgstr "Java-Script Historie löschen" + +#: classes/class.version.php:551 +msgid "Do you really want to clear Java-Script history?" +msgstr "Möchten Sie wirklich die Java-Script Historie löschen?" + +#: classes/class.version.php:551 +msgid "Note: This only affects the current Java-Script." +msgstr "Hinweis: Dies betrifft nur das aktuelle Java-Script." + +#: classes/class.version.php:554 +msgid "Clear HTML-Template history" +msgstr "HTML-Template Historie löschen" + +#: classes/class.version.php:555 +msgid "Do you really want to clear HTML-Template history?" +msgstr "Möchten Sie wirklich die HTML-Template Historie löschen?" + +#: classes/class.version.php:555 +msgid "Note: This only the affects current HTML-Template." +msgstr "Hinweis: Dies betrifft nur das aktuelle HTML-Template." + +#: classes/class.version.php:558 +msgid "Clear history" +msgstr "Stylehistorie löschen" + +#: classes/class.version.php:559 +msgid "Do you really want to clear history?" +msgstr "Möchten Sie wirklich die Stylehistorie löschen?" + +#: classes/class.version.php:559 +msgid "Note: This only affects the current history." +msgstr "Hinweis: Dies betrifft nur die aktuelle Historie." + +#: classes/class.conuser.php:842 classes/class.conuser.php:867 +#, php-format +msgid "" +"Please use at least %d lower and upper case characters in your password!" +msgstr "" +"Bitte benutzen Sie mindestens %d Klein- und Groß-Buchstaben in Ihrem " +"Passwort!" + +#: classes/class.conuser.php:847 +#, php-format +msgid "Please use at least %d numbers in your password!" +msgstr "Bitte benutzen Sie mindestens %d Zahlen in Ihrem Passwort!" + +#: classes/class.conuser.php:852 +#, php-format +msgid "Please use at least %d symbols in your password!" +msgstr "Bitte benutzen Sie mindestens %d Sonderzeichen in Ihrem Passwort!" + +#: classes/class.conuser.php:857 +#, php-format +msgid "Password is too short! Please use at least %d signs." +msgstr "Ihr Passwort ist zu kurz! Bitte benutzen Sie mindestens %d Zeichen." + +#: classes/class.conuser.php:863 +msgid "Password does not contain enough different characters." +msgstr "Ihr Passwort beinhaltet nicht genug unterschiedliche Zeichen." + +#: classes/class.conuser.php:872 +msgid "Please choose a more secure password!" +msgstr "" +"Ihr Passwort ist nicht sicher genug. Bitte wählen Sie ein sichereres " +"Passwort!" + +#: classes/class.update.notifier.php:422 classes/class.update.notifier.php:427 +msgid "Unable to check for new updates!" +msgstr "Update-Überprüfung kann nicht durchgeführt werden!" + +#: classes/class.update.notifier.php:422 +msgid "Could not handle server response!" +msgstr "Server-Antwort konnte nicht verarbeitet werden!" + +#: classes/class.update.notifier.php:427 +msgid "Could not determine vendor version!" +msgstr "Hersteller-Version konnte nicht gelesen werden!" + +#: classes/class.update.notifier.php:540 +msgid "Unable to check for updates!" +msgstr "Es kann nicht auf Updates geprüft werden" + +#: classes/class.update.notifier.php:541 +#, fuzzy, php-format +msgid "Connection to %s failed!" +msgstr "Verbindung zu %s fehlgeschlagen!" + +#: classes/class.update.notifier.php:646 +msgid "Disable update notification" +msgstr "Update-Nachrichten deaktivieren" + +#: classes/class.update.notifier.php:648 classes/class.update.notifier.php:660 +msgid "Disable notification" +msgstr "Benachrichtigung deaktivieren" + +#: classes/class.update.notifier.php:651 +msgid "Enable update notification (recommended)" +msgstr "Update-Nachrichten aktivieren (empfohlen)" + +#: classes/class.update.notifier.php:653 classes/class.update.notifier.php:667 +msgid "Enable notification" +msgstr "Benachrichtigung aktivieren" + +#: classes/class.update.notifier.php:658 +msgid "Disable RSS notification" +msgstr "RSS-Nachrichten deaktivieren" + +#: classes/class.update.notifier.php:665 +msgid "Enable RSS notification (recommended)" +msgstr "RSS-Nachrichten aktivieren (empfohlen)" + +#: classes/class.update.notifier.php:669 +msgid "RSS notification is disabled" +msgstr "RSS-Nachrichten sind deaktiviert" + +#: classes/class.update.notifier.php:718 +msgid "read more" +msgstr "mehr lesen" + +#: classes/class.update.notifier.php:728 classes/class.update.notifier.php:737 +msgid "No RSS content available" +msgstr "Keine RSS-Inhalte verfügbar" + +#: classes/class.update.notifier.php:735 classes/class.update.notifier.php:753 +msgid "" +"Your webserver does not have write permissions for the directory /contenido/" +"cache/!" +msgstr "" +"Ihr Webserver hat keine Schreibberechtigungen für das Verzeichnis /" +"contenido/cache/!" + +#: classes/class.update.notifier.php:756 +msgid "" +"Update notification is disabled! For actual update information, please " +"activate." +msgstr "" +"Die Update-Benachrichtigung ist deaktiviert! Für aktuelle Update-" +"Nachrichten, bitte aktivieren." + +#: classes/class.update.notifier.php:761 +#, fuzzy +msgid "You have an unknown or unsupported version of ConLite!" +msgstr "" +"Sie haben eine unbekannte oder nicht unterstützte Version von ConLite!" + +#: classes/class.update.notifier.php:764 +#, fuzzy, php-format +msgid "" +"Your version of ConLite is deprecated and not longer supported for any " +"updates. Please update to a higher version!
    Download now!" +msgstr "" +"Ihre Version von ConLite wird nicht länger mit Updates gepflegt. Bitte " +"aktualisieren Sie auf eine höhere Version!
    Jetzt herunterladen!" + +#: classes/class.update.notifier.php:768 +#, fuzzy, php-format +msgid "" +"A new version of ConLite is available!
    Download %s now!" +msgstr "" +"Eine neue Version von ConLite ist verfügbar!
    %s jetzt herunterladen!" + +#: classes/class.update.notifier.php:771 +#, fuzzy, php-format +msgid "" +"It seems to be that your version string was manipulated. ConLite %s does not " +"exist!" +msgstr "" +"Es scheint so als wenn der ConLite Versionsstring manipuliert wurde. ConLite " +"%s gibt es nicht!" + +#: classes/class.update.notifier.php:774 +#, fuzzy +msgid "Your version of ConLite is up to date!" +msgstr "Ihre Version von ConLite ist aktuell!" + +#: classes/template/class.template.php:332 +msgid "\"" +msgstr "" + +#: classes/contenido/class.layout.php:179 +msgid "" +"Layout uses LayFromFile. Editing and Saving may not be possible in backend." +msgstr "" +"Das Layout liegt im Dateisystem. Das Bearbeiten und Speichern ist im Backend " +"nicht möglich." + +#: classes/contenido/class.client.php:97 classes/class.client.php:131 +msgid "No client" +msgstr "Kein Mandant" + +#: classes/contenido/class.module.php:916 +msgid "" +"Using old CamelCase for name of modulefolder. You may lowercase the name for " +"modulefolder" +msgstr "" +"Using old CamelCase for name of modulefolder. You may lowercase the name for " +"modulefolder" + +#: classes/contenido/class.module.php:919 +msgid "" +"Module uses Output- and/or InputFromFile. Editing and Saving may not be " +"possible in backend." +msgstr "" +"Das Modul liegt im Dateisystem. Das Bearbeiten und Speichern ist im Backend " +"nicht möglich." + +#: classes/class.todo.php:101 +msgid "New" +msgstr "Neu" + +#: classes/class.todo.php:102 +msgid "In progress" +msgstr "In Bearbeitung" + +#: classes/class.todo.php:103 +msgid "Done" +msgstr "Erledigt" + +#: classes/class.todo.php:104 +msgid "Waiting for action" +msgstr "Warte auf Aktion" + +#: classes/class.todo.php:105 +msgid "Deferred" +msgstr "Aufgeschoben" + +#: classes/class.todo.php:113 +msgid "Low" +msgstr "Niedrig" + +#: classes/class.todo.php:114 +msgid "Medium" +msgstr "Mittel" + +#: classes/class.todo.php:115 +msgid "High" +msgstr "Hoch" + +#: classes/class.todo.php:116 +msgid "Immediately" +msgstr "Sofort" + +#: classes/class.navigation.php:435 +msgid "-- No Language available --" +msgstr "-- Keine Sprache verfügbar --" + +#: classes/class.note.php:331 classes/class.note.php:334 +msgid "View notes / add note" +msgstr "Notizen anzeigen / hinzufügen" + +#: classes/class.inuse.php:242 +msgid "Click here if you want to override the lock" +msgstr "Hier klicken, um die Sperre zu übergehen" + +#: classes/class.inuse.php:246 +msgid "Do you really want to override the lock?" +msgstr "Möchten Sie wirklich die Sperre übergehen?" + +#: classes/class.inuse.php:248 +msgid "Override lock" +msgstr "Sperre übergehen" + +#: classes/class.inuse.php:248 +msgid "Hide notification" +msgstr "Benachrichtigung ausblenden" + +#: classes/class.cms_filelist.php:413 +msgid "Default Style" +msgstr "Standarddarstellung" + +#: classes/class.cms_filelist.php:719 +msgid "Directories" +msgstr "Verzeichnisse" + +#: classes/class.cms_filelist.php:725 +msgid "Manual Settings" +msgstr "Manuelle Einstellungen" + +#: classes/class.cms_filelist.php:726 +msgid "Filter settings" +msgstr "Filter-Einstellungen" + +#: classes/class.cms_filelist.php:727 +msgid "File list settings" +msgstr "Dateilisteneinstellungen" + +#: classes/class.cms_filelist.php:728 +msgid "File list title" +msgstr "Dateilistentitel" + +#: classes/class.cms_filelist.php:729 +msgid "File size limit" +msgstr "Dateigrößenbeschränkung" + +#: classes/class.cms_filelist.php:730 +msgid "Creation date limit" +msgstr "Zeitraum des Erstellungsdatums" + +#: classes/class.cms_filelist.php:731 +msgid "Modify date limit" +msgstr "Zeitraum des Änderungsdatums" + +#: classes/class.cms_filelist.php:733 +msgid "File list style" +msgstr "Darstellungsart" + +#: classes/class.cms_filelist.php:734 +msgid "Source directory" +msgstr "Quellverzeichnis" + +#: classes/class.cms_filelist.php:735 +msgid "Include subdirectories?" +msgstr "Unterverzeichnisse berücksichtigen?" + +#: classes/class.cms_filelist.php:736 +msgid "Include meta data?" +msgstr "Meta-Daten laden?" + +#: classes/class.cms_filelist.php:737 +msgid "File list sort" +msgstr "Sortierungsart" + +#: classes/class.cms_filelist.php:739 +msgid "Displayed file extensions" +msgstr "Angezeigte Datei-Erweiterungen" + +#: classes/class.cms_filelist.php:740 +msgid "Ignore selection (use all)" +msgstr "Auswahl ignorieren (alle benutzen)" + +#: classes/class.cms_filelist.php:741 +msgid "Selection will be ignored!" +msgstr "Auswahl wird ignoriert!" + +#: classes/class.cms_filelist.php:742 +msgid "Select all entries" +msgstr "Alle Einträge selektieren" + +#: classes/class.cms_filelist.php:743 +msgid "Use manual file list?" +msgstr "Manuelle Dateiliste verwenden?" + +#: classes/class.cms_filelist.php:744 +msgid "Directory" +msgstr "Verzeichnis" + +#: classes/class.cms_filelist.php:746 +msgid "Files" +msgstr "Dateien" + +#: classes/class.cms_filelist.php:747 +msgid "Existing files" +msgstr "Ausgewählte Dateien" + +#: classes/class.cms_filelist.php:748 +msgid "Add file" +msgstr "Datei hinzufügen" + +#: classes/class.cms_filelist.php:749 +msgid "File count" +msgstr "Anzahl der Dateien" + +#: scripts/HTMLObj.js.php:248 scripts/langref.php:10 +msgid "Protect" +msgstr "Schützen" + +#: scripts/HTMLObj.js.php:251 scripts/langref.php:11 +msgid "Remove protection" +msgstr "Schutz entfernen" + +#: scripts/messageBox.js.php:78 scripts/langref.php:20 +msgid "Confirm" +msgstr "Bestätigen" + +#: scripts/messageBox.js.php:80 scripts/langref.php:22 +msgid "Close window" +msgstr "Fenster schliessen" + +#: scripts/rights.js.php:67 scripts/rights.js.php:70 scripts/langref.php:23 +#: scripts/iZoom.js.php:70 scripts/iZoom.js.php:73 +msgid "Click to close" +msgstr "Klicken zum Schliessen" + +#: scripts/langref.php:13 scripts/articleObject.js.php:248 +msgid "Overview cannot be displayed" +msgstr "Übersicht kann nicht angezeigt werden" + +#: scripts/langref.php:15 scripts/articleObject.js.php:274 +msgid "Article can't be displayed" +msgstr "Artikel kann nicht angezeigt werden" + +#: scripts/langref.php:16 scripts/articleObject.js.php:274 +#: scripts/articleObject.js.php:305 scripts/articleObject.js.php:335 +#: scripts/articleObject.js.php:360 scripts/articleObject.js.php:379 +msgid "No article was selected" +msgstr "Kein Artikel ausgewählt" + +#: scripts/langref.php:17 scripts/articleObject.js.php:305 +msgid "Template configuration can't be displayed" +msgstr "Template-Konfiguration kann nicht angezeigt werden" + +#: scripts/langref.php:18 scripts/articleObject.js.php:257 +#: scripts/articleObject.js.php:290 scripts/articleObject.js.php:319 +#: scripts/articleObject.js.php:335 +msgid "Editor can't be displayed" +msgstr "Editor kann nicht angezeigt werden" + +#: scripts/langref.php:19 scripts/articleObject.js.php:360 +msgid "Preview can't be displayed" +msgstr "Vorschau kann nicht angezeigt werden" + +#: scripts/langref.php:24 +msgid "Headline / HTML" +msgstr "Überschrift / HTML" + +#: scripts/langref.php:25 +msgid "Text / HTML" +msgstr "Text / HTML" + +#: scripts/langref.php:26 +msgid "Text / Standard" +msgstr "Text / Standard" + +#: scripts/langref.php:27 +msgid "Picture" +msgstr "Bild" + +#: scripts/langref.php:29 +msgid "Description / Standard" +msgstr "Beschreibung / Standard" + +#: scripts/langref.php:30 +msgid "Flash Movie" +msgstr "Flash-Film" + +#: scripts/langref.php:32 +msgid "Frame" +msgstr "Frame" + +#: scripts/articleObject.js.php:257 scripts/articleObject.js.php:290 +#: scripts/articleObject.js.php:319 +msgid "Can't edit articles in foreign languages." +msgstr "" +"Artikel ist in nicht-aktiver bzw. nicht synchronisierter Sprache nicht " +"bearbeitbar." + +#: scripts/articleObject.js.php:379 +msgid "Tab can't be displayed" +msgstr "Reiter kann nicht angezeigt werden" + +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "Generate XHTML" +#~ msgstr "XHTML erzeugen" + +#~ msgid "Newsletter: %s" +#~ msgstr "Newsletter: %s" + +#~ msgid "" +#~ "The html newsletter article has been deleted (idart: %s), the html " +#~ "message is lost" +#~ msgstr "" +#~ "Der HTML-Newsletter-Artikel wurde gelöscht (idart: %s), die HTML-" +#~ "Nachricht kann nicht wiederhergestellt werden" + +#~ msgid "" +#~ "The html newsletter template article has been deleted, it has been " +#~ "restored using the html message article of this newsletter" +#~ msgstr "" +#~ "Der HTML-Newsletter-Template-Artikel wurde gelöscht; er wurde aus " +#~ "dem aktuellen HTML-Newsletter-Artikel wiederhergestellt" + +#~ msgid "%s (Template restored)" +#~ msgstr "%s (Template wiederhergestellt)" + +#~ msgid "Edit newsletter message (%s)" +#~ msgstr "Newsletter-Nachricht bearbeiten (%s)" + +#~ msgid "Tag information" +#~ msgstr "Tag-Information" + +#~ msgid "Special message tags (will be replaced when sending)" +#~ msgstr "Spezielle Tags (werden beim Senden ersetzt)" + +#~ msgid "Name of the recipient" +#~ msgstr "Name des Empfägers" + +#~ msgid "Date, when the mail has been sent" +#~ msgstr "Datum des E-Mail Versands" + +#~ msgid "Time, when the mail has been sent" +#~ msgstr "Zeit des e-Mail Versand" + +#~ msgid "Number of recipients" +#~ msgstr "Anzahl der Empfänger" + +#~ msgid "Link to unsubscribe" +#~ msgstr "Link zum Abbestellen des Newsletters" + +#~ msgid "Link to pause the subscription" +#~ msgstr "Link zum Pausieren des Newsletterempfangs" + +#~ msgid "Link to resume the subscription" +#~ msgstr "Link, um den Newsletterempfang wieder aufzunehmen" + +#~ msgid "" +#~ "Special message tags (will be replaced when sending, {..} = optional)" +#~ msgstr "" +#~ "Spezielle Nachrichten-Tags (werden beim Senden ersetzt, {...} = optional)" + +#~ msgid "Link text" +#~ msgstr "Link-Text" + +#~ msgid "Additional message tags from recipients plugins:" +#~ msgstr "Zusätzliche Tags aus Empfänger-Plugins:" + +#~ msgid "-- none --" +#~ msgstr "-- Kein(e) --" + +#~ msgid "HTML Template" +#~ msgstr "HTML-Template" + +#~ msgid "" +#~ "Note, that changing the template discards the current html message content" +#~ msgstr "" +#~ "Hinweis: Eine Änderung des Templates verwirft die aktuelle HTML-" +#~ "Nachricht" + +#~ msgid "HTML Message" +#~ msgstr "HTML-Nachricht" + +#~ msgid "" +#~ "Newsletter type has been set to HTML/text, please remember to select an " +#~ "html template" +#~ msgstr "" +#~ "Dieser Newsletter ist ein HTML- und Text-Newsletter; bitte denken Sie " +#~ "daran, ein HTML-Template auszuwählen" + +#~ msgid "Please choose a template first" +#~ msgstr "Bitte zuerst HTML-Template wählen" + +#~ msgid "Text Message" +#~ msgstr "Text-Nachricht" + +#~ msgid "HTML newsletter template changed" +#~ msgstr "Änderung des HTML-Newsletter-Templates" + +#~ msgid "" +#~ "HTML template has been changed. Do you like to save now to apply changes?" +#~ "

    Note, that existing HTML newsletter content will get lost!" +#~ "" +#~ msgstr "" +#~ "Das HTML-Template wurde geändert. Möchten Sie jetzt speichern, " +#~ "um die Änderungen anzuwenden?

    Bitte beachten Sie, dass " +#~ "der ggf. vorhandene Inhalt des HTML-Newsletters verloren geht!" + +#~ msgid "-- new newsletter --" +#~ msgstr "-- Neuer Newsletter --" + +#~ msgid "Newsletter dispatch job has been added for this newsletter" +#~ msgstr "Versand-Job für diesen Newsletter wurde erzeugt" + +#~ msgid "" +#~ "Newsletter dispatch job has been not been added! Please check newsletter " +#~ "details" +#~ msgstr "" +#~ "Versand-Job für diesen Newsletter wurde nicht erzeugt! Bitte die " +#~ "Angaben überprüfen" + +#~ msgid "Test newsletter has been sent to:" +#~ msgstr "Test-Newsletter wurde an folgende Empfänger gesendet:" + +#~ msgid "Test newsletter has not been sent (partly or completely):" +#~ msgstr "Der Newsletter wurde nicht gesendet (im Ganzen oder in Teilen):" + +#~ msgid "Successful:" +#~ msgstr "Erfolgreich:" + +#~ msgid "Error messages:" +#~ msgstr "Fehlermeldungen:" + +#~ msgid "Could not set new newsletter name: name already exists" +#~ msgstr "" +#~ "Name konnte nicht geändert werden: Ein Newsletter gleichen Namens " +#~ "existiert bereits." + +#~ msgid "" +#~ "'Send to recipients in selected groups' has been selected, but no group " +#~ "has been specified. Selection has been set to 'Send to all recipients'" +#~ msgstr "" +#~ "'Newsletter an die Mitglieder der ausgewählten Gruppe(n) senden' " +#~ "wurde aktiviert, aber es wurde keine Gruppe ausgewählt. Die Option " +#~ "wurde auf 'An alle Empfänger senden' zurückgesetzt" + +#~ msgid "Text only" +#~ msgstr "Nur Text" + +#~ msgid "HTML and text" +#~ msgstr "HTML und Text" + +#~ msgid "From (E-Mail)" +#~ msgstr "Absender (E-Mail)" + +#~ msgid "From (Name)" +#~ msgstr "Absender (Name)" + +#~ msgid "optional" +#~ msgstr "Optional" + +#~ msgid "Note: Hold to select multiple items." +#~ msgstr "" +#~ "Hinweis: Drücken und halten Sie die Taste , um mehrere " +#~ "Einträge zu selektieren." + +#~ msgid "Send newsletter to all recipients" +#~ msgstr "Newsletter an alle Empfänger senden" + +#~ msgid "Send newsletter to the members of the default group" +#~ msgstr "Newsletter an Mitglieder der Standardgruppe senden" + +#~ msgid "Send newsletter to the members of the selected group(s):" +#~ msgstr "" +#~ "Newsletter an die Mitglieder der ausgewählten Gruppe(n) senden:" + +#~ msgid "Option has to be enabled as client setting - see techref for details" +#~ msgstr "" +#~ "Option muss über eine Systemeinstellung aktiviert werden - siehe " +#~ "techref für details" + +#~ msgid "Note: Set to 0 to send chunks manually." +#~ msgstr "Hinweis: 0 auswählen um Blöcke manuell zu versenden" + +#~ msgid "Welcome-Newsletter" +#~ msgstr "Willkommen-Newsletter" + +#~ msgid "Use cronjob" +#~ msgstr "Cronjob verwenden" + +#~ msgid "Send in blocks:" +#~ msgstr "In Blöcken senden:" + +#~ msgid "Recipients per block:" +#~ msgstr "Empfänger pro Block:" + +#~ msgid "Delay between blocks:" +#~ msgstr "Pause zwischen Blöcken:" + +#~ msgid "sec." +#~ msgstr "Sek." + +#~ msgid "Save option settings as default" +#~ msgstr "Einstellungen als Standard speichern" + +#~ msgid "" +#~ "Do you really want to delete the following newsletter dispatch job:
    " +#~ msgstr "" +#~ "Möchten Sie wirklich den folgenden Newsletter Versand-Job lö" +#~ "schen:
    " + +#~ msgid "Do you really want to run the following job:
    " +#~ msgstr "Möchten Sie wirklich den folgenden Job ausführen:
    " + +#~ msgid "Confirmed" +#~ msgstr "Bestätigt" + +#~ msgid "Deactivated" +#~ msgstr "Deaktiviert" + +#~ msgid "Member list options" +#~ msgstr "Anzeigeoptionen (Mitglieder)" + +#~ msgid "No recipients are added to this group yet" +#~ msgstr "Die Gruppe enthält z.Z. keine Empfänger" + +#~ msgid "No recipients found" +#~ msgstr "Keine Empfänger gefunden" + +#~ msgid "Member navigation" +#~ msgstr "Navigation (Mitglieder)" + +#~ msgid "Recipients in group" +#~ msgstr "Empfänger in der Gruppe" + +#~ msgid "Outsider list options" +#~ msgstr "Anzeigeoptionen (Nicht-Mitglieder)" + +#~ msgid "Outsider navigation" +#~ msgstr "Navigation (Nicht-Mitglieder)" + +#~ msgid "Add recipients" +#~ msgstr "Empfänger hinzufügen" + +#~ msgid "Note: Hold <Ctrl> to
    select multiple items." +#~ msgstr "" +#~ "Hinweis: Halten Sie <Ctrl> gedrückt, um
    mehrere Elemente " +#~ "auszuwählen." + +#~ msgid "Can't clear error log : Access is denied!" +#~ msgstr "Fehlerlog konnte nicht geleert werden: Zugriff verweigert!" + +#~ msgid "install error log successfully cleared" +#~ msgstr "Installation-Errorlog erfolgreich geleert" + +#~ msgid "Do you really want to delete the following newsletter:
    " +#~ msgstr "" +#~ "Sind Sie sicher, dass Sie den folgenden Newsletter löschen mö" +#~ "chten:
    " + +#~ msgid "Send test newsletter" +#~ msgstr "Test-Newsletter versenden" + +#~ msgid "" +#~ "Send test newsletter (disabled, check newsletter sender e-mail address " +#~ "and handler article selection)" +#~ msgstr "" +#~ "Test-Newsletter versenden (deaktiviert, Absender-Adresse und Handler-" +#~ "Artikel überprüfen)" + +#~ msgid "" +#~ "Add newsletter dispatch job (disabled, check newsletter sender e-mail " +#~ "address and handler article selection)" +#~ msgstr "" +#~ "Newsletter-Versand-Job erzeugen (deaktiviert, Absender-Adresse und " +#~ "Handler-Artikel überprüfen)" + +#~ msgid "Recipient group: %s" +#~ msgstr "Empfänger-Gruppe: %s" + +#~ msgid "Do you really want to send the newsletter to:
    %s" +#~ msgstr "" +#~ "Möchten Sie wirklich den Newsletter an den angegebenen Empfä" +#~ "nger versenden:
    %s" + +#~ msgid "Report:" +#~ msgstr "Bericht:" + +#~ msgid "Sending newsletter ... (chunk %s of %s, recipients: %s, sent: %s)" +#~ msgstr "" +#~ "Sende Newsletter ... (Block %s von %s, Empfänger: %s, gesendet: %s)" + +#~ msgid "Stop sending" +#~ msgstr "Senden abbrechen" + +#~ msgid "Send next chunk" +#~ msgstr "Nächster Block senden" + +#~ msgid "The newsletter has been sent to %s recipients" +#~ msgstr "Der Newsletter wurde an %s Empfänger gesendet" + +#~ msgid "-All-" +#~ msgstr "-Alle-" + +#~ msgid "Sent" +#~ msgstr "Gesendet" + +#~ msgid "Waiting for sending" +#~ msgstr "Warte auf Versand" + +#~ msgid "Sending" +#~ msgstr "Sende" + +#~ msgid "Successful" +#~ msgstr "Erfolgreich" + +#~ msgid "Error: %s" +#~ msgstr "Fehler: %s" + +#~ msgid "Newsletter Dispatch Job" +#~ msgstr "Newsletter Versand-Job" + +#~ msgid "Pending" +#~ msgstr "Bereit" + +#~ msgid "Sending (started: %s)" +#~ msgstr "Sende (gestartet: %s)" + +#~ msgid "Finished (started: %s, finished: %s)" +#~ msgstr "Abgeschlossen (gestartet: %s, abgeschlossen: %s)" + +#~ msgid "Planned: %s, Send: %s" +#~ msgstr "Geplant: %s, Gesendet: %s" + +#~ msgid "From" +#~ msgstr "Absender" + +#~ msgid "Send newsletter to single recipient:" +#~ msgstr "Newsletter an einzelnen Empfänger senden:" + +#~ msgid "Use cronjob: Enabled" +#~ msgstr "Cronjob: Aktiviert" + +#~ msgid "Use cronjob: Not enabled" +#~ msgstr "Cronjob: Nicht aktiviert" + +#~ msgid "Dispatch: Enabled (block size: %s, delay: %s sec.)" +#~ msgstr "" +#~ "In Blöcken versenden: Aktiviert (Blockgröße: %s, Pause: " +#~ "%s Sek.)" + +#~ msgid "Dispatch: Disabled" +#~ msgstr "Block-Sendung: Deaktiviert" + +#~ msgid "" +#~ "%d recipients, with no or incompatible key has been updated. Deactivate " +#~ "update function." +#~ msgstr "" +#~ "%d Empfänger ohne bzw. mit inkompatiblen Schlüssel wurden " +#~ "aktualisiert. Deaktivieren Sie die Update-Funktion." + +#~ msgid "Do you really want to delete the following recipient:
    " +#~ msgstr "" +#~ "Möchten Sie wirklich den folgenden Empfänger löschen:
    " + +#~ msgid "Mail" +#~ msgstr "Mail" + +#~ msgid "Confirmed Date" +#~ msgstr "Bestätigungsdatum" + +#~ msgid "Message type" +#~ msgstr "Nachrichtentyp" + +#~ msgid "Group" +#~ msgstr "Gruppe" + +#~ msgid "Given column header '%s' unknown, column ignored" +#~ msgstr "Gegebener Spaltenname '%s' unbekannt, Spalte wird ignoriert" + +#~ msgid "Mandatory column '%s' wasn't found, import stopped" +#~ msgstr "Benötigte Spalte '%s' nicht gefunden, Import gestoppt" + +#~ msgid "Item with empty mail address found, item ignored (name: %s, row: %s)" +#~ msgstr "" +#~ "Eintrag mit fehlender Emailadresse gefunden, Eintrag wird ignoriert " +#~ "(Name: %s, Reihe: %s)" + +#~ msgid "Mail address '%s' is invalid, item ignored (row: %s)" +#~ msgstr "Emailadresse '%s' ungültig, Eintrag ignoriert (Reihe: %s)" + +#~ msgid "" +#~ "Recipient with mail address '%s' already exists, item skipped (row: %s)" +#~ msgstr "" +#~ "Empfänger mit Emailadresse '%s' bereits vorhanden, Eintrag ü" +#~ "bersprungen (Reihe: %s)" + +#~ msgid "yes" +#~ msgstr "ja" + +#~ msgid "" +#~ "%d recipients added, %d recipients skipped (email already exists) and %d " +#~ "invalid recipients/e-mail adresses ignored. Invalid recipients are shown " +#~ "(if any)." +#~ msgstr "" +#~ "%d Empfänger ergänzt, %d Empfänger übergangen " +#~ "(Empfänger-E-Mail-Adresse wird bereits verwendet) und %d ungü" +#~ "tige Emfänger/E-Mail-Adressen ignoriert. Ggf. ungültige " +#~ "Empfänger werden angezeigt." + +#~ msgid "Tab" +#~ msgstr "Tab" + +#~ msgid "Semicolon" +#~ msgstr "Semikolon" + +#~ msgid "Delimiter" +#~ msgstr "Trennzeichen" + +#~ msgid "Import information" +#~ msgstr "Import Hinweise" + +#~ msgid "Specify colum types:" +#~ msgstr "Spaltentypen definieren:" + +#~ msgid "" +#~ "
    The first line must contain the column names; this specifies the " +#~ "column order.
    <column name>[delimiter]<column name>..." +#~ msgstr "" +#~ "
    Die erste Zeile muss die Spaltennamen enthalten; dies definiert die " +#~ "Spaltenreihenfolge.
    <Spaltenname>[Separator]<" +#~ "Spaltenname>..." + +#~ msgid "Data structure:" +#~ msgstr "Datenstruktur:" + +#~ msgid "" +#~ "The recipients have to be entered using the following format:
    <" +#~ "data>[Delimiter]<data>... - each recipient in a new line." +#~ msgstr "" +#~ "Die Empfänger müssen nach dem folgenden Format eingegeben " +#~ "werden:
    <data>[Separator]<data>... - Jeder Empfä" +#~ "nger in einer neuen Zeile." + +#~ msgid "Example:" +#~ msgstr "Beispiel:" + +#~ msgid "
    name;mail;confirmed
    Smith;jon.smith@example.org;1" +#~ msgstr "" +#~ "

    name;mail;bestätigt
    Smith;jon.smith@example.org;1" + +#~ msgid "The following column names will be recognized:" +#~ msgstr "Die folgenden Spaltennamen können verwendet werden:" + +#~ msgid "Contenido: " +#~ msgstr "ConLite: " + +#~ msgid "View" +#~ msgstr "Ansehen" + +#~ msgid "Details" +#~ msgstr "Details" + +#~ msgid "Edit Message" +#~ msgstr "Nachricht bearbeiten" + +#~ msgid "-- new recipient --" +#~ msgstr "-- Neuer Empfänger --" + +#~ msgid "" +#~ "%1backslashdollard recipients, which hasn't been confirmed since more " +#~ "than %2backslashdollard days has been removed." +#~ msgstr "" +#~ "%1backslashdollard Empfänger, die ihre E-Mail-Adresse seit mehr als " +#~ "%2backslashdollard Tagen nicht bestätigt haben, wurden gelöscht." + +#~ msgid "" +#~ "There are no recipients, which hasn't been confirmed since more than " +#~ "%2backslashdollard days has been removed." +#~ msgstr "" +#~ "Es gibt keine Empfänger, die ihre E-Mail-Adresse seit mehr als " +#~ "%2backslashdollard Tagen nicht bestätigt haben." + +#~ msgid "Please specify a valid e-mail address" +#~ msgstr "Bitte geben Sie eine gültige E-Mail-Adresse an" + +#~ msgid "" +#~ "Could not set new e-mail adress: Other recipient with same e-mail address " +#~ "already exists" +#~ msgstr "" +#~ "E-Mail-Adresse konnte nicht geändert werden: Ein Empfänger mit " +#~ "der gleichen E-Mail-Adresse existiert bereits" + +#~ msgid "Recipient is not member of any group" +#~ msgstr "Empfänger ist kein Mitglied einer Gruppe" + +#~ msgid "Associated Groups" +#~ msgstr "Mitglied von" + +#~ msgid "Dispatch" +#~ msgstr "Versand" + +#~ msgid "Recipient groups" +#~ msgstr "Empfänger-Gruppen" + +#~ msgid "Please select" +#~ msgstr "Bitte wählen" + +#~ msgid "My mail address" +#~ msgstr "Meine E-Mail-Adresse" + +#~ msgid "Enable HTML Newsletter" +#~ msgstr "HTML-Newsletter aktivieren" + +#~ msgid "HTML Template Category:" +#~ msgstr "Kategorie (HTML-Template):" + +#~ msgid "HTML Newsletter Category:" +#~ msgstr "Kategorie (HTML-Newsletter):" + +#~ msgid "Send test destination:" +#~ msgstr "Test-Empfänger:" + +#~ msgid "" +#~ "Do you really want to remove recipients, that have not been confirmed " +#~ "since %s days and over?" +#~ msgstr "" +#~ "Wollen Sie wirklich alle Empfänger, die ihre E-Mail-Adresse seit " +#~ "mehr als %s Tagen nicht bestätigt haben, löschen?" + +#~ msgid "Purge timeframe" +#~ msgstr "Zeitfenster" + +#~ msgid "days" +#~ msgstr "Tage" + +#~ msgid "-- All groups --" +#~ msgstr "-- Alle Gruppen --" + +#~ msgid "" +#~ "Do you really want to delete the following newsletter recipient group:
    " +#~ msgstr "" +#~ "Sind Sie sicher, dass Sie die folgende Gruppe löschen möchten:" +#~ "
    " + +#~ msgid "" +#~ "There was a problem getting the newsletter article using http. Error: %s " +#~ "(%s)" +#~ msgstr "" +#~ "Der HTML-Newsletter-Artikel konnte nicht eingelesen werden. Fehler: %s " +#~ "(%s)" + +#~ msgid "Newsletter to %s could not be sent: No html message available" +#~ msgstr "" +#~ "Newsletter an %s konnte nicht versendet werden: Keine HTML-Nachricht " +#~ "verügbar" + +#~ msgid "Newsletter to %s could not be sent: No valid e-mail address" +#~ msgstr "" +#~ "Newsletter an %s konnte nicht versendet werden: Keine gütige E-Mail-" +#~ "Adresse verfügbar" + +#~ msgid "Newsletter to %s could not be sent" +#~ msgstr "Newsletter an %s konnte nicht versendet werden" + +#~ msgid "Newsletter could not be sent: No html message available" +#~ msgstr "" +#~ "Newsletter konnte nicht versendet werden: Keine HTML-Nachricht verfü" +#~ "gbar" + +#~ msgid "" +#~ "Newsletter to %s could not be sent: Recipient has an incompatible or " +#~ "empty key" +#~ msgstr "" +#~ "Newsletter an %s konnte nicht versendet werden: Empfänger hat einen " +#~ "inkompatiblen oder leeren Schlüssel." + +#~ msgid "" +#~ "Newsletter to %s could not be sent: No valid e-mail address specified" +#~ msgstr "" +#~ "Newsletter an %s konnte nicht versendet werden: Keine gütige E-Mail " +#~ "Adresse angegeben" + +#~ msgid "No recipient with specified recipient/group id %s/%s found" +#~ msgstr "" +#~ "Keine Empfänger mit der angegebenen Empfänger-/Gruppen-ID %s/%s " +#~ "gefunden" + +#~ msgid "Provide address" +#~ msgstr "Adresse angeben" + +#~ msgid "Mailer not supported" +#~ msgstr "Mailer wird nicht unterstützt" + +#~ msgid "Execute" +#~ msgstr "Ausführen" + +#~ msgid "Instantiate" +#~ msgstr "Keine mail()-Instanz erzeugt" + +#~ msgid "From failed" +#~ msgstr "Fehler bei SMTP-Versand" + +#~ msgid "Recipients failed" +#~ msgstr "Fehlerhafte Empfänger" + +#~ msgid "Data not accepted" +#~ msgstr "Daten nicht akzeptiert" + +#~ msgid "Authenticate" +#~ msgstr "Authentifizierung" + +#~ msgid "Connect host" +#~ msgstr "Hostverbindung" + +#~ msgid "File access" +#~ msgstr "Dateizugriff" + +#~ msgid "File open" +#~ msgstr "Öffnen der Datei" + +#~ msgid "Endzeitpunkt wählen" +#~ msgstr "Endzeitpunkt wählen" + +#~ msgid "Startzeitpunkt wählen" +#~ msgstr "Startzeitpunkt wählen" + +#, fuzzy +#~ msgid "Please enter a category name" +#~ msgstr "Bitte geben Sie einen Kategorienamen ein." + +#~ msgid "Set category offline" +#~ msgstr "Kategorie offline setzen" + +#~ msgid "Set category online" +#~ msgstr "Kategorie online setzen" + +#~ msgid "One or more subcategories exist, unable to delete" +#~ msgstr "" +#~ "Mindestens eine Unterkategorie existiert, löschen nicht möglich" + +#~ msgid "Are you sure to delete the following category" +#~ msgstr "" +#~ "Sind Sie sicher, dass Sie die folgende Kategorie Löschen wollen" + +#~ msgid "Store content allocations" +#~ msgstr "Content Allocations speichern" + +#, fuzzy +#~ msgid "Content Allocation" +#~ msgstr "Content Allocations speichern" + +#~ msgid "There is no Content Allocation tree." +#~ msgstr "Es existiert kein Content Allocation Baum." + +#~ msgid "Remove all" +#~ msgstr "Alle entfernen" + +#~ msgid "Remove" +#~ msgstr "Entfernen" + +#~ msgid "New Category %s successfully stored!" +#~ msgstr "Neue Kategorie %s erfolgreich erstellt!" + +#~ msgid "Category %s successfully renamed!" +#~ msgstr "Kategorie %s erfolgreich umbenannt!" + +#~ msgid "Please enter a category name." +#~ msgstr "Bitte geben Sie einen Kategorienamen ein." + +#, fuzzy +#~ msgid "Access category" +#~ msgstr "Neue Kategorie" + +#~ msgid "Interns" +#~ msgstr "Interne Links" + +#~ msgid "Externs" +#~ msgstr "Externe Links" + +#~ msgid "Intern/extern Links" +#~ msgstr "Interne & externe Links" + +#~ msgid "Link analysis from " +#~ msgstr "Link Analyse von" + +#~ msgid "%Y-%m-%d" +#~ msgstr "%d.%m.%Y" + +#~ msgid "No errors were found." +#~ msgstr "Keine Einträge im Errorlog gefunden" + +#, fuzzy +#~ msgid "Linkerror" +#~ msgstr "Link" + +#, fuzzy +#~ msgid "Links to articles" +#~ msgstr "Link auf eine beliebige Datei" + +#, fuzzy +#~ msgid "Links to categories" +#~ msgstr "Alle Kategorien öffnen" + +#, fuzzy +#~ msgid "Links to documents and images" +#~ msgstr "Link zu einem Bild" + +#, fuzzy +#~ msgid "Wrong links" +#~ msgstr "Zeichenkettenliste" + +#, fuzzy +#~ msgid "Offline: article or category is offline." +#~ msgstr "Kategorie offline setzen" + +#~ msgid "No errors for this type." +#~ msgstr "Keine Einträge im Errorlog gefunden" + +#, fuzzy +#~ msgid "Entry" +#~ msgstr "Einträge" + +#, fuzzy +#~ msgid "Publish article" +#~ msgstr "Veröffentlichungsdatum" + +#, fuzzy +#~ msgid "Lock article" +#~ msgstr "Meine Artikel" + +#, fuzzy +#~ msgid "Move back to last editor" +#~ msgstr "Speichern und Editor schließen" + +#, fuzzy +#~ msgid "Reject article" +#~ msgstr "Artikel löschen" + +#, fuzzy +#~ msgid "Edit article content" +#~ msgstr "Artikel bearbeiten" + +#, fuzzy +#~ msgid "Revise article" +#~ msgstr "Artikel speichern" + +#, fuzzy +#~ msgid "Article doesn't exist" +#~ msgstr "Artikeleigenschaften" + +#, fuzzy +#~ msgid "Workflow notification" +#~ msgstr "E-Mail Benachrichtigung" + +#, fuzzy +#~ msgid "No item loaded" +#~ msgstr "nicht geladen" + +#, fuzzy +#~ msgid "Delete workflow" +#~ msgstr "Datei löschen" + +#, fuzzy +#~ msgid "Select workflow task" +#~ msgstr "Workflow Aufgaben anzeigen" + +#, fuzzy +#~ msgid "Show workflow" +#~ msgstr "Workflow Aufgaben anzeigen" + +#, fuzzy +#~ msgid "Create workflow" +#~ msgstr "Gruppe erzeugen" + +#, fuzzy +#~ msgid "Edit workflow" +#~ msgstr "Datei bearbeiten" + +#, fuzzy +#~ msgid "Process workflow step" +#~ msgstr "Workflow Aufgaben anzeigen" + +#~ msgid "Edit workflow step" +#~ msgstr "Workflow Schritt bearbeiten" + +#, fuzzy +#~ msgid "Move workflowstep down" +#~ msgstr "Eine Kategorie nach unten verschieben" + +#, fuzzy +#~ msgid "Save Workflowstep" +#~ msgstr "Notiz speichern" + +#, fuzzy +#~ msgid "Create workflowstep" +#~ msgstr "Gruppe erzeugen" + +#, fuzzy +#~ msgid "Delete workflowstep" +#~ msgstr "Datei löschen" + +#, fuzzy +#~ msgid "Create Workflowstepuser" +#~ msgstr "Frontendbenutzer erstellen" + +#~ msgid "Delete Workflowstepuser" +#~ msgstr "Frontendbenutzer löschen" + +#, fuzzy +#~ msgid "Associate workflow with category" +#~ msgstr "Artikel mit Kategorie" + +#~ msgid "Workflow Step" +#~ msgstr "Workflow Schritt" + +#~ msgid "Workflow Action" +#~ msgstr "Workflow Aktion" + +#~ msgid "Workflow Editor" +#~ msgstr "Workflow Editor" + +#, fuzzy +#~ msgid "Last status" +#~ msgstr "Letzte Seite" + +#, fuzzy +#~ msgid "Back to last editor" +#~ msgstr "Speichern und im Editor bleiben" + +#, fuzzy +#~ msgid "Rejected" +#~ msgstr "Weiterleitung" + +#, fuzzy +#~ msgid "Revised" +#~ msgstr "Entfernen" + +#, fuzzy +#~ msgid "Last" +#~ msgstr "Letzte Seite" + +#, fuzzy +#~ msgid "New Workflow" +#~ msgstr "Neues Fenster" + +#, fuzzy +#~ msgid "Create new workflow" +#~ msgstr "Neuen Baum anlegen" + +#, fuzzy +#~ msgid "Workflow name" +#~ msgstr "Gruppenname" + +#~ msgid "Do you really want to delete the following workflow:

    %s
    " +#~ msgstr "" +#~ "Möchten Sie die folgende Datei wirklich löschen:

    %s" + +#~ msgid "Add User" +#~ msgstr "Benutzer hinzufügen" + +#, fuzzy +#~ msgid "New Workflow Step" +#~ msgstr "Workflow Aufgaben anzeigen" + +#, fuzzy +#~ msgid "Seconds" +#~ msgstr "Semikolon" + +#~ msgid "Minutes" +#~ msgstr "Minuten" + +#~ msgid "Hours" +#~ msgstr "Stunden" + +#, fuzzy +#~ msgid "Days" +#~ msgstr "Tag(e)" + +#~ msgid "Weeks" +#~ msgstr "Wochen" + +#~ msgid "Months" +#~ msgstr "Monate" + +#, fuzzy +#~ msgid "Years" +#~ msgstr "Ja" + +#, fuzzy +#~ msgid "Move step up" +#~ msgstr "Eine Kategorie nach oben verschieben" + +#, fuzzy +#~ msgid "Move step down" +#~ msgstr "Eine Kategorie nach unten verschieben" + +#, fuzzy +#~ msgid "Delete step" +#~ msgstr "Benutzer löschen" + +#, fuzzy +#~ msgid "Create new step" +#~ msgstr "Neuen Baum anlegen" + +#, fuzzy +#~ msgid "Step name" +#~ msgstr "Host-Name" + +#, fuzzy +#~ msgid "Step description" +#~ msgstr "Layoutbeschreibung" + +#, fuzzy +#~ msgid "Assigned users" +#~ msgstr "Zugewiesen zu" + +#, fuzzy +#~ msgid "Move user up" +#~ msgstr "Eine Kategorie nach oben verschieben" + +#, fuzzy +#~ msgid "Move user down" +#~ msgstr "Eine Kategorie nach unten verschieben" + +#~ msgid "Notify this user via E-Mail" +#~ msgstr "Diesen Benutzer per Email erinnern" + +#~ msgid "Show users" +#~ msgstr "Aktueller Benutzer" + +#, fuzzy +#~ msgid "Workflow tasks" +#~ msgstr "Workflow Aufgaben anzeigen" + +#~ msgid "No (more) recipients found" +#~ msgstr "Keine (weiteren) Empfänger gefunden" + +#~ msgid "Sent successfully" +#~ msgstr "Erfolgreich versendet" + +#~ msgid "" +#~ "Newsletter to %s could not be sent (recipient has an incompatible or " +#~ "empty key)." +#~ msgstr "" +#~ "Newsletter an %s konnte nicht versendet werden: Empfänger hat einen " +#~ "inkompatiblen oder leeren Schlüssel" + +#~ msgid "Target" +#~ msgstr "Ziel" + +#~ msgid "Open in same window" +#~ msgstr "Im gleichen Fenster öffnen" + +#~ msgid "Colorpicker" +#~ msgstr "Farbauswahl" + +#~ msgid "Insert Link" +#~ msgstr "Link einfügen" + +#~ msgid "PDF" +#~ msgstr "PDF" + +#~ msgid "Media" +#~ msgstr "Medien" + +#~ msgid "Open in parent frame" +#~ msgstr "Im parent-Frame öffnen" + +#~ msgid "Open in top frame" +#~ msgstr "Im top-Frame öffnen" + +#~ msgid "Edit URL names" +#~ msgstr "URL-Namen bearbeiten" + +#~ msgid "Take over module history" +#~ msgstr "Modulhistorie übernehmen" + +#~ msgid "Filter users" +#~ msgstr "Benutzer filtern" + +#~ msgid "Delete frontenduser in frontendgroup" +#~ msgstr "Frontendbenutzer in Gruppe löschen" + +#~ msgid "The following users were added to this group" +#~ msgstr "Die folgenden Benutzer wurden dieser Gruppe hinzugefügt" + +#~ msgid "" +#~ "The following users are already existing in the group and where not added" +#~ msgstr "" +#~ "Die folgenden Benutzer existieren in dieser Gruppe bereits und wurden " +#~ "deshalb nicht hinzugefügt" + +#~ msgid "Group member" +#~ msgstr "Gruppenmitglied" + +#~ msgid "No users found" +#~ msgstr "Keine Benutzer gefunden" + +#~ msgid "Add group member" +#~ msgstr "Gruppenmitglied hinzufügen" + +#~ msgid "Choose user" +#~ msgstr "Benutzer wählen" + +#~ msgid "Display article link" +#~ msgstr "Artikellink anzeigen" + +#~ msgid "Syncronize from" +#~ msgstr "Synchronisieren von" + +#~ msgid "No users are added to this group yet" +#~ msgstr "Gruppe enthält noch keine Benutzer" + +#~ msgid "Users in Group" +#~ msgstr "Benutzer in der Gruppe" + +#~ msgid "Note: Hold ctrl to select multiple items." +#~ msgstr "" +#~ "Hinweis: Drücken und halten Sie die Taste \"STRG\", um mehrere " +#~ "Einträge zu selektieren." + +#~ msgid "Do you really want to create a new language?" +#~ msgstr "Möchten Sie wirklich eine neue Sprache erstellen?" + +#~ msgid "Layout is in use" +#~ msgstr "Layout wird benutzt" + +#~ msgid "Module history" +#~ msgstr "Modulhistorie" + +#~ msgid "Module data" +#~ msgstr "Moduldaten" + +#~ msgid "No history available" +#~ msgstr "Keine Modulhistorie vorhanden" + +#~ msgid "Module history disabled by system administrator" +#~ msgstr "Die Modulhistorie wurde vom Systemadministrator deaktiviert." + +#~ msgid "In use" +#~ msgstr "Wird benutzt" + +#~ msgid "Translate module \"%s\"" +#~ msgstr "Modul \"%s\" übersetzen" + +#~ msgid "Use JAVA Module Editor (experimental)" +#~ msgstr "JAVA-Moduleditor verwenden (experimentell)" + +#~ msgid "" +#~ "Insert recipients using this format:
    <data>[Delimiter]<" +#~ "data>... - each recipient in a new line." +#~ msgstr "" +#~ "Empfänger im folgenden Format eingeben:
    <Daten>" +#~ "[Trennzeichen]<Daten>... - jeweils eine Zeile pro Empfänger." + +#~ msgid "" +#~ "
    e.g. name;mail -> first column contains the name, the second the " +#~ "mail address." +#~ msgstr "" +#~ "
    z.B. Name;Mail -> erste Spalte enthält den Namen, die zweite " +#~ "die E-Mail-Adresse." + +#~ msgid "Categoryname" +#~ msgstr "Kategoriename" + +#~ msgid "Unprotect category" +#~ msgstr "Kategorie freigeben" + +#~ msgid "One or more articles are existing, unable to delete" +#~ msgstr "" +#~ "Ein oder mehrere Artikel existieren, löschen nicht möglich" + +#~ msgid "" +#~ "One or more subtrees and one or more articles are existing, unable to " +#~ "delete." +#~ msgstr "" +#~ "Mindestens eine Unterkategorie sowie mindestens ein Artikel existieren, " +#~ "löschen nicht möglich" + +#~ msgid "Move tree" +#~ msgstr "Baum verschieben" + +#~ msgid "Place tree here" +#~ msgstr "Baum hier ablegen" + +#~ msgid "No thumbnails" +#~ msgstr "Keine Thumbnails" + +#~ msgid "Thumbnail size:" +#~ msgstr "Thumbnail-Größe" + +#~ msgid "Select date, please." +#~ msgstr "Bitte Datum wählen" + +#~ msgid "Su" +#~ msgstr "So" + +#~ msgid "Mo" +#~ msgstr "Mo" + +#~ msgid "Tu" +#~ msgstr "Di" + +#~ msgid "We" +#~ msgstr "Mi" + +#~ msgid "Th" +#~ msgstr "Do" + +#~ msgid "Fr" +#~ msgstr "Fr" + +#~ msgid "Sa" +#~ msgstr "Sa" + +#~ msgid "Previous year" +#~ msgstr "Vorheriges Jahr" + +#~ msgid "Previous month" +#~ msgstr "Vorheriger Monat" + +#~ msgid "Next month" +#~ msgstr "Nächster Monat" + +#~ msgid "Next year" +#~ msgstr "Nächstes Jahr" + +#~ msgid "Time" +#~ msgstr "Zeit" + +#~ msgid "Conceptual Project Management / Testing" +#~ msgstr "Konzeptionelles Projektmanagement / Qualitätssicherung" + +#~ msgid "Technical Project Management / Testing" +#~ msgstr "Technisches Projektmanagement / Qualitätssicherung" + +#~ msgid "Warning: Changes will reset active Workflows" +#~ msgstr "Warnung: Änderungen setzen aktive Workflows zurück" + +#~ msgid "Non Groupmembers" +#~ msgstr "Nicht Gruppenmitglieder" + +#~ msgid "Groupmembers" +#~ msgstr "Gruppenmitglieder" + +#~ msgid "Add right side selected users to group" +#~ msgstr "Füge rechts ausgewählte Benutzer der Gruppe hinzu" + +#~ msgid "Remove left side selected users from group" +#~ msgstr "Entferne links ausgewählte Benutzer aus der Gruppe" + +#~ msgid "Rights type" +#~ msgstr "Rechtegruppe" + +#~ msgid "This user does not exist." +#~ msgstr "Der eingegebene Nutzername existiert nicht." + +#~ msgid "" +#~ "The requested user has no valid e-mail address. Submitting new password " +#~ "is not possible. Please contact your system- administrator for further " +#~ "support." +#~ msgstr "" +#~ "Der betroffene Nutzer hat keine gültige E-Mailadresse hinterlegt. " +#~ "Die Zusendung eines neuen Passworts ist nicht möglich. Bitte " +#~ "kontaktieren Sie Ihren System- administrator für weitere " +#~ "Unterstützung." + +#~ msgid "Form error" +#~ msgstr "Formularfehler" + +#~ msgid "Please select a new Position for new category" +#~ msgstr "Bitte wählen Sie eine Position für die neue Kategorie" + +#~ msgid "Field category name is empty" +#~ msgstr "Das Feld Kateogoriename ist leer" + +#~ msgid "Your Contenido Version" +#~ msgstr "Ihre Contenido Version" + +#~ msgid "Latest Contenido Version" +#~ msgstr "Aktuelle Contenido Version" + +#~ msgid "Changed by" +#~ msgstr "Geändert von" + +#~ msgid "Show History Entry" +#~ msgstr "Historieneintrag anzeigen" + +#~ msgid "Update Information" +#~ msgstr "Update-Nachrichten" + +#~ msgid "Internal History Error" +#~ msgstr "Interner Historie Fehler" + +#~ msgid "more" +#~ msgstr "mehr" + +#~ msgid "No layout description available" +#~ msgstr "Keine Layout-Beschreibung vorhanden" + +#~ msgid "Client %s" +#~ msgstr "Mandant %s" + +#~ msgid "-- Unnamed Template --" +#~ msgstr "-- Unbenanntes Template --" + +#~ msgid "Is used in" +#~ msgstr "Wird benutzt in" diff --git a/conlite/locale/en_US/LC_MESSAGES/conlite.mo b/conlite/locale/en_US/LC_MESSAGES/conlite.mo new file mode 100644 index 0000000000000000000000000000000000000000..122fc78855f229bd27f09418de01a8d6efdba2c9 GIT binary patch literal 548 zcmZut!A=4(5Y^~ukDfjB;7w=UBE+SrF(5HU2n5l1AR%=-E>&nrJE(k!zvl<|6?R2k zO`PPVY398*^X6@9^K~uMdcbzTPQXUMUO-W4zjRpV+jz`1nO~KP+##n(i04wG=3_{I>CC5p0#0pZ61*w(N`zfoT?11nQDWv!jq^YO}>yh z!Vu-`_x7ckFZI^>)9gFoAH85`#@AO-_oCY_kHO<4S{)>8x15KVgfFx|pGs{SESpH@ zk&d;ukfyad@RD3Ce2)&=CbLSLT(I;`Q*;Y`i%Jt*;_}%#b2cOPUDQ79-L#JNij5o}g6aH)zh$pj%yVHHh)J79U1yA9&iRHUIzs literal 0 HcmV?d00001 diff --git a/conlite/locale/en_US/LC_MESSAGES/conlite.po b/conlite/locale/en_US/LC_MESSAGES/conlite.po new file mode 100644 index 0000000..fa96d8c --- /dev/null +++ b/conlite/locale/en_US/LC_MESSAGES/conlite.po @@ -0,0 +1,5162 @@ +msgid "" +msgstr "" +"Project-Id-Version: Contenido 4.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-09 21:17+0100\n" +"PO-Revision-Date: 2014-01-09 21:39+0100\n" +"Last-Translator: Ortwin Pinke \n" +"Language-Team: Contenido Translators \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: i18n;trans;gettext\n" +"X-Poedit-Basepath: E:\\timo\\contenido_head\\contenido\n" +"X-Generator: Poedit 1.5.7\n" + +#: cronjobs/send_reminder.php:97 +#, php-format +msgid "" +"Hello %s,\n" +"\n" +"you've got a new reminder for the client '%s' at\n" +"%s:\n" +"\n" +"%s" +msgstr "" + +#: backend_search.php:328 +msgid "Thank you for saving this search from extinction !" +msgstr "" + +#: backend_search.php:490 +msgid "Search results" +msgstr "" + +#: backend_search.php:491 classes/class.cms_teaser.php:596 +#: classes/class.ajax.php:171 templates/standard/template.symbolhelp.html:38 +#: templates/standard/template.symbolhelp.html:283 +#: templates/standard/template.log_main.html:56 +#: includes/include.con_art_overview.php:77 +#: includes/include.con_editcontent.php:387 +#: includes/include.con_subnav.php:104 +msgid "Article" +msgstr "" + +#: backend_search.php:492 +#: templates/standard/template.mycontenido_lastarticles.html:62 +#: includes/include.con_art_overview.php:78 +#: includes/include.con_art_overview.php:746 +#: includes/include.con_edit_form.php:208 includes/include.upl_artlist.php:81 +#: includes/include.stat_overview.php:89 +msgid "Title" +msgstr "" + +#: backend_search.php:493 includes/include.con_art_overview.php:79 +msgid "Changed" +msgstr "" + +#: backend_search.php:494 includes/include.con_art_overview.php:80 +msgid "Published" +msgstr "" + +#: backend_search.php:495 classes/class.cms_teaser.php:588 +#: classes/class.cms_filelist.php:738 includes/include.con_art_overview.php:81 +#: includes/include.mod_new.php:133 includes/include.frontend.left_top.php:257 +#: includes/include.rights_left_top.php:155 +msgid "Sort order" +msgstr "" + +#: backend_search.php:496 +#: templates/standard/template.mycontenido_lastarticles.html:66 +#: templates/standard/template.str_overview.html:230 +#: includes/include.con_art_overview.php:82 +#: includes/include.tplcfg_edit_form.php:283 +#: includes/include.pretplcfg_edit_form.php:76 +msgid "Template" +msgstr "" + +#: backend_search.php:497 templates/standard/template.str_overview.html:233 +#: includes/include.con_art_overview.php:83 +#: includes/include.upl_files_overview.php:541 +#: includes/include.frontend.left_top.php:165 +#: includes/include.mycontenido.tasks.php:276 +msgid "Actions" +msgstr "" + +#: backend_search.php:506 +msgid "Missing search value." +msgstr "" + +#: backend_search.php:507 backend_search.php:734 +msgid "No article found." +msgstr "" + +#: backend_search.php:632 includes/include.con_art_overview.php:549 +msgid "Flag as normal article" +msgstr "" + +#: backend_search.php:635 includes/include.con_art_overview.php:547 +msgid "Flag as start article" +msgstr "" + +#: backend_search.php:648 scripts/langref.php:8 scripts/HTMLObj.js.php:239 +#: includes/include.con_art_overview.php:593 +#: includes/include.client_artspec.php:144 +msgid "Make offline" +msgstr "" + +#: backend_search.php:652 scripts/langref.php:9 scripts/HTMLObj.js.php:242 +#: scripts/HTMLObj.js.php:245 includes/include.con_art_overview.php:601 +#: includes/include.client_artspec.php:140 +#: includes/include.str_overview.php:957 includes/include.str_overview.php:959 +msgid "Make online" +msgstr "" + +#: backend_search.php:658 includes/include.con_art_overview.php:436 +msgid "Unfreeze article" +msgstr "" + +#: backend_search.php:661 includes/include.con_art_overview.php:439 +#: includes/cfg_language_de.inc.php:98 +msgid "Freeze article" +msgstr "" + +#: backend_search.php:669 includes/include.con_art_overview.php:523 +#: includes/include.mod_package.php:180 +#: includes/include.upl_search_results.php:55 +#: includes/include.con_left_top.php:449 includes/cfg_language_de.inc.php:370 +#: includes/include.CMS_LINK.php:180 includes/include.CMS_LINK.php:182 +#: includes/include.CMS_SWF.php:80 +#: includes/include.mycontenido_lastarticles.php:183 +#: includes/include.CMS_IMG.php:235 +msgid "None" +msgstr "" + +#: backend_search.php:672 +msgid "Reminder" +msgstr "" + +#: backend_search.php:674 classes/class.todo.php:158 +#: classes/class.todo.php:161 +msgid "Set reminder / add to todo list" +msgstr "" + +#: backend_search.php:675 templates/standard/template.symbolhelp.html:413 +#: includes/include.con_art_overview.php:569 +msgid "Duplicate article" +msgstr "" + +#: backend_search.php:676 includes/include.con_art_overview.php:472 +msgid "Article properties" +msgstr "" + +#: backend_search.php:677 templates/standard/template.symbolhelp.html:377 +#: includes/cfg_language_de.inc.php:110 +msgid "Configure template" +msgstr "" + +#: backend_search.php:678 templates/standard/template.symbolhelp.html:425 +#: includes/include.con_art_overview.php:626 +#: includes/cfg_language_de.inc.php:106 +msgid "Delete article" +msgstr "" + +#: backend_search.php:679 +msgid "Do you really want to delete following article" +msgstr "" + +#: backend_search.php:765 +msgid "Search Name" +msgstr "" + +#: backend_search.php:767 +msgid "Store" +msgstr "" + +#: backend_search.php:772 +msgid "Save this Search" +msgstr "" + +#: scripts/langref.php:10 scripts/HTMLObj.js.php:248 +msgid "Protect" +msgstr "" + +#: scripts/langref.php:11 scripts/HTMLObj.js.php:251 +msgid "Remove protection" +msgstr "" + +#: scripts/langref.php:12 scripts/HTMLObj.js.php:254 +#: includes/include.con_left_top.php:369 +msgid "Choose template" +msgstr "" + +#: scripts/langref.php:13 scripts/articleObject.js.php:248 +msgid "Overview cannot be displayed" +msgstr "" + +#: scripts/langref.php:14 scripts/articleObject.js.php:228 +#: scripts/articleObject.js.php:231 classes/class.notification.php:114 +msgid "Error" +msgstr "" + +#: scripts/langref.php:15 scripts/articleObject.js.php:274 +msgid "Article can't be displayed" +msgstr "" + +#: scripts/langref.php:16 scripts/articleObject.js.php:274 +#: scripts/articleObject.js.php:305 scripts/articleObject.js.php:335 +#: scripts/articleObject.js.php:360 scripts/articleObject.js.php:379 +msgid "No article was selected" +msgstr "" + +#: scripts/langref.php:17 scripts/articleObject.js.php:305 +msgid "Template configuration can't be displayed" +msgstr "" + +#: scripts/langref.php:18 scripts/articleObject.js.php:257 +#: scripts/articleObject.js.php:290 scripts/articleObject.js.php:319 +#: scripts/articleObject.js.php:335 +msgid "Editor can't be displayed" +msgstr "" + +#: scripts/langref.php:19 scripts/articleObject.js.php:360 +msgid "Preview can't be displayed" +msgstr "" + +#: scripts/langref.php:20 scripts/messageBox.js.php:78 +msgid "Confirm" +msgstr "" + +#: scripts/langref.php:21 scripts/messageBox.js.php:79 +#: templates/standard/template.symbolhelp.html:181 +#: includes/include.mod_package.php:311 +msgid "Cancel" +msgstr "" + +#: scripts/langref.php:22 scripts/messageBox.js.php:80 +msgid "Close window" +msgstr "" + +#: scripts/langref.php:23 scripts/rights.js.php:67 scripts/rights.js.php:70 +#: scripts/iZoom.js.php:70 scripts/iZoom.js.php:73 +msgid "Click to close" +msgstr "" + +#: scripts/langref.php:24 +msgid "Headline / HTML" +msgstr "" + +#: scripts/langref.php:25 +msgid "Text / HTML" +msgstr "" + +#: scripts/langref.php:26 +msgid "Text / Standard" +msgstr "" + +#: scripts/langref.php:27 +msgid "Picture" +msgstr "" + +#: scripts/langref.php:28 templates/standard/template.tpl_edit_form.html:29 +#: templates/standard/template.mod_edit_form.html:33 +#: templates/standard/template.lay_edit_form.html:32 +#: templates/standard/template.upl_files_overview.html:84 +#: includes/rights_tpl.inc.php:74 includes/grouprights_tpl.inc.php:73 +#: includes/include.todo.popup.php:70 includes/include.upl_edit.php:87 +#: includes/grouprights_lay.inc.php:86 +#: includes/include.style_edit_form.php:198 +#: includes/include.html_tpl_edit_form.php:214 includes/include.mod_new.php:81 +#: includes/include.mycontenido.tasks.edit.php:71 +#: includes/include.grouprights_overview.php:118 +#: includes/grouprights_mod.inc.php:74 includes/include.style_history.php:161 +#: includes/include.CMS_LINK.php:341 includes/include.js_history.php:156 +#: includes/rights_lay.inc.php:76 includes/include.grouprights_create.php:112 +#: includes/include.lay_edit_form.php:205 +#: includes/include.tpl_edit_form.php:155 includes/include.lay_history.php:121 +#: includes/include.CMS_IMG.php:278 includes/rights_mod.inc.php:76 +#: includes/include.js_edit_form.php:176 +#: includes/include.html_tpl_history.php:164 +#: includes/include.mod_edit_form.php:378 +#: includes/include.CMS_SIMPLELINK.php:153 +#: includes/include.mod_history.php:132 +msgid "Description" +msgstr "" + +#: scripts/langref.php:29 +msgid "Description / Standard" +msgstr "" + +#: scripts/langref.php:30 +msgid "Flash Movie" +msgstr "" + +#: scripts/langref.php:31 includes/include.CMS_SIMPLELINK.php:150 +msgid "Link" +msgstr "" + +#: scripts/langref.php:32 +msgid "Frame" +msgstr "" + +#: scripts/articleObject.js.php:257 scripts/articleObject.js.php:290 +#: scripts/articleObject.js.php:319 +msgid "Can't edit articles in foreign languages." +msgstr "" + +#: scripts/articleObject.js.php:379 +msgid "Tab can't be displayed" +msgstr "" + +#: classes/class.note.php:331 classes/class.note.php:334 +msgid "View notes / add note" +msgstr "" + +#: classes/class.todo.php:101 +msgid "New" +msgstr "" + +#: classes/class.todo.php:102 +msgid "In progress" +msgstr "" + +#: classes/class.todo.php:103 +msgid "Done" +msgstr "" + +#: classes/class.todo.php:104 +msgid "Waiting for action" +msgstr "" + +#: classes/class.todo.php:105 +msgid "Deferred" +msgstr "" + +#: classes/class.todo.php:113 +msgid "Low" +msgstr "" + +#: classes/class.todo.php:114 +msgid "Medium" +msgstr "" + +#: classes/class.todo.php:115 +msgid "High" +msgstr "" + +#: classes/class.todo.php:116 +msgid "Immediately" +msgstr "" + +#: classes/class.inuse.php:242 +msgid "Click here if you want to override the lock" +msgstr "" + +#: classes/class.inuse.php:246 +msgid "Do you really want to override the lock?" +msgstr "" + +#: classes/class.inuse.php:248 +msgid "Override lock" +msgstr "" + +#: classes/class.inuse.php:248 +msgid "Hide notification" +msgstr "" + +#: classes/class.version.php:199 +#, php-format +msgid "Alternative path %s does not exist. Version was saved in frondendpath." +msgstr "" + +#: classes/class.version.php:522 includes/include.mycontenido.tasks.php:380 +msgid "Refresh" +msgstr "" + +#: classes/class.version.php:538 +msgid "Clear layout history" +msgstr "" + +#: classes/class.version.php:539 +msgid "Do you really want to clear layout history?" +msgstr "" + +#: classes/class.version.php:539 +msgid "Note: This only affects the current layout." +msgstr "" + +#: classes/class.version.php:542 +msgid "Clear module history" +msgstr "" + +#: classes/class.version.php:543 +msgid "Do you really want to clear module history?" +msgstr "" + +#: classes/class.version.php:543 +msgid "Note: This only affects the current module." +msgstr "" + +#: classes/class.version.php:546 +msgid "Clear style history" +msgstr "" + +#: classes/class.version.php:547 +msgid "Do you really want to clear style history?" +msgstr "" + +#: classes/class.version.php:547 +msgid "Note: This only affects the current style." +msgstr "" + +#: classes/class.version.php:550 +msgid "Clear Java-Script history" +msgstr "" + +#: classes/class.version.php:551 +msgid "Do you really want to clear Java-Script history?" +msgstr "" + +#: classes/class.version.php:551 +msgid "Note: This only affects the current Java-Script." +msgstr "" + +#: classes/class.version.php:554 +msgid "Clear HTML-Template history" +msgstr "" + +#: classes/class.version.php:555 +msgid "Do you really want to clear HTML-Template history?" +msgstr "" + +#: classes/class.version.php:555 +msgid "Note: This only the affects current HTML-Template." +msgstr "" + +#: classes/class.version.php:558 +msgid "Clear history" +msgstr "" + +#: classes/class.version.php:559 +msgid "Do you really want to clear history?" +msgstr "" + +#: classes/class.version.php:559 +msgid "Note: This only affects the current history." +msgstr "" + +#: classes/class.update.notifier.php:432 classes/class.update.notifier.php:437 +msgid "Unable to check for new updates!" +msgstr "" + +#: classes/class.update.notifier.php:432 +msgid "Could not handle server response!" +msgstr "" + +#: classes/class.update.notifier.php:437 +msgid "Could not determine vendor version!" +msgstr "" + +#: classes/class.update.notifier.php:551 +msgid "Unable to check for updates!" +msgstr "" + +#: classes/class.update.notifier.php:552 +#, php-format +msgid "Connection to s% failed!" +msgstr "" + +#: classes/class.update.notifier.php:662 +msgid "Disable update notification" +msgstr "" + +#: classes/class.update.notifier.php:664 classes/class.update.notifier.php:676 +msgid "Disable notification" +msgstr "" + +#: classes/class.update.notifier.php:667 +msgid "Enable update notification (recommended)" +msgstr "" + +#: classes/class.update.notifier.php:669 classes/class.update.notifier.php:683 +msgid "Enable notification" +msgstr "" + +#: classes/class.update.notifier.php:674 +msgid "Disable RSS notification" +msgstr "" + +#: classes/class.update.notifier.php:681 +msgid "Enable RSS notification (recommended)" +msgstr "" + +#: classes/class.update.notifier.php:685 +msgid "RSS notification is disabled" +msgstr "" + +#: classes/class.update.notifier.php:733 +msgid "read more" +msgstr "" + +#: classes/class.update.notifier.php:743 classes/class.update.notifier.php:752 +msgid "No RSS content available" +msgstr "" + +#: classes/class.update.notifier.php:750 classes/class.update.notifier.php:768 +msgid "" +"Your webserver does not have write permissions for the directory /contenido/" +"cache/!" +msgstr "" + +#: classes/class.update.notifier.php:771 +msgid "" +"Update notification is disabled! For actual update information, please " +"activate." +msgstr "" + +#: classes/class.update.notifier.php:776 +msgid "You have an unknown or unsupported version of ConLite!" +msgstr "" + +#: classes/class.update.notifier.php:779 +#, php-format +msgid "" +"Your version of ConLite is deprecated and not longer supported for any " +"updates. Please update to a higher version!
    Download now!" +msgstr "" + +#: classes/class.update.notifier.php:783 +#, php-format +msgid "" +"A new version of ConLite is available!
    Download %s now!" +msgstr "" + +#: classes/class.update.notifier.php:786 +#, php-format +msgid "" +"It seems to be that your version string was manipulated. ConLite %s does not " +"exist!" +msgstr "" + +#: classes/class.update.notifier.php:789 +msgid "Your version of ConLite is up to date!" +msgstr "" + +#: classes/class.ui.php:351 classes/widgets/class.widgets.views.php:80 +#: classes/widgets/class.widgets.tableedit.php:188 +#: includes/include.client_edit.php:225 +#: includes/include.grouprights_overview.php:102 +#: includes/include.CMS_EASYIMG.php:158 +#: includes/include.grouprights_create.php:94 +#: includes/include.rights_overview.php:192 +#: includes/include.rights_create.php:142 +msgid "Save changes" +msgstr "" + +#: classes/widgets/class.widgets.datawidgets.php:314 +#: classes/widgets/class.widgets.datawidgets.php:315 +msgid "Clear contents" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:47 +#: classes/widgets/class.widgets.pager.php:51 +msgid "Paging" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:85 +msgid "First page" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:92 +msgid "Previous page" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:106 +#, php-format +msgid "Page %s" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:122 +msgid "Next page" +msgstr "" + +#: classes/widgets/class.widgets.pager.php:132 +msgid "Last page" +msgstr "" + +#: classes/class.cms_teaser.php:353 classes/class.cms_teaser.php:382 +#: classes/class.cms_teaser.php:419 classes/class.cms_teaser.php:447 +#: classes/class.cms_teaser.php:476 classes/class.cms_teaser.php:539 +#: includes/include.CMS_LINK.php:215 includes/include.CMS_LINK.php:244 +#: includes/include.CMS_LINK.php:273 includes/include.CMS_LINK.php:288 +#: includes/include.CMS_LINK.php:304 includes/include.str_overview.php:90 +#: includes/functions.general.php:1213 includes/functions.general.php:1256 +msgid "Please choose" +msgstr "" + +#: classes/class.cms_teaser.php:386 +msgid "Block Style" +msgstr "" + +#: classes/class.cms_teaser.php:389 +msgid "Blog Style" +msgstr "" + +#: classes/class.cms_teaser.php:423 classes/class.cms_filelist.php:465 +#: includes/include.mod_new.php:60 includes/include.frontend.left_top.php:118 +#: includes/include.rights_left_top.php:118 +#: includes/include.frontend.user_menu.php:112 +msgid "Ascending" +msgstr "" + +#: classes/class.cms_teaser.php:426 classes/class.cms_filelist.php:468 +#: includes/include.mod_new.php:60 includes/include.frontend.left_top.php:118 +#: includes/include.rights_left_top.php:119 +#: includes/include.frontend.user_menu.php:112 +msgid "Descending" +msgstr "" + +#: classes/class.cms_teaser.php:451 +msgid "Scaled" +msgstr "" + +#: classes/class.cms_teaser.php:454 +msgid "Cropped" +msgstr "" + +#: classes/class.cms_teaser.php:480 +msgid "Sort Sequence" +msgstr "" + +#: classes/class.cms_teaser.php:483 +msgid "Creationdate" +msgstr "" + +#: classes/class.cms_teaser.php:486 +msgid "Publisheddate" +msgstr "" + +#: classes/class.cms_teaser.php:489 +msgid "Modificationdate" +msgstr "" + +#: classes/class.cms_teaser.php:578 +msgid "Teasersettings" +msgstr "" + +#: classes/class.cms_teaser.php:579 +msgid "Teasertitle" +msgstr "" + +#: classes/class.cms_teaser.php:580 +msgid "Teaser Startarticle" +msgstr "" + +#: classes/class.cms_teaser.php:581 +msgid "Sourcecategory" +msgstr "" + +#: classes/class.cms_teaser.php:582 +msgid "Number of Articles" +msgstr "" + +#: classes/class.cms_teaser.php:583 classes/class.cms_filelist.php:724 +msgid "General Settings" +msgstr "" + +#: classes/class.cms_teaser.php:584 +msgid "Teaser Style" +msgstr "" + +#: classes/class.cms_teaser.php:585 +msgid "Advanced Teaser Settings" +msgstr "" + +#: classes/class.cms_teaser.php:586 +msgid "Teaser Filter" +msgstr "" + +#: classes/class.cms_teaser.php:587 +msgid "Teaser Sort" +msgstr "" + +#: classes/class.cms_teaser.php:589 +msgid "Source Headline" +msgstr "" + +#: classes/class.cms_teaser.php:590 +msgid "Source Settings" +msgstr "" + +#: classes/class.cms_teaser.php:591 +msgid "Source Text" +msgstr "" + +#: classes/class.cms_teaser.php:592 +msgid "Source Image" +msgstr "" + +#: classes/class.cms_teaser.php:593 +msgid "Source Date" +msgstr "" + +#: classes/class.cms_teaser.php:595 classes/class.ajax.php:154 +#: templates/standard/template.symbolhelp.html:41 +#: templates/standard/template.symbolhelp.html:472 +#: templates/standard/template.mycontenido_lastarticles.html:63 +#: templates/standard/template.log_main.html:55 +#: templates/standard/template.str_overview.html:124 +#: templates/standard/template.str_overview.html:224 +#: includes/include.con_editcontent.php:392 +#: includes/include.con_edit_form.php:510 includes/rights_con.inc.php:78 +#: includes/include.note.popup.php:93 includes/grouprights_str.inc.php:76 +#: includes/rights_str.inc.php:77 includes/grouprights_con.inc.php:78 +msgid "Category" +msgstr "" + +#: classes/class.cms_teaser.php:598 classes/class.cms_filelist.php:720 +msgid "General" +msgstr "" + +#: classes/class.cms_teaser.php:599 +msgid "Advanced" +msgstr "" + +#: classes/class.cms_teaser.php:600 classes/class.cms_filelist.php:721 +msgid "Manual" +msgstr "" + +#: classes/class.cms_teaser.php:601 +msgid "Included Articles" +msgstr "" + +#: classes/class.cms_teaser.php:602 +msgid "Add Article" +msgstr "" + +#: classes/class.cms_teaser.php:603 +msgid "Manual Teaser Settings" +msgstr "" + +#: classes/class.cms_teaser.php:604 +msgid "Manual Teaser" +msgstr "" + +#: classes/class.cms_teaser.php:607 +msgid "Size Settings" +msgstr "" + +#: classes/class.cms_teaser.php:608 +msgid "Characterlength" +msgstr "" + +#: classes/class.cms_teaser.php:609 +msgid "Imagewidth" +msgstr "" + +#: classes/class.cms_teaser.php:610 +msgid "Imageheight" +msgstr "" + +#: classes/class.cms_teaser.php:611 +msgid "Image Scale" +msgstr "" + +#: classes/class.cms_teaser.php:648 +msgid "Add" +msgstr "" + +#: classes/class.notification.php:120 +msgid "Warning" +msgstr "" + +#: classes/class.notification.php:126 +#: templates/standard/template.mycontenido_lastarticles.html:67 +msgid "Info" +msgstr "" + +#: classes/class.notification.php:133 +msgid "Notification" +msgstr "" + +#: classes/class.cms_filelist.php:413 +msgid "Default Style" +msgstr "" + +#: classes/class.cms_filelist.php:438 +#: templates/standard/template.upl_files_overview.html:82 +msgid "Filename" +msgstr "" + +#: classes/class.cms_filelist.php:441 +#: templates/standard/template.upl_files_overview.html:86 +msgid "File size" +msgstr "" + +#: classes/class.cms_filelist.php:444 includes/include.con_left_top.php:136 +msgid "Date created" +msgstr "" + +#: classes/class.cms_filelist.php:447 includes/include.con_left_top.php:137 +msgid "Date modified" +msgstr "" + +#: classes/class.cms_filelist.php:540 classes/class.cms_filelist.php:541 +#: includes/include.upl_files_overview.php:690 +#: includes/include.upl_search_results.php:417 +msgid "No files found" +msgstr "" + +#: classes/class.cms_filelist.php:719 +msgid "Directories" +msgstr "" + +#: classes/class.cms_filelist.php:722 +#: templates/standard/template.log_main.html:17 +msgid "Filter" +msgstr "" + +#: classes/class.cms_filelist.php:725 +msgid "Manual Settings" +msgstr "" + +#: classes/class.cms_filelist.php:726 +msgid "Filter settings" +msgstr "" + +#: classes/class.cms_filelist.php:727 +msgid "File list settings" +msgstr "" + +#: classes/class.cms_filelist.php:728 +msgid "File list title" +msgstr "" + +#: classes/class.cms_filelist.php:729 +msgid "File size limit" +msgstr "" + +#: classes/class.cms_filelist.php:730 +msgid "Creation date limit" +msgstr "" + +#: classes/class.cms_filelist.php:731 +msgid "Modify date limit" +msgstr "" + +#: classes/class.cms_filelist.php:733 +msgid "File list style" +msgstr "" + +#: classes/class.cms_filelist.php:734 +msgid "Source directory" +msgstr "" + +#: classes/class.cms_filelist.php:735 +msgid "Include subdirectories?" +msgstr "" + +#: classes/class.cms_filelist.php:736 +msgid "Include meta data?" +msgstr "" + +#: classes/class.cms_filelist.php:737 +msgid "File list sort" +msgstr "" + +#: classes/class.cms_filelist.php:739 +msgid "Displayed file extensions" +msgstr "" + +#: classes/class.cms_filelist.php:740 +msgid "Ignore selection (use all)" +msgstr "" + +#: classes/class.cms_filelist.php:741 +msgid "Selection will be ignored!" +msgstr "" + +#: classes/class.cms_filelist.php:742 +msgid "Select all entries" +msgstr "" + +#: classes/class.cms_filelist.php:743 +msgid "Use manual file list?" +msgstr "" + +#: classes/class.cms_filelist.php:744 +msgid "Directory" +msgstr "" + +#: classes/class.cms_filelist.php:745 includes/include.mod_package.php:476 +#: includes/include.mod_package.php:478 includes/include.mod_translate.php:185 +#: includes/include.mod_edit_form.php:440 +#: includes/include.mod_edit_form.php:442 +msgid "File" +msgstr "" + +#: classes/class.cms_filelist.php:746 +msgid "Files" +msgstr "" + +#: classes/class.cms_filelist.php:747 +msgid "Existing files" +msgstr "" + +#: classes/class.cms_filelist.php:748 +msgid "Add file" +msgstr "" + +#: classes/class.cms_filelist.php:749 +msgid "File count" +msgstr "" + +#: classes/class.client.php:131 classes/contenido/class.client.php:106 +msgid "No client" +msgstr "" + +#: classes/template/class.template.php:325 +msgid "\"" +msgstr "" + +#: classes/class.ajax.php:103 classes/class.ajax.php:127 +#: includes/rights_tpl.inc.php:73 includes/grouprights_tpl.inc.php:72 +msgid "Template name" +msgstr "" + +#: classes/class.ajax.php:109 classes/class.ajax.php:136 +#: classes/class.ajax.php:187 +msgid "No data found!" +msgstr "" + +#: classes/class.ajax.php:161 +msgid "idcat" +msgstr "" + +#: classes/class.ajax.php:162 classes/class.ajax.php:179 +msgid "idlang" +msgstr "" + +#: classes/class.ajax.php:163 classes/class.ajax.php:180 +#: templates/standard/template.tpl_edit_form.html:19 +#: templates/standard/template.mod_edit_form.html:23 +#: templates/standard/template.lay_edit_form.html:22 +#: includes/include.mod_package.php:235 includes/include.mod_package.php:253 +#: includes/include.mod_package.php:422 +#: includes/include.style_edit_form.php:197 +#: includes/include.html_tpl_edit_form.php:213 includes/include.mod_new.php:59 +#: includes/include.style_history.php:160 includes/include.js_history.php:155 +#: includes/include.lay_edit_form.php:204 +#: includes/include.tpl_edit_form.php:152 includes/include.lay_history.php:120 +#: includes/include.rights_left_top.php:116 +#: includes/include.rights_overview.php:209 +#: includes/include.rights_create.php:156 +#: includes/include.js_edit_form.php:175 +#: includes/include.html_tpl_history.php:163 +#: includes/include.mod_edit_form.php:372 +#: includes/include.mod_edit_form.php:374 +#: includes/include.systemsettings.php:61 +#: includes/include.systemsettings.php:174 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:189 +#: includes/include.mod_history.php:131 +msgid "Name" +msgstr "" + +#: classes/class.ajax.php:178 +msgid "idart" +msgstr "" + +#: classes/class.navigation.php:340 classes/class.navigation.php:343 +#: templates/standard/template.log_main.html:21 +#: templates/standard/template.log_main.html:51 +#: includes/include.con_editcontent.php:402 +#: includes/include.system_purge.php:195 +msgid "Client" +msgstr "" + +#: classes/class.navigation.php:360 +#: templates/standard/template.symbolhelp.html:1823 +#: templates/standard/template.log_main.html:25 +#: templates/standard/template.log_main.html:53 +msgid "User" +msgstr "" + +#: classes/class.navigation.php:435 +msgid "-- No Language available --" +msgstr "" + +#: classes/contenido/class.module.php:361 +#: includes/include.mod_edit_form.php:56 +msgid "- Unnamed Module -" +msgstr "" + +#: classes/contenido/class.module.php:889 +msgid "" +"Module uses Output- and/or InputFromFile. Editing and Saving may not be " +"possible in backend." +msgstr "" + +#: classes/class.conuser.php:842 classes/class.conuser.php:867 +#, php-format +msgid "" +"Please use at least %d lower and upper case characters in your password!" +msgstr "" + +#: classes/class.conuser.php:847 +#, php-format +msgid "Please use at least %d numbers in your password!" +msgstr "" + +#: classes/class.conuser.php:852 +#, php-format +msgid "Please use at least %d symbols in your password!" +msgstr "" + +#: classes/class.conuser.php:857 +#, php-format +msgid "Password is too short! Please use at least %d signs." +msgstr "" + +#: classes/class.conuser.php:863 +msgid "Password does not contain enough different characters." +msgstr "" + +#: classes/class.conuser.php:872 +msgid "Please choose a more secure password!" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:140 +#: includes/functions.general.php:111 +msgid "January" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:141 +#: includes/functions.general.php:114 +msgid "February" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:142 +#: includes/functions.general.php:117 +msgid "March" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:143 +#: includes/functions.general.php:120 +msgid "April" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:144 +#: includes/functions.general.php:123 +msgid "May" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:145 +#: includes/functions.general.php:126 +msgid "June" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:146 +#: includes/functions.general.php:129 +msgid "July" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:147 +#: includes/functions.general.php:132 +msgid "August" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:148 +#: includes/functions.general.php:135 +msgid "September" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:149 +#: includes/functions.general.php:138 +msgid "October" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:150 +#: includes/functions.general.php:141 +msgid "November" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:151 +#: includes/functions.general.php:144 +msgid "December" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:159 +#: classes/datatypes/class.datatype.datetime.php:166 +#: includes/functions.general.php:178 +msgid "Sunday" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:160 +#: includes/functions.general.php:160 +msgid "Monday" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:161 +#: includes/functions.general.php:163 +msgid "Tuesday" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:162 +#: includes/functions.general.php:166 +msgid "Wednesday" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:163 +#: includes/functions.general.php:169 +msgid "Thursday" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:164 +#: includes/functions.general.php:172 +msgid "Friday" +msgstr "" + +#: classes/datatypes/class.datatype.datetime.php:165 +msgid "Saturday" +msgstr "" + +#: classes/class.versionFile.php:131 +msgid "Can not open file " +msgstr "" + +#: classes/class.request.password.php:247 +#: templates/standard/template.symbolhelp.html:196 +msgid "Submit" +msgstr "" + +#: classes/class.request.password.php:251 +msgid "Please enter your login" +msgstr "" + +#: classes/class.request.password.php:291 +#, php-format +msgid "Password requests are allowed every %s minutes." +msgstr "" + +#: classes/class.request.password.php:299 +#: classes/class.request.password.php:312 +msgid "No matching data found. Please contact your systemadministrator." +msgstr "" + +#: classes/class.request.password.php:305 +msgid "New password was submitted to your e-mail address." +msgstr "" + +#: classes/class.request.password.php:348 +#, php-format +msgid "" +"Dear Contenidouser %s,\n" +"\n" +"Your password to log in Content Management System Contenido is: %s\n" +"\n" +"Best regards\n" +"\n" +"Your Contenido sysadmin" +msgstr "" + +#: classes/class.request.password.php:364 +msgid "Your new password for Contenido Backend" +msgstr "" + +#: classes/class.cms_date.php:212 +msgid "Please Choose Format" +msgstr "" + +#: external/frontend/front_content.php:348 +#: external/frontend/front_content.php:396 +#: external/backendedit/front_content.php:331 +#: external/backendedit/front_content.php:386 +msgid "No start article for this category" +msgstr "" + +#: external/frontend/front_content.php:494 +#: external/backendedit/front_content.php:484 +#: includes/include.con_edit_form.php:134 +#: includes/include.tplcfg_edit_form.php:59 +#, php-format +msgid "Article is in use by %s (%s)" +msgstr "" + +#: templates/standard/template.stat_overview.html:135 +#: includes/include.con_left_top.php:428 +#: includes/include.con_str_overview.php:662 +#: includes/include.str_overview.php:486 includes/include.str_overview.php:487 +#: includes/include.str_overview.php:488 +msgid "Close all categories" +msgstr "" + +#: templates/standard/template.stat_overview.html:137 +#: includes/include.con_left_top.php:429 +#: includes/include.con_str_overview.php:663 +#: includes/include.str_overview.php:493 includes/include.str_overview.php:494 +#: includes/include.str_overview.php:495 +msgid "Open all categories" +msgstr "" + +#: templates/standard/template.symbolhelp.html:23 +msgid "Table of contents" +msgstr "" + +#: templates/standard/template.symbolhelp.html:29 +#: templates/standard/template.symbolhelp.html:135 +msgid "Common" +msgstr "" + +#: templates/standard/template.symbolhelp.html:35 +#: templates/standard/template.symbolhelp.html:277 +msgid "Content" +msgstr "" + +#: templates/standard/template.symbolhelp.html:44 +#: templates/standard/template.symbolhelp.html:740 +msgid "File management" +msgstr "" + +#: templates/standard/template.symbolhelp.html:50 +#: templates/standard/template.symbolhelp.html:816 +msgid "Style" +msgstr "" + +#: templates/standard/template.symbolhelp.html:53 +#: templates/standard/template.symbolhelp.html:822 +#: includes/include.mod_package.php:191 +msgid "Layouts" +msgstr "" + +#: templates/standard/template.symbolhelp.html:56 +#: templates/standard/template.symbolhelp.html:904 +msgid "Modules" +msgstr "" + +#: templates/standard/template.symbolhelp.html:59 +#: templates/standard/template.symbolhelp.html:985 +msgid "Templates" +msgstr "" + +#: templates/standard/template.symbolhelp.html:62 +#: templates/standard/template.symbolhelp.html:1055 +msgid "CSS editor" +msgstr "" + +#: templates/standard/template.symbolhelp.html:65 +#: templates/standard/template.symbolhelp.html:1110 +msgid "Script editor" +msgstr "" + +#: templates/standard/template.symbolhelp.html:68 +#: templates/standard/template.symbolhelp.html:1165 +msgid "Module Templates" +msgstr "" + +#: templates/standard/template.symbolhelp.html:74 +#: templates/standard/template.symbolhelp.html:1242 +msgid "Extras" +msgstr "" + +#: templates/standard/template.symbolhelp.html:77 +#: templates/standard/template.symbolhelp.html:1248 +msgid "Newsletter" +msgstr "" + +#: templates/standard/template.symbolhelp.html:80 +msgid "Recipients" +msgstr "" + +#: templates/standard/template.symbolhelp.html:86 +#: templates/standard/template.symbolhelp.html:1466 +msgid "Statistics" +msgstr "" + +#: templates/standard/template.symbolhelp.html:89 +#: templates/standard/template.symbolhelp.html:1472 +#: includes/include.stat_overview.php:92 +msgid "Hits" +msgstr "" + +#: templates/standard/template.symbolhelp.html:95 +#: templates/standard/template.symbolhelp.html:1548 +msgid "Administration" +msgstr "" + +#: templates/standard/template.symbolhelp.html:98 +#: templates/standard/template.symbolhelp.html:1554 +msgid "Users" +msgstr "" + +#: templates/standard/template.symbolhelp.html:101 +#: templates/standard/template.symbolhelp.html:1609 +msgid "Groups" +msgstr "" + +#: templates/standard/template.symbolhelp.html:104 +#: templates/standard/template.symbolhelp.html:1664 +msgid "Languages" +msgstr "" + +#: templates/standard/template.symbolhelp.html:107 +#: templates/standard/template.symbolhelp.html:1734 +msgid "Clients" +msgstr "" + +#: templates/standard/template.symbolhelp.html:129 +msgid "Table of Contents" +msgstr "" + +#: templates/standard/template.symbolhelp.html:166 +msgid "Execute query / Save" +msgstr "" + +#: templates/standard/template.symbolhelp.html:208 +msgid "Change to MyContenido (Personal Settings)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:220 +msgid "Information (Impressum)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:235 +msgid "Logout" +msgstr "" + +#: templates/standard/template.symbolhelp.html:314 +#: templates/standard/template.symbolhelp.html:506 +#: templates/standard/template.str_overview.html:148 +#: includes/cfg_language_de.inc.php:132 includes/include.str_overview.php:949 +#: includes/include.str_overview.php:952 +msgid "Configure category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:329 +#: includes/include.con_art_overview.php:988 +#: includes/include.con_art_overview.php:989 +msgid "Create new article" +msgstr "" + +#: templates/standard/template.symbolhelp.html:341 +msgid "Article is start article / is not start article" +msgstr "" + +#: templates/standard/template.symbolhelp.html:353 +#: templates/standard/template.symbolhelp.html:868 +#: templates/standard/template.symbolhelp.html:949 +msgid "Set template / Add to To-Do list" +msgstr "" + +#: templates/standard/template.symbolhelp.html:365 +msgid "Configure article properties" +msgstr "" + +#: templates/standard/template.symbolhelp.html:389 +msgid "Element is online / offline (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:401 +msgid "Element is protected / accessible (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:439 +msgid "Lock / unlock folder (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:451 +msgid "Set folder offline / online (change through click)" +msgstr "" + +#: templates/standard/template.symbolhelp.html:524 +#: includes/cfg_language_de.inc.php:120 +msgid "Rename category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:542 +msgid "Create category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:560 +msgid "Set category online / offline" +msgstr "" + +#: templates/standard/template.symbolhelp.html:578 +msgid "Category is online and unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:596 +msgid "Category is offline and unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:614 +msgid "Category is online, contains an error and is unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:632 +msgid "Category is offline, contains an error and is unprotected / protected" +msgstr "" + +#: templates/standard/template.symbolhelp.html:650 +msgid "Move up one category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:665 +#: includes/cfg_language_de.inc.php:129 +msgid "Move category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:683 +msgid "Select move target" +msgstr "" + +#: templates/standard/template.symbolhelp.html:701 +#: includes/cfg_language_de.inc.php:131 +msgid "Duplicate category" +msgstr "" + +#: templates/standard/template.symbolhelp.html:716 +#: templates/standard/template.symbolhelp.html:880 +#: templates/standard/template.symbolhelp.html:961 +#: templates/standard/template.symbolhelp.html:1031 +#: templates/standard/template.symbolhelp.html:1086 +#: templates/standard/template.symbolhelp.html:1141 +#: templates/standard/template.symbolhelp.html:1196 +#: templates/standard/template.symbolhelp.html:1306 +#: templates/standard/template.symbolhelp.html:1421 +#: templates/standard/template.symbolhelp.html:1585 +#: templates/standard/template.symbolhelp.html:1640 +#: templates/standard/template.symbolhelp.html:1710 +#: templates/standard/template.symbolhelp.html:1765 +#: templates/standard/template.symbolhelp.html:1871 +msgid "Delete / Delete not available" +msgstr "" + +#: templates/standard/template.symbolhelp.html:762 +msgid "Root upload folder" +msgstr "" + +#: templates/standard/template.symbolhelp.html:780 +msgid "Regular folder" +msgstr "" + +#: templates/standard/template.symbolhelp.html:853 +msgid "Layout in use" +msgstr "" + +#: templates/standard/template.symbolhelp.html:934 +msgid "Module in use" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1016 +#: includes/cfg_language_de.inc.php:167 includes/cfg_language_de.inc.php:168 +#: includes/include.tpl_overview.php:111 +msgid "Duplicate template" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1279 +#: includes/cfg_language_de.inc.php:217 +msgid "Create newsletter" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1294 +msgid "Copy newsletter" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1330 +#: templates/standard/template.symbolhelp.html:1361 +msgid "Recipient" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1373 +#: includes/cfg_language_de.inc.php:229 +msgid "Create recipient" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1385 +msgid "Remove recipient" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1397 +msgid "Recipient group" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1409 +#: includes/cfg_language_de.inc.php:235 +msgid "Create recipient group" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1503 +msgid "Article is online / offline" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1695 +msgid "Language active / not active" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1835 +#: includes/cfg_language_de.inc.php:171 includes/cfg_language_de.inc.php:174 +#: includes/include.frontend.left_top.php:178 +#: includes/include.rights_left_top.php:103 +msgid "Create user" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1847 +msgid "User group" +msgstr "" + +#: templates/standard/template.symbolhelp.html:1859 +msgid "Create user group" +msgstr "" + +#: templates/standard/template.mycontenido_lastarticles.html:35 +msgid "Your clients" +msgstr "" + +#: templates/standard/template.mycontenido_lastarticles.html:61 +#: includes/include.upl_artlist.php:81 +msgid "Start" +msgstr "" + +#: templates/standard/template.mycontenido_lastarticles.html:64 +#: includes/include.con_edit_form.php:284 +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.upl_artlist.php:81 +msgid "Created" +msgstr "" + +#: templates/standard/template.mycontenido_lastarticles.html:65 +#: includes/include.upl_artlist.php:81 +msgid "Modified" +msgstr "" + +#: templates/standard/template.system_variables.html:16 +msgid "Your system configuration" +msgstr "" + +#: templates/standard/template.system_variables.html:21 +msgid "Variable" +msgstr "" + +#: templates/standard/template.system_variables.html:22 +msgid "Local value" +msgstr "" + +#: templates/standard/template.system_variables.html:37 +msgid "Contenido Error Log" +msgstr "" + +#: templates/standard/template.system_variables.html:50 +msgid "clear error log" +msgstr "" + +#: templates/standard/template.system_variables.html:58 +msgid "Contenido Upgrade Error Log" +msgstr "" + +#: templates/standard/template.system_variables.html:72 +msgid "clear upgrade error log" +msgstr "" + +#: templates/standard/template.log_main.html:18 +#: includes/include.client_edit.php:237 +#: includes/include.grouprights_overview.php:109 +#: includes/include.grouprights_overview.php:210 +#: includes/include.grouprights_create.php:99 +#: includes/include.rights_overview.php:200 +#: includes/include.rights_overview.php:354 +#: includes/include.rights_create.php:147 +#: includes/include.systemsettings.php:62 +#: includes/include.systemsettings.php:178 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:193 +msgid "Value" +msgstr "" + +#: templates/standard/template.log_main.html:29 +#: templates/standard/template.log_main.html:54 +#: includes/include.mod_package.php:254 +msgid "Action" +msgstr "" + +#: templates/standard/template.log_main.html:33 +#: templates/standard/template.con_edit_form.html:146 +#: includes/include.upl_edit.php:207 +msgid "Start date" +msgstr "" + +#: templates/standard/template.log_main.html:37 +#: templates/standard/template.con_edit_form.html:150 +#: includes/include.todo.popup.php:79 includes/include.upl_edit.php:211 +#: includes/include.mycontenido.tasks.edit.php:75 +msgid "End date" +msgstr "" + +#: templates/standard/template.log_main.html:41 +#: templates/standard/template.recipient_menu.html:88 +msgid "Limit" +msgstr "" + +#: templates/standard/template.log_main.html:52 +msgid "Date" +msgstr "" + +#: templates/standard/template.tpl_edit_form.html:42 +#: includes/include.lay_overview.php:101 +#: includes/include.tpl_edit_form.php:161 +msgid "Layout" +msgstr "" + +#: templates/standard/template.tpl_edit_form.html:55 +#: includes/include.tpl_edit_form.php:162 +msgid "Layout description" +msgstr "" + +#: templates/standard/template.info.html:15 +msgid "Concept and Implementation" +msgstr "" + +#: templates/standard/template.info.html:15 +msgid "Germany" +msgstr "" + +#: templates/standard/template.info.html:15 +msgid "Phone" +msgstr "" + +#: templates/standard/template.rights_inc.html:24 +msgid "Client / Language" +msgstr "" + +#: templates/standard/template.con_edit_form.html:141 +#: includes/include.upl_edit.php:92 +msgid "Time control" +msgstr "" + +#: templates/standard/template.con_edit_form.html:144 +#: includes/include.upl_edit.php:201 +msgid "Use time control" +msgstr "" + +#: templates/standard/template.con_edit_form.html:153 +msgid "When expired, move to category" +msgstr "" + +#: templates/standard/template.con_edit_form.html:155 +msgid "Make online after move" +msgstr "" + +#: templates/standard/template.con_edit_form.html:184 +msgid "Page title" +msgstr "" + +#: templates/standard/template.con_edit_form.html:190 +msgid "Meta tags" +msgstr "" + +#: templates/standard/template.welcome.html:22 +msgid "Available clients" +msgstr "" + +#: templates/standard/template.welcome.html:42 +msgid "Currently" +msgstr "" + +#: templates/standard/template.welcome.html:42 +msgid "Users online" +msgstr "" + +#: templates/standard/template.welcome.html:50 +msgid "Contact System Administrators" +msgstr "" + +#: templates/standard/template.upl_files_overview.html:61 +msgid "Sort files" +msgstr "" + +#: templates/standard/template.upl_files_overview.html:88 +msgid "Image size" +msgstr "" + +#: templates/standard/template.str_overview.html:133 +#: templates/standard/template.str_overview.html:227 +#: includes/include.con_edit_form.php:211 +#: includes/include.str_overview.php:509 +msgid "Alias" +msgstr "" + +#: templates/standard/template.str_overview.html:139 +#: includes/cfg_language_de.inc.php:105 includes/cfg_language_de.inc.php:124 +#: includes/include.str_overview.php:963 includes/include.str_overview.php:965 +msgid "Protect category" +msgstr "" + +#: templates/standard/template.str_overview.html:157 +msgid "Category is a tree" +msgstr "" + +#: templates/standard/template.str_overview.html:164 +msgid "Position of category" +msgstr "" + +#: templates/standard/template.recipient_menu.html:92 +#: includes/include.con_left_top.php:237 +msgid "Search" +msgstr "" + +#: includes/rights_tpl.inc.php:55 includes/grouprights_area.inc.php:65 +#: includes/include.client_edit.php:48 +#: includes/include.con_art_overview.php:1013 +#: includes/include.client_artspec.php:40 +#: includes/include.client_artspec.php:50 +#: includes/include.client_artspec.php:60 +#: includes/include.client_artspec.php:70 includes/grouprights_tpl.inc.php:53 +#: includes/grouprights_lay.inc.php:55 includes/grouprights_lay.inc.php:74 +#: includes/include.style_edit_form.php:51 +#: includes/include.html_tpl_edit_form.php:50 +#: includes/include.system_purge.php:37 includes/include.logs.php:46 +#: includes/include.grouprights_overview.php:42 +#: includes/grouprights_mod.inc.php:54 includes/include.style_history.php:57 +#: includes/include.js_history.php:55 includes/rights_area.inc.php:58 +#: includes/include.con_edit_form.php:764 +#: includes/grouprights_members.inc.php:41 includes/rights_con.inc.php:56 +#: includes/rights_lay.inc.php:57 includes/include.grouprights_create.php:42 +#: includes/include.lay_edit_form.php:43 includes/include.lay_edit_form.php:52 +#: includes/grouprights_str.inc.php:54 includes/include.tpl_edit_form.php:40 +#: includes/include.tplcfg_edit_form.php:148 +#: includes/include.lay_history.php:46 includes/include.rights_overview.php:49 +#: includes/rights_str.inc.php:55 includes/include.upl_dirs_overview.php:389 +#: includes/include.upl_dirs_overview.php:536 includes/rights_mod.inc.php:55 +#: includes/grouprights_con.inc.php:56 includes/include.rights_create.php:43 +#: includes/include.js_edit_form.php:50 includes/include.lang_edit.php:127 +#: includes/include.html_tpl_history.php:59 +#: includes/include.mod_history.php:52 +msgid "Permission denied" +msgstr "" + +#: includes/rights_tpl.inc.php:100 includes/grouprights_area.inc.php:86 +#: includes/grouprights_tpl.inc.php:101 includes/grouprights_lay.inc.php:113 +#: includes/grouprights_mod.inc.php:99 includes/rights_area.inc.php:87 +#: includes/rights_con.inc.php:112 includes/rights_lay.inc.php:100 +#: includes/grouprights_str.inc.php:105 includes/rights_str.inc.php:106 +#: includes/rights_mod.inc.php:99 includes/grouprights_con.inc.php:111 +msgid "Check all" +msgstr "" + +#: includes/rights.inc.php:273 includes/include.con_art_overview.php:866 +#: includes/include.grouprights_left_top.php:59 +#: includes/grouprights.inc.php:157 includes/include.rights_left_top.php:76 +#: includes/functions.stat.php:992 includes/functions.stat.php:1018 +msgid "All" +msgstr "" + +#: includes/rights.inc.php:275 includes/grouprights.inc.php:159 +msgid "Article rights" +msgstr "" + +#: includes/rights.inc.php:277 includes/grouprights.inc.php:161 +msgid "Category rights" +msgstr "" + +#: includes/rights.inc.php:279 includes/grouprights.inc.php:163 +msgid "Template rights" +msgstr "" + +#: includes/rights.inc.php:281 includes/grouprights.inc.php:165 +msgid "Plugin/Other rights" +msgstr "" + +#: includes/rights.inc.php:343 +msgid "" +"The selected user is a system administrator. A system administrator has all " +"rights for all clients for all languages and therefore rights can't be " +"specified in more detail." +msgstr "" + +#: includes/rights.inc.php:348 +msgid "" +"The selected user is assigned to clients as admin, only. An admin has all " +"rights for a client and therefore rights can't be specified in more detail." +msgstr "" + +#: includes/rights.inc.php:352 +msgid "Current user doesn't have any rights to any client/language." +msgstr "" + +#: includes/include.client_menu.php:80 +msgid "Delete client" +msgstr "" + +#: includes/include.client_menu.php:81 +#, php-format +msgid "Do you really want to delete the following client:

    %s
    " +msgstr "" + +#: includes/include.client_edit.php:52 +msgid "No client ID passed" +msgstr "" + +#: includes/include.client_edit.php:65 +msgid "" +"Notice: In order to use this client, you must create a new language for it." +msgstr "" + +#: includes/include.client_edit.php:69 +#, php-format +msgid "Please click %shere%s to create a new language." +msgstr "" + +#: includes/include.client_edit.php:116 +msgid "Couldn't write the file config.php." +msgstr "" + +#: includes/include.client_edit.php:126 +#, php-format +msgid "" +"The directory %s already exists. The client was created, but you have to " +"copy the frontend-template yourself" +msgstr "" + +#: includes/include.client_edit.php:145 +msgid "" +"You changed the client path. You might need to copy the frontend to the new " +"location" +msgstr "" + +#: includes/include.client_edit.php:170 +#: includes/include.system_configuration.php:133 +#: includes/include.grouprights_overview.php:65 +#: includes/grouprights.inc.php:335 includes/include.rights_overview.php:141 +#: includes/include.lang_edit.php:140 +msgid "Changes saved" +msgstr "" + +#: includes/include.client_edit.php:226 +#: includes/include.grouprights_overview.php:103 +#: includes/include.CMS_EASYIMG.php:157 +#: includes/include.rights_overview.php:193 +msgid "Discard changes" +msgstr "" + +#: includes/include.client_edit.php:234 +#: includes/include.grouprights_overview.php:106 +#: includes/include.grouprights_overview.php:209 +#: includes/include.grouprights_create.php:96 +#: includes/include.rights_overview.php:197 +#: includes/include.rights_overview.php:353 +#: includes/include.rights_create.php:144 +msgid "Property" +msgstr "" + +#: includes/include.client_edit.php:243 +msgid "Client name" +msgstr "" + +#: includes/include.client_edit.php:259 +msgid "Server path" +msgstr "" + +#: includes/include.client_edit.php:275 +msgid "Web address" +msgstr "" + +#: includes/include.client_edit.php:284 +msgid "Error page category" +msgstr "" + +#: includes/include.client_edit.php:293 +msgid "Error page article" +msgstr "" + +#: includes/include.client_edit.php:304 +msgid "Client logo" +msgstr "" + +#: includes/include.client_edit.php:313 +msgid "HTML" +msgstr "" + +#: includes/include.client_edit.php:313 +msgid "XHTML" +msgstr "" + +#: includes/include.client_edit.php:313 +msgid "HTML5" +msgstr "" + +#: includes/include.client_edit.php:328 +msgid "Generate" +msgstr "" + +#: includes/include.client_edit.php:339 +msgid "Copy frontend template" +msgstr "" + +#: includes/include.con_art_overview.php:354 +#: includes/include.con_edit_form.php:297 +msgid "not yet published" +msgstr "" + +#: includes/include.con_art_overview.php:369 +msgid "Article is in use" +msgstr "" + +#: includes/include.con_art_overview.php:370 +#, php-format +msgid "Article in use by %s (%s)" +msgstr "" + +#: includes/include.con_art_overview.php:446 +msgid "Article is frozen" +msgstr "" + +#: includes/include.con_art_overview.php:449 +msgid "Article is not frozen" +msgstr "" + +#: includes/include.con_art_overview.php:486 +msgid "Copy article to the current language" +msgstr "" + +#: includes/include.con_art_overview.php:553 +#: includes/include.con_edit_form.php:350 +msgid "Start article" +msgstr "" + +#: includes/include.con_art_overview.php:555 +msgid "Normal article" +msgstr "" + +#: includes/include.con_art_overview.php:581 +#, php-format +msgid "Reminder for Article '%s'" +msgstr "" + +#: includes/include.con_art_overview.php:584 +#, php-format +msgid "" +"Reminder for Article '%s'\n" +"Category: %s" +msgstr "" + +#: includes/include.con_art_overview.php:595 +#: includes/include.mycontenido_lastarticles.php:221 +msgid "Article is online" +msgstr "" + +#: includes/include.con_art_overview.php:603 +#: includes/include.mycontenido_lastarticles.php:224 +msgid "Article is offline" +msgstr "" + +#: includes/include.con_art_overview.php:625 +#, php-format +msgid "Are you sure to delete the following article:

    %s" +msgstr "" + +#: includes/include.con_art_overview.php:771 +#: includes/include.con_art_overview.php:774 +#, php-format +msgid "Go to page: %s" +msgstr "" + +#: includes/include.con_art_overview.php:777 +msgid "with click select line for further treatment" +msgstr "" + +#: includes/include.con_art_overview.php:832 +#: includes/include.con_art_overview.php:938 +msgid "No articles found" +msgstr "" + +#: includes/include.con_art_overview.php:838 +msgid "Alphabetical" +msgstr "" + +#: includes/include.con_art_overview.php:839 +msgid "Last change" +msgstr "" + +#: includes/include.con_art_overview.php:840 +msgid "Published date" +msgstr "" + +#: includes/include.con_art_overview.php:841 +#: includes/include.con_edit_form.php:354 +msgid "Sort key" +msgstr "" + +#: includes/include.con_art_overview.php:860 +msgid "Sort articles:" +msgstr "" + +#: includes/include.con_art_overview.php:887 +msgid "Items per page:" +msgstr "" + +#: includes/include.client_artspec.php:79 +#: includes/include.con_edit_form.php:241 +msgid "Article specification" +msgstr "" + +#: includes/include.client_artspec.php:80 +#: includes/include.mycontenido_settings.php:127 +#: includes/include.lay_edit_form.php:207 +#: includes/include.mycontenido.tasks.php:397 +msgid "Options" +msgstr "" + +#: includes/include.client_artspec.php:90 includes/include.upl_edit.php:58 +#: includes/include.systemsettings.php:71 +#: includes/include.systemsettings.php:75 +#: includes/include.clientsettings.php:114 +msgid "Edit" +msgstr "" + +#: includes/include.client_artspec.php:94 +#: includes/include.systemsettings.php:79 +#: includes/include.systemsettings.php:81 +#: includes/include.clientsettings.php:108 +msgid "Delete" +msgstr "" + +#: includes/include.client_artspec.php:131 +msgid "Save" +msgstr "" + +#: includes/include.client_artspec.php:150 +msgid "Make this article specification default" +msgstr "" + +#: includes/include.client_artspec.php:154 +msgid "This article specification is default" +msgstr "" + +#: includes/include.client_artspec.php:163 +#: includes/include.con_edit_form.php:238 +msgid "No article specifications found!" +msgstr "" + +#: includes/include.client_artspec.php:173 +msgid "Create new article specification" +msgstr "" + +#: includes/include.client_artspec.php:176 +msgid "Specification name" +msgstr "" + +#: includes/include.mod_package.php:111 +#: includes/include.js_files_overview.php:104 +#: includes/include.html_tpl_files_overview.php:105 +#: includes/include.style_files_overview.php:104 +msgid "is not readable!" +msgstr "" + +#: includes/include.mod_package.php:123 +#: includes/include.js_files_overview.php:155 +#: includes/include.html_tpl_files_overview.php:156 +#: includes/include.style_files_overview.php:155 +msgid "Directory is not existing or readable!" +msgstr "" + +#: includes/include.mod_package.php:139 +msgid "No elements available" +msgstr "" + +#: includes/include.mod_package.php:188 +msgid "Javascript files" +msgstr "" + +#: includes/include.mod_package.php:189 +msgid "Module template files" +msgstr "" + +#: includes/include.mod_package.php:190 +msgid "Style files" +msgstr "" + +#: includes/include.mod_package.php:192 +msgid "Translations" +msgstr "" + +#: includes/include.mod_package.php:219 includes/include.mod_package.php:357 +#: includes/include.mod_edit_form.php:81 +#, php-format +msgid "Error while importing XML file: %s" +msgstr "" + +#: includes/include.mod_package.php:238 +msgid "Skip" +msgstr "" + +#: includes/include.mod_package.php:238 +msgid "Append" +msgstr "" + +#: includes/include.mod_package.php:238 +msgid "Overwrite" +msgstr "" + +#: includes/include.mod_package.php:239 +msgid "OK" +msgstr "" + +#: includes/include.mod_package.php:240 +msgid "Assign" +msgstr "" + +#: includes/include.mod_package.php:241 +msgid "Conflict" +msgstr "" + +#: includes/include.mod_package.php:242 +msgid "Ignored" +msgstr "" + +#: includes/include.mod_package.php:243 +msgid "- Select -" +msgstr "" + +#: includes/include.mod_package.php:252 includes/include.mod_package.php:361 +#: includes/include.mod_package.php:366 +#: includes/include.mycontenido.tasks.edit.php:137 +#: includes/include.mycontenido.tasks.php:276 +#: includes/include.stat_overview.php:90 +msgid "Status" +msgstr "" + +#: includes/include.mod_package.php:312 +msgid "Import" +msgstr "" + +#: includes/include.mod_package.php:361 +msgid "Import was not succesful, please check data and try again" +msgstr "" + +#: includes/include.mod_package.php:362 +msgid "Retry" +msgstr "" + +#: includes/include.mod_package.php:366 +msgid "Import succesfully finished" +msgstr "" + +#: includes/include.mod_package.php:367 +msgid "Finish" +msgstr "" + +#: includes/include.mod_package.php:398 includes/include.mod_edit_form.php:101 +#, php-format +msgid "Module is in use by %s (%s)" +msgstr "" + +#: includes/include.mod_package.php:421 +msgid "Edit package" +msgstr "" + +#: includes/include.mod_package.php:442 +msgid "Package GUID" +msgstr "" + +#: includes/include.mod_package.php:454 includes/include.mod_translate.php:174 +#: includes/include.mod_edit_form.php:419 +msgid "Import from file" +msgstr "" + +#: includes/include.mod_package.php:455 includes/include.mod_translate.php:173 +#: includes/include.mod_edit_form.php:420 +msgid "Export to file" +msgstr "" + +#: includes/include.mod_package.php:472 includes/include.mod_translate.php:184 +#: includes/include.mod_edit_form.php:437 +msgid "Mode" +msgstr "" + +#: includes/include.todo.popup.php:58 +msgid "Add TODO item" +msgstr "" + +#: includes/include.todo.popup.php:67 +#: includes/include.mycontenido.tasks.edit.php:68 +#: includes/include.mycontenido.tasks.php:276 +msgid "Subject" +msgstr "" + +#: includes/include.todo.popup.php:75 +#: includes/include.mycontenido.tasks.edit.php:100 +msgid "Reminder date" +msgstr "" + +#: includes/include.todo.popup.php:80 +msgid "eMail notification" +msgstr "" + +#: includes/include.todo.popup.php:82 +#: includes/include.mycontenido.tasks.edit.php:81 +msgid "Reminder options" +msgstr "" + +#: includes/include.todo.popup.php:124 +#: includes/include.mycontenido.tasks.edit.php:65 +msgid "Assigned to" +msgstr "" + +#: includes/include.upl_edit.php:83 +msgid "File name" +msgstr "" + +#: includes/include.upl_edit.php:84 +#: includes/include.upl_search_results.php:204 +#: includes/include.upl_search_results.php:209 +#: includes/include.upl_search_results.php:212 +msgid "Path" +msgstr "" + +#: includes/include.upl_edit.php:85 +msgid "Replace file" +msgstr "" + +#: includes/include.upl_edit.php:86 +msgid "Media name" +msgstr "" + +#: includes/include.upl_edit.php:88 +msgid "Keywords" +msgstr "" + +#: includes/include.upl_edit.php:89 +msgid "Internal notes" +msgstr "" + +#: includes/include.upl_edit.php:90 +msgid "Copyright" +msgstr "" + +#: includes/include.upl_edit.php:91 +msgid "Protection" +msgstr "" + +#: includes/include.upl_edit.php:93 +#: includes/include.upl_files_overview.php:537 +#: includes/include.upl_search_results.php:286 +#: includes/include.CMS_IMG.php:283 +msgid "Preview" +msgstr "" + +#: includes/include.upl_edit.php:94 includes/include.con_left_top.php:275 +#: includes/include.frontend.user_edit.php:245 +msgid "Author" +msgstr "" + +#: includes/include.upl_edit.php:95 +#: includes/include.frontend.user_edit.php:246 +msgid "Last modified by" +msgstr "" + +#: includes/include.upl_edit.php:192 +msgid "Protected for non-logged in users" +msgstr "" + +#: includes/include.upl_edit.php:296 +#: includes/include.upl_files_overview.php:87 +#: includes/include.upl_files_upload.php:67 +msgid "Directory not writable" +msgstr "" + +#: includes/include.upl_edit.php:305 +#, php-format +msgid "Could not load file %s" +msgstr "" + +#: includes/include.upl_files_overview.php:260 +#, php-format +msgid "" +"The uploaded file (%s) exceeds the upload_max_filesize directive in php.ini." +msgstr "" + +#: includes/include.upl_files_overview.php:270 +#, php-format +msgid "Error while uploading file (%s)." +msgstr "" + +#: includes/include.upl_files_overview.php:322 +msgid "Errors while uploading file(s). Some or all files were not uploaded." +msgstr "" + +#: includes/include.upl_files_overview.php:405 +#: includes/include.upl_files_overview.php:407 +msgid "Use file" +msgstr "" + +#: includes/include.upl_files_overview.php:453 +#: includes/include.upl_files_overview.php:457 +#: includes/include.upl_files_overview.php:459 +#: includes/include.upl_search_results.php:190 +#: includes/include.upl_search_results.php:195 +#: includes/include.upl_search_results.php:198 +msgid "Filename / Description" +msgstr "" + +#: includes/include.upl_files_overview.php:465 +#: includes/include.upl_files_overview.php:469 +#: includes/include.upl_files_overview.php:471 +#: includes/include.upl_search_results.php:218 +#: includes/include.upl_search_results.php:223 +#: includes/include.upl_search_results.php:226 +msgid "Size" +msgstr "" + +#: includes/include.upl_files_overview.php:477 +#: includes/include.upl_files_overview.php:481 +#: includes/include.upl_files_overview.php:483 +#: includes/include.upl_search_results.php:232 +#: includes/include.upl_search_results.php:237 +#: includes/include.upl_search_results.php:240 includes/include.mod_new.php:59 +#: includes/include.mod_new.php:82 includes/include.mod_edit_form.php:377 +#: includes/include.systemsettings.php:60 +#: includes/include.systemsettings.php:170 +#: includes/include.clientsettings.php:98 +#: includes/include.clientsettings.php:185 +msgid "Type" +msgstr "" + +#: includes/include.upl_files_overview.php:490 +msgid "Delete Files" +msgstr "" + +#: includes/include.upl_files_overview.php:490 +msgid "Are you sure you want to delete the selected files?" +msgstr "" + +#: includes/include.upl_files_overview.php:491 +msgid "Delete selected files" +msgstr "" + +#: includes/include.upl_files_overview.php:508 +msgid "Flip Selection" +msgstr "" + +#: includes/include.upl_files_overview.php:513 +#: includes/include.upl_files_upload.php:59 +msgid "Path:" +msgstr "" + +#: includes/include.upl_files_overview.php:528 +#: includes/include.upl_search_results.php:276 +msgid "Files per Page" +msgstr "" + +#: includes/include.upl_files_overview.php:536 +msgid "Mark" +msgstr "" + +#: includes/include.upl_files_overview.php:654 +msgid "Display properties" +msgstr "" + +#: includes/include.upl_files_overview.php:717 +#: includes/include.upl_search_results.php:445 +msgid "Previous Page" +msgstr "" + +#: includes/include.upl_files_overview.php:724 +#: includes/include.upl_search_results.php:452 +msgid "Next Page" +msgstr "" + +#: includes/include.upl_files_overview.php:764 +#: includes/include.upl_search_results.php:490 +msgid "Page" +msgstr "" + +#: includes/include.upl_files_overview.php:790 +#: includes/cfg_language_de.inc.php:143 +msgid "Delete file" +msgstr "" + +#: includes/include.upl_files_overview.php:791 +msgid "Do you really want to delete the following file:
    " +msgstr "" + +#: includes/include.upl_files_overview.php:922 +#: includes/include.upl_search_results.php:605 +msgid "Enter new filename" +msgstr "" + +#: includes/include.upl_search_results.php:246 +#: includes/include.upl_search_results.php:251 +#: includes/include.upl_search_results.php:254 +msgid "Relevance" +msgstr "" + +#: includes/include.upl_search_results.php:260 +msgid "Searched for:" +msgstr "" + +#: includes/include.system_sysvalues.php:79 +#: includes/include.system_sysvalues.php:123 +msgid "No error log entries found" +msgstr "" + +#: includes/include.system_sysvalues.php:83 +msgid "No error log file found" +msgstr "" + +#: includes/include.system_sysvalues.php:116 +msgid "No install error log entries found" +msgstr "" + +#: includes/grouprights_lay.inc.php:85 includes/rights_lay.inc.php:75 +msgid "Layout name" +msgstr "" + +#: includes/include.js_files_overview.php:131 +#: includes/include.html_tpl_files_overview.php:132 +#: includes/include.system_db_backup.php:276 +#: includes/include.style_files_overview.php:131 +msgid "Delete File" +msgstr "" + +#: includes/include.js_files_overview.php:132 +#: includes/include.html_tpl_files_overview.php:133 +#: includes/include.style_files_overview.php:132 +#, php-format +msgid "Do you really want to delete the following file:

    %s
    " +msgstr "" + +#: includes/include.system_configuration.php:93 +msgid "Versioning activated" +msgstr "" + +#: includes/include.system_configuration.php:93 +#: includes/include.system_configuration.php:94 +#: includes/include.system_configuration.php:95 +msgid "Versioning" +msgstr "" + +#: includes/include.system_configuration.php:94 +msgid "Serverpath to version files" +msgstr "" + +#: includes/include.system_configuration.php:95 +msgid "Maximum number of stored versions" +msgstr "" + +#: includes/include.system_configuration.php:96 +msgid "Check for updates" +msgstr "" + +#: includes/include.system_configuration.php:96 +#: includes/include.system_configuration.php:97 +#: includes/include.system_configuration.php:98 +msgid "Update notifier" +msgstr "" + +#: includes/include.system_configuration.php:97 +msgid "Get news from conlite.org" +msgstr "" + +#: includes/include.system_configuration.php:98 +msgid "Update check period (minutes)" +msgstr "" + +#: includes/include.system_configuration.php:99 +msgid "Clickable menu in backend" +msgstr "" + +#: includes/include.system_configuration.php:99 +#: includes/include.system_configuration.php:100 +#: includes/include.system_configuration.php:101 +#: includes/include.system_configuration.php:102 +#: includes/include.system_configuration.php:103 +#: includes/include.system_configuration.php:104 +msgid "Backend" +msgstr "" + +#: includes/include.system_configuration.php:100 +msgid "Use passwordrequest in Backend" +msgstr "" + +#: includes/include.system_configuration.php:101 +msgid "Activate maintenance mode" +msgstr "" + +#: includes/include.system_configuration.php:102 +msgid "Use editarea for code highlighting" +msgstr "" + +#: includes/include.system_configuration.php:103 +msgid "Use TinyMce as insight editor" +msgstr "" + +#: includes/include.system_configuration.php:104 +msgid "Default client (ID)" +msgstr "" + +#: includes/include.system_configuration.php:105 +msgid "Mailserver host" +msgstr "" + +#: includes/include.system_configuration.php:105 +#: includes/include.system_configuration.php:106 +#: includes/include.system_configuration.php:107 +msgid "Mailserver" +msgstr "" + +#: includes/include.system_configuration.php:106 +msgid "Mailserver sender mail" +msgstr "" + +#: includes/include.system_configuration.php:107 +msgid "Mailserver sender name" +msgstr "" + +#: includes/include.system_configuration.php:109 +msgid "Generate basehref" +msgstr "" + +#: includes/include.system_configuration.php:109 +#: includes/include.system_configuration.php:110 +msgid "Development" +msgstr "" + +#: includes/include.system_configuration.php:110 +msgid "Use image magic (if available)" +msgstr "" + +#: includes/include.system_configuration.php:123 +msgid "Update check period must be at least 60 minutes." +msgstr "" + +#: includes/include.system_configuration.php:142 +msgid "System Configuration" +msgstr "" + +#: includes/include.system_configuration.php:192 +msgid "Access denied" +msgstr "" + +#: includes/include.con_editcontent.php:216 +msgid "Close editor" +msgstr "" + +#: includes/include.con_editcontent.php:217 +msgid "Close editor and save changes" +msgstr "" + +#: includes/include.con_editcontent.php:218 +msgid "Do you want to save changes?" +msgstr "" + +#: includes/include.con_editcontent.php:380 +msgid "No template assigned to the category
    and/or the article" +msgstr "" + +#: includes/include.con_editcontent.php:381 +msgid "The code for the following article
    couldnt be generated:" +msgstr "" + +#: includes/include.con_editcontent.php:397 includes/include.lang_edit.php:247 +#: includes/include.lang_edit.php:249 main.loginform.php:193 +msgid "Language" +msgstr "" + +#: includes/include.con_left_top.php:135 +msgid "Ignore" +msgstr "" + +#: includes/include.con_left_top.php:138 +msgid "Date published" +msgstr "" + +#: includes/include.con_left_top.php:141 +msgid "Article Search" +msgstr "" + +#: includes/include.con_left_top.php:250 +msgid "Title/Content" +msgstr "" + +#: includes/include.con_left_top.php:255 +msgid "Article ID" +msgstr "" + +#: includes/include.con_left_top.php:260 +msgid "Datum" +msgstr "" + +#: includes/include.con_left_top.php:265 +msgid "Date from" +msgstr "" + +#: includes/include.con_left_top.php:270 +msgid "Date to" +msgstr "" + +#: includes/include.con_left_top.php:291 +msgid "Saved Searches" +msgstr "" + +#: includes/include.con_left_top.php:302 +#: includes/include.mycontenido_lastarticles.php:137 +#: includes/main.login.php:184 +msgid "Recently edited articles" +msgstr "" + +#: includes/include.con_left_top.php:306 +msgid "My articles" +msgstr "" + +#: includes/include.con_left_top.php:311 +msgid "Workflow" +msgstr "" + +#: includes/include.con_left_top.php:374 +#: includes/include.frontend.user_edit.php:241 +#: includes/include.str_overview.php:188 includes/include.str_overview.php:656 +#: includes/include.tpl_edit_form.php:87 includes/include.tpl_edit_form.php:92 +#: includes/include.tpl_edit_form.php:206 +#: includes/include.tplcfg_edit_form.php:309 +#: includes/include.rights_overview.php:455 +#: includes/include.tpl_visualedit.php:146 +msgid "none" +msgstr "" + +#: includes/include.con_left_top.php:379 +msgid "Edit Category" +msgstr "" + +#: includes/include.con_left_top.php:395 +msgid "Template:" +msgstr "" + +#: includes/include.con_left_top.php:404 includes/include.con_left_top.php:405 +msgid "Configure Category" +msgstr "" + +#: includes/include.con_left_top.php:407 includes/include.con_left_top.php:408 +msgid "Online / Offline" +msgstr "" + +#: includes/include.con_left_top.php:410 includes/include.con_left_top.php:411 +msgid "Lock / Unlock" +msgstr "" + +#: includes/include.con_left_top.php:428 +msgid "close all" +msgstr "" + +#: includes/include.con_left_top.php:429 +msgid "open all" +msgstr "" + +#: includes/include.con_left_top.php:439 +msgid "Synchronize from" +msgstr "" + +#: includes/include.con_left_top.php:472 includes/include.con_left_top.php:473 +msgid "Copy to current language" +msgstr "" + +#: includes/include.con_left_top.php:474 includes/include.con_left_top.php:475 +msgid "Also copy subcategories" +msgstr "" + +#: includes/include.style_edit_form.php:180 +#: includes/include.html_tpl_edit_form.php:197 +#: includes/include.js_edit_form.php:159 +msgid "Edit file" +msgstr "" + +#: includes/include.style_edit_form.php:199 +#: includes/include.html_tpl_edit_form.php:215 +#: includes/include.style_history.php:162 includes/include.js_history.php:157 +#: includes/include.lay_edit_form.php:206 +#: includes/include.lay_edit_form.php:217 includes/include.lay_history.php:122 +#: includes/include.js_edit_form.php:177 +#: includes/include.html_tpl_history.php:165 +msgid "Code" +msgstr "" + +#: includes/include.frontend.group.subnav.php:40 includes/main.login.php:183 +msgid "Overview" +msgstr "" + +#: includes/include.mycontenido_settings.php:57 +msgid "Old password incorrect" +msgstr "" + +#: includes/include.mycontenido_settings.php:62 +#: includes/include.rights_overview.php:132 +#: includes/include.rights_create.php:122 +msgid "Passwords don't match" +msgstr "" + +#: includes/include.mycontenido_settings.php:77 +msgid "Password changed" +msgstr "" + +#: includes/include.mycontenido_settings.php:97 +#, php-format +msgid "Settings for %s" +msgstr "" + +#: includes/include.mycontenido_settings.php:115 +msgid "Old password" +msgstr "" + +#: includes/include.mycontenido_settings.php:116 +#: includes/include.frontend.user_edit.php:190 +#: includes/include.rights_overview.php:217 +#: includes/include.rights_create.php:162 +msgid "New password" +msgstr "" + +#: includes/include.mycontenido_settings.php:117 +#: includes/include.rights_overview.php:223 +#: includes/include.rights_create.php:168 +msgid "Confirm new password" +msgstr "" + +#: includes/include.mycontenido_settings.php:121 +#: includes/include.rights_overview.php:230 +#: includes/include.rights_create.php:174 +msgid "E-Mail" +msgstr "" + +#: includes/include.mycontenido_settings.php:125 +msgid "Use WYSIWYG Editor" +msgstr "" + +#: includes/include.mycontenido_settings.php:129 +msgid "The format is equal to PHP's date() function." +msgstr "" + +#: includes/include.mycontenido_settings.php:131 +msgid "Common date formattings" +msgstr "" + +#: includes/include.mycontenido_settings.php:141 +#: includes/include.lang_edit.php:254 +msgid "Date/Time format" +msgstr "" + +#: includes/include.mycontenido_settings.php:142 +#: includes/include.lang_edit.php:255 +msgid "Date format" +msgstr "" + +#: includes/include.mycontenido_settings.php:143 +#: includes/include.lang_edit.php:253 includes/include.lang_edit.php:256 +msgid "Time format" +msgstr "" + +#: includes/include.html_tpl_edit_form.php:185 +#: includes/include.lay_edit_form.php:173 +#, php-format +msgid "Tag '%s' %s has no end tag (start tag is on line %s char %s)" +msgstr "" + +#: includes/include.system_purge.php:79 includes/include.system_purge.php:87 +#: includes/include.system_purge.php:95 includes/include.system_purge.php:103 +#: includes/include.system_purge.php:112 +msgid "Client " +msgstr "" + +#: includes/include.system_purge.php:80 includes/include.system_purge.php:128 +#: includes/include.system_purge.php:135 +#, php-format +msgid "The entries of %s table are not deleted!" +msgstr "" + +#: includes/include.system_purge.php:88 +#, php-format +msgid "The %s is not updated!" +msgstr "" + +#: includes/include.system_purge.php:96 +msgid "The cache is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:104 +msgid "The log is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:113 +msgid "The history is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:143 +msgid "The contenido log is not cleaned!" +msgstr "" + +#: includes/include.system_purge.php:150 +msgid "The contenido cache is not deleted!" +msgstr "" + +#: includes/include.system_purge.php:157 +msgid "The contenido cronjobs are not cleaned!" +msgstr "" + +#: includes/include.system_purge.php:164 +msgid "Update of sequence table not completed!" +msgstr "" + +#: includes/include.system_purge.php:169 +msgid "The changes were successfully executed." +msgstr "" + +#: includes/include.system_purge.php:171 +msgid "The changes were not all successfully completed." +msgstr "" + +#: includes/include.system_purge.php:190 includes/include.system_purge.php:214 +msgid "System purge" +msgstr "" + +#: includes/include.system_purge.php:191 +msgid "No Client selected!" +msgstr "" + +#: includes/include.system_purge.php:196 +msgid "all clients" +msgstr "" + +#: includes/include.system_purge.php:197 +msgid "from list" +msgstr "" + +#: includes/include.system_purge.php:198 +msgid "Select clients" +msgstr "" + +#: includes/include.system_purge.php:199 includes/include.system_purge.php:201 +#: includes/include.system_purge.php:209 +#, php-format +msgid "Reset the table %s" +msgstr "" + +#: includes/include.system_purge.php:200 +#, php-format +msgid "Activate the code generation in %s" +msgstr "" + +#: includes/include.system_purge.php:202 +msgid "Clear client cache" +msgstr "" + +#: includes/include.system_purge.php:203 +msgid "Clear client log file" +msgstr "" + +#: includes/include.system_purge.php:204 +msgid "Clear client history" +msgstr "" + +#: includes/include.system_purge.php:205 +msgid "Keep last histories" +msgstr "" + +#: includes/include.system_purge.php:207 +msgid "Contenido" +msgstr "" + +#: includes/include.system_purge.php:208 +msgid "Clear contenido log file" +msgstr "" + +#: includes/include.system_purge.php:210 +msgid "Clear contenido cache" +msgstr "" + +#: includes/include.system_purge.php:211 +msgid "Reset cronjobs" +msgstr "" + +#: includes/include.system_purge.php:212 +msgid "Update sequence table" +msgstr "" + +#: includes/include.system_purge.php:215 +msgid "These changes can not be cancelled." +msgstr "" + +#: includes/include.system_purge.php:215 +msgid "Do you really want to complete it?" +msgstr "" + +#: includes/include.system_purge.php:220 +msgid "No action selected!" +msgstr "" + +#: includes/include.system_purge.php:222 +msgid "Send" +msgstr "" + +#: includes/cfg_language_de.inc.php:99 +msgid "Make category online" +msgstr "" + +#: includes/cfg_language_de.inc.php:100 +msgid "Change template" +msgstr "" + +#: includes/cfg_language_de.inc.php:101 +msgid "Set start article" +msgstr "" + +#: includes/cfg_language_de.inc.php:102 +msgid "Make article online" +msgstr "" + +#: includes/cfg_language_de.inc.php:103 +msgid "Syncronize Category" +msgstr "" + +#: includes/cfg_language_de.inc.php:104 +msgid "Syncronize Article" +msgstr "" + +#: includes/cfg_language_de.inc.php:107 +msgid "Edit template configuration" +msgstr "" + +#: includes/cfg_language_de.inc.php:108 +msgid "Duplicate Article" +msgstr "" + +#: includes/cfg_language_de.inc.php:109 +msgid "Expand boxes" +msgstr "" + +#: includes/cfg_language_de.inc.php:111 +msgid "Create article" +msgstr "" + +#: includes/cfg_language_de.inc.php:112 +msgid "Configure article" +msgstr "" + +#: includes/cfg_language_de.inc.php:113 +msgid "Save article" +msgstr "" + +#: includes/cfg_language_de.inc.php:114 includes/include.con_edit_form.php:391 +msgid "Remove assignments" +msgstr "" + +#: includes/cfg_language_de.inc.php:115 includes/cfg_language_de.inc.php:117 +msgid "Edit article" +msgstr "" + +#: includes/cfg_language_de.inc.php:116 +msgid "Edit article properties" +msgstr "" + +#: includes/cfg_language_de.inc.php:118 +msgid "Help" +msgstr "" + +#: includes/cfg_language_de.inc.php:121 +msgid "New category" +msgstr "" + +#: includes/cfg_language_de.inc.php:122 +msgid "Set category on- or offline" +msgstr "" + +#: includes/cfg_language_de.inc.php:123 +msgid "Disable category" +msgstr "" + +#: includes/cfg_language_de.inc.php:125 +msgid "Frontend access" +msgstr "" + +#: includes/cfg_language_de.inc.php:126 +msgid "Delete category" +msgstr "" + +#: includes/cfg_language_de.inc.php:127 +msgid "Move category up" +msgstr "" + +#: includes/cfg_language_de.inc.php:128 +msgid "Move category down" +msgstr "" + +#: includes/cfg_language_de.inc.php:130 +msgid "Create new tree" +msgstr "" + +#: includes/cfg_language_de.inc.php:133 +msgid "Edit category" +msgstr "" + +#: includes/cfg_language_de.inc.php:135 includes/cfg_language_de.inc.php:145 +msgid "Create directory" +msgstr "" + +#: includes/cfg_language_de.inc.php:136 includes/cfg_language_de.inc.php:144 +#: includes/include.upl_files_upload.php:63 +msgid "Upload files" +msgstr "" + +#: includes/cfg_language_de.inc.php:137 +msgid "Delete files" +msgstr "" + +#: includes/cfg_language_de.inc.php:138 +msgid "Remove directory" +msgstr "" + +#: includes/cfg_language_de.inc.php:139 +msgid "Rename directory" +msgstr "" + +#: includes/cfg_language_de.inc.php:140 +msgid "Modify file" +msgstr "" + +#: includes/cfg_language_de.inc.php:141 +msgid "Rename file" +msgstr "" + +#: includes/cfg_language_de.inc.php:142 +msgid "Multidelete Files" +msgstr "" + +#: includes/cfg_language_de.inc.php:147 includes/include.lay_overview.php:92 +msgid "Delete layout" +msgstr "" + +#: includes/cfg_language_de.inc.php:148 +msgid "Modify layout" +msgstr "" + +#: includes/cfg_language_de.inc.php:149 +msgid "Create layout" +msgstr "" + +#: includes/cfg_language_de.inc.php:150 includes/cfg_language_de.inc.php:155 +#: includes/cfg_language_de.inc.php:201 includes/cfg_language_de.inc.php:207 +#: includes/cfg_language_de.inc.php:213 +msgid "Manage History" +msgstr "" + +#: includes/cfg_language_de.inc.php:151 includes/cfg_language_de.inc.php:156 +#: includes/cfg_language_de.inc.php:202 includes/cfg_language_de.inc.php:208 +#: includes/cfg_language_de.inc.php:214 +msgid "Truncate History" +msgstr "" + +#: includes/cfg_language_de.inc.php:154 includes/include.mod_overview.php:234 +msgid "Delete module" +msgstr "" + +#: includes/cfg_language_de.inc.php:157 includes/include.mod_edit_form.php:124 +msgid "Edit module" +msgstr "" + +#: includes/cfg_language_de.inc.php:158 +msgid "Create module" +msgstr "" + +#: includes/cfg_language_de.inc.php:159 +msgid "Import/Export module" +msgstr "" + +#: includes/cfg_language_de.inc.php:160 +msgid "Translate modules" +msgstr "" + +#: includes/cfg_language_de.inc.php:161 +msgid "Translation import/export" +msgstr "" + +#: includes/cfg_language_de.inc.php:162 +msgid "Import/Export package" +msgstr "" + +#: includes/cfg_language_de.inc.php:164 includes/include.tpl_overview.php:99 +msgid "Delete template" +msgstr "" + +#: includes/cfg_language_de.inc.php:165 includes/include.tpl_edit_form.php:149 +msgid "Edit template" +msgstr "" + +#: includes/cfg_language_de.inc.php:166 +msgid "Create template" +msgstr "" + +#: includes/cfg_language_de.inc.php:169 +msgid "Visual edit" +msgstr "" + +#: includes/cfg_language_de.inc.php:172 +#: includes/include.frontend.left_top.php:397 +#: includes/include.rights_menu.php:135 +#: includes/include.frontend.user_menu.php:275 +msgid "Delete user" +msgstr "" + +#: includes/cfg_language_de.inc.php:173 +msgid "Save user area rights" +msgstr "" + +#: includes/cfg_language_de.inc.php:175 +msgid "Edit rights" +msgstr "" + +#: includes/cfg_language_de.inc.php:176 +#: includes/include.frontend.user_edit.php:181 +msgid "Edit user" +msgstr "" + +#: includes/cfg_language_de.inc.php:178 +msgid "Delete group members" +msgstr "" + +#: includes/cfg_language_de.inc.php:179 +msgid "Add group members" +msgstr "" + +#: includes/cfg_language_de.inc.php:180 +#: includes/include.frontend.group_edit.php:275 +msgid "Edit group" +msgstr "" + +#: includes/cfg_language_de.inc.php:181 +#: includes/include.grouprights_left_top.php:90 +#: includes/include.frontend.left_top.php:442 +msgid "Create group" +msgstr "" + +#: includes/cfg_language_de.inc.php:182 +#: includes/include.grouprights_menu.php:196 +msgid "Delete group" +msgstr "" + +#: includes/cfg_language_de.inc.php:184 +msgid "Show statistics" +msgstr "" + +#: includes/cfg_language_de.inc.php:186 includes/include.lang_overview.php:68 +msgid "Activate language" +msgstr "" + +#: includes/cfg_language_de.inc.php:187 includes/include.lang_overview.php:72 +msgid "Deactivate language" +msgstr "" + +#: includes/cfg_language_de.inc.php:188 +msgid "Rename language" +msgstr "" + +#: includes/cfg_language_de.inc.php:189 includes/include.lang_left_top.php:80 +msgid "Create language" +msgstr "" + +#: includes/cfg_language_de.inc.php:190 includes/include.lang_overview.php:78 +msgid "Delete language" +msgstr "" + +#: includes/cfg_language_de.inc.php:191 includes/include.lang_edit.php:242 +msgid "Edit language" +msgstr "" + +#: includes/cfg_language_de.inc.php:193 +msgid "Linkchecker" +msgstr "" + +#: includes/cfg_language_de.inc.php:194 +msgid "Linkchecker Whitelist" +msgstr "" + +#: includes/cfg_language_de.inc.php:196 +msgid "Install/Remove plugins" +msgstr "" + +#: includes/cfg_language_de.inc.php:198 +msgid "Modify CSS" +msgstr "" + +#: includes/cfg_language_de.inc.php:199 +msgid "Create CSS" +msgstr "" + +#: includes/cfg_language_de.inc.php:200 +msgid "Delete CSS" +msgstr "" + +#: includes/cfg_language_de.inc.php:204 +msgid "Edit script" +msgstr "" + +#: includes/cfg_language_de.inc.php:205 +msgid "Delete script" +msgstr "" + +#: includes/cfg_language_de.inc.php:206 includes/include.js_left_top.php:50 +msgid "Create script" +msgstr "" + +#: includes/cfg_language_de.inc.php:210 +msgid "Modify HTML-Template" +msgstr "" + +#: includes/cfg_language_de.inc.php:211 +msgid "Create HTML-Template" +msgstr "" + +#: includes/cfg_language_de.inc.php:212 +msgid "Delete HTML-Template" +msgstr "" + +#: includes/cfg_language_de.inc.php:216 +msgid "Edit newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:218 +msgid "Delete newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:219 +msgid "Duplicate newsletter" +msgstr "" + +#: includes/cfg_language_de.inc.php:220 +msgid "Add newsletter dispatch job" +msgstr "" + +#: includes/cfg_language_de.inc.php:221 +msgid "Change global HTML newsletter settings" +msgstr "" + +#: includes/cfg_language_de.inc.php:222 +msgid "Send test newsletter (to groups)" +msgstr "" + +#: includes/cfg_language_de.inc.php:223 +msgid "Delete dispatch job" +msgstr "" + +#: includes/cfg_language_de.inc.php:224 +msgid "Remove recipient from dispatch job" +msgstr "" + +#: includes/cfg_language_de.inc.php:225 +msgid "Run job" +msgstr "" + +#: includes/cfg_language_de.inc.php:226 +msgid "View dispatch job details" +msgstr "" + +#: includes/cfg_language_de.inc.php:228 +msgid "Edit recipient" +msgstr "" + +#: includes/cfg_language_de.inc.php:230 +msgid "Delete recipient" +msgstr "" + +#: includes/cfg_language_de.inc.php:231 +msgid "Purge recipients" +msgstr "" + +#: includes/cfg_language_de.inc.php:232 +msgid "Import recipients" +msgstr "" + +#: includes/cfg_language_de.inc.php:233 +msgid "Execute recipients import" +msgstr "" + +#: includes/cfg_language_de.inc.php:234 +msgid "Delete recipient group" +msgstr "" + +#: includes/cfg_language_de.inc.php:236 +msgid "Delete recipient from group" +msgstr "" + +#: includes/cfg_language_de.inc.php:237 +msgid "Save recipient group" +msgstr "" + +#: includes/cfg_language_de.inc.php:239 +msgid "Edit own MyContenido settings" +msgstr "" + +#: includes/cfg_language_de.inc.php:240 +msgid "Delete reminder item" +msgstr "" + +#: includes/cfg_language_de.inc.php:241 +msgid "Save todo item" +msgstr "" + +#: includes/cfg_language_de.inc.php:243 +#: includes/include.client_left_top.php:50 +msgid "Create client" +msgstr "" + +#: includes/cfg_language_de.inc.php:244 +msgid "Edit client" +msgstr "" + +#: includes/cfg_language_de.inc.php:245 +msgid "Remove client" +msgstr "" + +#: includes/cfg_language_de.inc.php:246 +msgid "Delete clientsetting" +msgstr "" + +#: includes/cfg_language_de.inc.php:247 +msgid "Edit clientsetting" +msgstr "" + +#: includes/cfg_language_de.inc.php:248 +msgid "Save clientsetting" +msgstr "" + +#: includes/cfg_language_de.inc.php:249 +msgid "Create/Edit articlespecifications" +msgstr "" + +#: includes/cfg_language_de.inc.php:250 +msgid "Delete articlespecifications" +msgstr "" + +#: includes/cfg_language_de.inc.php:251 +msgid "Define default articlespecification" +msgstr "" + +#: includes/cfg_language_de.inc.php:252 +msgid "Edit articlespecifications" +msgstr "" + +#: includes/cfg_language_de.inc.php:253 +msgid "Make articlespecifications online" +msgstr "" + +#: includes/cfg_language_de.inc.php:255 +msgid "Save frontenduser" +msgstr "" + +#: includes/cfg_language_de.inc.php:256 +msgid "Create frontenduser" +msgstr "" + +#: includes/cfg_language_de.inc.php:257 includes/cfg_language_de.inc.php:263 +msgid "Delete frontenduser" +msgstr "" + +#: includes/cfg_language_de.inc.php:258 +msgid "Delete frontendgroup" +msgstr "" + +#: includes/cfg_language_de.inc.php:259 +msgid "Save frontendgroup" +msgstr "" + +#: includes/cfg_language_de.inc.php:260 includes/cfg_language_de.inc.php:261 +msgid "Create frontendgroup" +msgstr "" + +#: includes/cfg_language_de.inc.php:262 +msgid "Add frontendusers" +msgstr "" + +#: includes/cfg_language_de.inc.php:264 +msgid "Save frontendgroup permissions" +msgstr "" + +#: includes/cfg_language_de.inc.php:266 +msgid "Delete system property" +msgstr "" + +#: includes/cfg_language_de.inc.php:267 +msgid "Edit system property" +msgstr "" + +#: includes/cfg_language_de.inc.php:268 +msgid "Save system property" +msgstr "" + +#: includes/cfg_language_de.inc.php:270 +msgid "Empty log" +msgstr "" + +#: includes/cfg_language_de.inc.php:271 +msgid "Edit Systemconfigration" +msgstr "" + +#: includes/cfg_language_de.inc.php:272 +msgid "Do system purge" +msgstr "" + +#: includes/cfg_language_de.inc.php:274 +msgid "Show log" +msgstr "" + +#: includes/cfg_language_de.inc.php:276 main.loginform.php:197 +msgid "Login" +msgstr "" + +#: includes/cfg_language_de.inc.php:277 +msgid "Request password?" +msgstr "" + +#: includes/cfg_language_de.inc.php:279 +msgid "Delete note" +msgstr "" + +#: includes/cfg_language_de.inc.php:280 +msgid "Save note" +msgstr "" + +#: includes/cfg_language_de.inc.php:282 +msgid "Send mail" +msgstr "" + +#: includes/cfg_language_de.inc.php:283 +msgid "Fake permissions" +msgstr "" + +#: includes/include.mod_new.php:41 +msgid "New module" +msgstr "" + +#: includes/include.mod_new.php:44 +msgid "Sync module" +msgstr "" + +#: includes/include.mod_new.php:48 includes/include.js_left_top.php:54 +#: includes/include.tpl_new.php:41 includes/include.html_tpl_left_top.php:54 +#: includes/include.frontend.left_top.php:181 +#: includes/include.frontend.left_top.php:445 +#: includes/include.upl_left_top.php:53 includes/include.lay_new.php:40 +#: includes/include.lang_left_top.php:82 +#: includes/include.style_left_top.php:54 +msgid "No Client selected" +msgstr "" + +#: includes/include.mod_new.php:66 includes/include.frontend.left_top.php:193 +#: includes/include.rights_left_top.php:123 +#: includes/include.frontend.user_menu.php:114 +msgid "List options" +msgstr "" + +#: includes/include.mod_new.php:69 includes/include.mod_new.php:79 +#: includes/include.mod_new.php:99 +msgid "-- All --" +msgstr "" + +#: includes/include.mod_new.php:80 +msgid "Modulname" +msgstr "" + +#: includes/include.mod_new.php:83 includes/include.mod_edit_form.php:399 +#: includes/include.mod_edit_form.php:402 +msgid "Input" +msgstr "" + +#: includes/include.mod_new.php:84 includes/include.mod_edit_form.php:400 +#: includes/include.mod_edit_form.php:403 +msgid "Output" +msgstr "" + +#: includes/include.mod_new.php:100 +msgid "-- Without type --" +msgstr "" + +#: includes/include.mod_new.php:125 includes/include.frontend.left_top.php:249 +#: includes/include.rights_left_top.php:147 +msgid "Items / page" +msgstr "" + +#: includes/include.mod_new.php:129 includes/include.frontend.left_top.php:253 +#: includes/include.rights_left_top.php:151 +msgid "Sort by" +msgstr "" + +#: includes/include.mod_new.php:137 +msgid "Type filter" +msgstr "" + +#: includes/include.mod_new.php:141 includes/include.frontend.left_top.php:265 +#: includes/include.upl_left_top.php:74 +#: includes/include.rights_left_top.php:159 +msgid "Search for" +msgstr "" + +#: includes/include.mod_new.php:144 includes/include.frontend.left_top.php:269 +msgid "Search in" +msgstr "" + +#: includes/include.mod_new.php:149 includes/include.frontend.left_top.php:274 +#: includes/include.rights_left_top.php:164 +msgid "Apply" +msgstr "" + +#: includes/functions.lang.php:119 +msgid "" +"Could not set the language-ID in the file 'config.php'. Please set the " +"language manually." +msgstr "" + +#: includes/functions.lang.php:591 +msgid "Could not delete language" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:43 +msgid "Edit Reminder item" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:77 +msgid "E-Mail notification" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:132 +#: includes/include.mycontenido.tasks.php:276 +msgid "Priority" +msgstr "" + +#: includes/include.mycontenido.tasks.edit.php:140 +msgid "Progress" +msgstr "" + +#: includes/include.logs.php:64 +msgid "Submit query" +msgstr "" + +#: includes/include.logs.php:75 +msgid "All users" +msgstr "" + +#: includes/include.logs.php:77 +msgid "All actions" +msgstr "" + +#: includes/include.logs.php:199 +msgid "Unlimited" +msgstr "" + +#: includes/include.logs.php:200 includes/include.logs.php:201 +#: includes/include.logs.php:202 includes/include.logs.php:203 +#: includes/include.logs.php:204 +msgid "Entries" +msgstr "" + +#: includes/include.logs.php:275 +msgid "No results" +msgstr "" + +#: includes/include.lang_overview.php:77 +#, php-format +msgid "Do you really want to delete the language %s?" +msgstr "" + +#: includes/include.lang_overview.php:103 includes/include.lang_edit.php:84 +msgid "New language" +msgstr "" + +#: includes/include.lang_overview.php:118 +msgid "Language deleted" +msgstr "" + +#: includes/include.grouprights_overview.php:67 +msgid "Changes couldn't saved" +msgstr "" + +#: includes/include.grouprights_overview.php:112 +msgid "Groupname" +msgstr "" + +#: includes/include.grouprights_overview.php:129 +#: includes/include.grouprights_create.php:123 +#: includes/include.rights_overview.php:271 +#: includes/include.rights_create.php:215 +msgid "System administrator" +msgstr "" + +#: includes/include.grouprights_overview.php:147 +#: includes/include.grouprights_create.php:141 +#: includes/include.rights_overview.php:289 +#: includes/include.rights_create.php:233 +msgid "Administrator" +msgstr "" + +#: includes/include.grouprights_overview.php:163 +#: includes/include.grouprights_create.php:156 +#: includes/include.rights_overview.php:305 +#: includes/include.rights_create.php:248 +msgid "Access clients" +msgstr "" + +#: includes/include.grouprights_overview.php:180 +#: includes/include.grouprights_create.php:172 +#: includes/include.rights_overview.php:322 +#: includes/include.rights_create.php:263 +msgid "Access languages" +msgstr "" + +#: includes/include.grouprights_overview.php:208 +#: includes/include.rights_overview.php:352 +msgid "Area/Type" +msgstr "" + +#: includes/include.grouprights_overview.php:222 +#: includes/include.rights_overview.php:366 +msgid "User-defined properties" +msgstr "" + +#: includes/include.mod_translate.php:138 +#, php-format +msgid "Translate module '%s'" +msgstr "" + +#: includes/include.mod_translate.php:147 +msgid "Translated Name" +msgstr "" + +#: includes/include.mod_translate.php:157 +msgid "Original module string" +msgstr "" + +#: includes/include.mod_translate.php:157 +#, php-format +msgid "Translation for %s" +msgstr "" + +#: includes/include.mod_translate.php:165 +msgid "" +"Hint: Hit ALT+SHIFT+S to save the translated entry and advance to the next " +"string." +msgstr "" + +#: includes/include.mod_translate.php:166 +msgid "String list" +msgstr "" + +#: includes/include.grouprights_menu.php:178 +#, php-format +msgid "Do you really want to delete the group %s?" +msgstr "" + +#: includes/include.grouprights_menu.php:197 +#, php-format +msgid "Do you really want to delete the following group:

    %s
    " +msgstr "" + +#: includes/grouprights_mod.inc.php:73 includes/rights_mod.inc.php:75 +msgid "Module name" +msgstr "" + +#: includes/include.style_history.php:62 includes/include.js_history.php:60 +#: includes/include.lay_history.php:51 +#: includes/include.html_tpl_history.php:64 +#: includes/include.mod_history.php:57 +msgid "Versioning is not activated" +msgstr "" + +#: includes/include.style_history.php:126 +msgid "Edit Style" +msgstr "" + +#: includes/include.style_history.php:163 includes/include.js_history.php:158 +#: includes/include.lay_history.php:123 +#: includes/include.html_tpl_history.php:166 +#: includes/include.mod_history.php:135 +msgid "Copy to current" +msgstr "" + +#: includes/include.style_history.php:176 +#: includes/include.style_history.php:184 includes/include.js_history.php:179 +msgid "No style history available" +msgstr "" + +#: includes/include.style_history.php:182 includes/include.js_history.php:177 +#: includes/include.lay_history.php:135 +#: includes/include.html_tpl_history.php:185 +#: includes/include.mod_history.php:150 +msgid "Version history was cleared" +msgstr "" + +#: includes/include.CMS_HTMLHEAD.php:100 includes/include.CMS_HTML.php:98 +msgid "Save without leaving the editor" +msgstr "" + +#: includes/include.CMS_HTMLHEAD.php:101 includes/include.CMS_HTML.php:99 +msgid "Save and close editor" +msgstr "" + +#: includes/include.CMS_LINK.php:142 includes/include.CMS_SIMPLELINK.php:139 +#, php-format +msgid "Edit link for container %s" +msgstr "" + +#: includes/include.CMS_LINK.php:153 +msgid "External link" +msgstr "" + +#: includes/include.CMS_LINK.php:210 +msgid "Internal link" +msgstr "" + +#: includes/include.CMS_LINK.php:240 +msgid "Link to a document" +msgstr "" + +#: includes/include.CMS_LINK.php:270 +msgid "Link to an image" +msgstr "" + +#: includes/include.CMS_LINK.php:285 +msgid "Link to an archive" +msgstr "" + +#: includes/include.CMS_LINK.php:300 +msgid "Link to a media file" +msgstr "" + +#: includes/include.CMS_LINK.php:316 +msgid "Link to any file" +msgstr "" + +#: includes/include.CMS_LINK.php:340 +msgid "Upload file" +msgstr "" + +#: includes/include.CMS_LINK.php:345 +msgid "Target frame" +msgstr "" + +#: includes/include.CMS_LINK.php:353 +msgid "Open link in new window" +msgstr "" + +#: includes/include.CMS_LINK.php:375 +msgid "Open in new window" +msgstr "" + +#: includes/include.grouprights_left_top.php:60 +#: includes/include.rights_left_top.php:77 +msgid "Frontend only" +msgstr "" + +#: includes/include.grouprights_left_top.php:61 +#: includes/include.rights_left_top.php:78 +msgid "Backend only" +msgstr "" + +#: includes/include.tpl_new.php:39 +msgid "New template" +msgstr "" + +#: includes/include.frontend.group_edit.php:56 +msgid "-- new group --" +msgstr "" + +#: includes/include.frontend.group_edit.php:121 +msgid "Could not set new group name: Group already exists" +msgstr "" + +#: includes/include.frontend.group_edit.php:221 +#: includes/include.grouprights_create.php:102 +msgid "Group name" +msgstr "" + +#: includes/include.frontend.group_edit.php:227 +msgid "Default group" +msgstr "" + +#: includes/include.js_history.php:125 +#: includes/include.html_tpl_history.php:129 +msgid "Edit JScript" +msgstr "" + +#: includes/include.js_history.php:171 +msgid "No jscript history available" +msgstr "" + +#: includes/include.html_tpl_left_top.php:50 +msgid "Create module template" +msgstr "" + +#: includes/grouprights.inc.php:215 +msgid "Current group doesn't have any rights to any client/language." +msgstr "" + +#: includes/include.lay_preview.php:39 includes/include.tpl_visualedit.php:83 +msgid "No such layout" +msgstr "" + +#: includes/include.con_edit_form.php:253 +msgid "Articlelink" +msgstr "" + +#: includes/include.con_edit_form.php:260 +msgid "Select an entry to display link" +msgstr "" + +#: includes/include.con_edit_form.php:261 +msgid "Article only" +msgstr "" + +#: includes/include.con_edit_form.php:262 +msgid "Article with Category" +msgstr "" + +#: includes/include.con_edit_form.php:263 +msgid "Article with Category and Language" +msgstr "" + +#: includes/include.con_edit_form.php:264 +msgid "Article with Language" +msgstr "" + +#: includes/include.con_edit_form.php:278 +msgid "Author (Creator)" +msgstr "" + +#: includes/include.con_edit_form.php:288 +msgid "Author (Modifier)" +msgstr "" + +#: includes/include.con_edit_form.php:289 +msgid "Last modified" +msgstr "" + +#: includes/include.con_edit_form.php:293 +msgid "Publishing date" +msgstr "" + +#: includes/include.con_edit_form.php:300 +msgid "Publisher" +msgstr "" + +#: includes/include.con_edit_form.php:308 +msgid "Redirect" +msgstr "" + +#: includes/include.con_edit_form.php:324 +msgid "New Window" +msgstr "" + +#: includes/include.con_edit_form.php:393 +msgid "Remove multiple category assignments" +msgstr "" + +#: includes/include.con_edit_form.php:394 +msgid "" +"Do you really want to remove the assignments to all categories except the " +"current one?" +msgstr "" + +#: includes/include.con_edit_form.php:410 +msgid "" +"Language parts of the articles are existing in other languages and are " +"online. To change the category assignment, please set the other articles " +"offline first." +msgstr "" + +#: includes/include.con_edit_form.php:549 +msgid "Choose Startdate" +msgstr "" + +#: includes/include.con_edit_form.php:550 +msgid "Choose Enddate" +msgstr "" + +#: includes/include.con_edit_form.php:648 +msgid "Select date" +msgstr "" + +#: includes/include.con_edit_form.php:685 +msgid "Summary" +msgstr "" + +#: includes/include.stat_menu.php:37 +msgid "Current Report" +msgstr "" + +#: includes/include.stat_menu.php:45 +msgid "Statistics Overview" +msgstr "" + +#: includes/include.stat_menu.php:56 +msgid "Archived Statistics" +msgstr "" + +#: includes/grouprights_members.inc.php:208 +msgid "Manage group members" +msgstr "" + +#: includes/include.CMS_EASYIMG.php:146 includes/include.CMS_IMG.php:186 +#, php-format +msgid "Edit image for container %s" +msgstr "" + +#: includes/include.CMS_EASYIMG.php:153 +msgid "Upload image" +msgstr "" + +#: includes/functions.tpl.php:433 includes/functions.con.php:1837 +#: includes/functions.str.php:1387 +#, php-format +msgid "%s (Copy)" +msgstr "" + +#: includes/include.frontend.user_edit.php:50 +#: includes/include.frontend.user_edit.php:74 +#: includes/include.frontend.user_edit.php:111 +msgid "-- new user --" +msgstr "" + +#: includes/include.frontend.user_edit.php:114 +msgid "Username empty or not set! Please choose one." +msgstr "" + +#: includes/include.frontend.user_edit.php:119 +msgid "Password not set right now!" +msgstr "" + +#: includes/include.frontend.user_edit.php:125 +msgid "Could not set new username: Username already exists" +msgstr "" + +#: includes/include.frontend.user_edit.php:132 +msgid "Could not set new password: Passwords don't match" +msgstr "" + +#: includes/include.frontend.user_edit.php:189 +#: includes/include.rights_left_top.php:115 +msgid "User name" +msgstr "" + +#: includes/include.frontend.user_edit.php:191 +msgid "New password (again)" +msgstr "" + +#: includes/include.frontend.user_edit.php:192 +#: includes/include.lang_edit.php:245 +msgid "Active" +msgstr "" + +#: includes/include.frontend.user_edit.php:219 +msgid "WARNING" +msgstr "" + +#: includes/include.frontend.user_edit.php:219 +#, php-format +msgid "" +"The plugin %s delivered an array for the displayed titles, but did not " +"return an array for the contents." +msgstr "" + +#: includes/include.frontend.user_edit.php:244 +#: includes/include.rights_overview.php:458 +msgid "Group membership" +msgstr "" + +#: includes/functions.system.php:55 +msgid "Can't clear install error log : Access is denied!" +msgstr "" + +#: includes/functions.system.php:60 +msgid "error log successfully cleared" +msgstr "" + +#: includes/functions.system.php:278 +msgid "Contenido version" +msgstr "" + +#: includes/functions.system.php:281 +msgid "Contenido path" +msgstr "" + +#: includes/functions.system.php:283 +msgid "Contenido HTML path" +msgstr "" + +#: includes/functions.system.php:285 +msgid "Contenido full HTML path" +msgstr "" + +#: includes/functions.system.php:287 +msgid "Contenido frontend path" +msgstr "" + +#: includes/functions.system.php:289 +msgid "Contenido PHPLIB path" +msgstr "" + +#: includes/functions.system.php:291 +msgid "Contenido wysiwyg path" +msgstr "" + +#: includes/functions.system.php:293 +msgid "Contenido wysiwyg HTML path" +msgstr "" + +#: includes/functions.system.php:296 +msgid "Host name" +msgstr "" + +#: includes/functions.system.php:299 +msgid "Browser path" +msgstr "" + +#: includes/functions.system.php:321 +msgid "client settings" +msgstr "" + +#: includes/functions.system.php:322 +msgid "values" +msgstr "" + +#: includes/functions.system.php:353 +msgid "language(s)" +msgstr "" + +#: includes/functions.system.php:362 +msgid "htmlpath" +msgstr "" + +#: includes/functions.system.php:366 +msgid "frontendpath" +msgstr "" + +#: includes/functions.system.php:378 +msgid "No permissions!" +msgstr "" + +#: includes/functions.system.php:384 +msgid "Number of installed clients: " +msgstr "" + +#: includes/functions.system.php:387 +msgid "Client informations" +msgstr "" + +#: includes/functions.system.php:394 +msgid "Number of users" +msgstr "" + +#: includes/functions.system.php:401 includes/include.stat_overview.php:91 +msgid "Number of articles" +msgstr "" + +#: includes/functions.system.php:404 +msgid "Server operating system" +msgstr "" + +#: includes/functions.system.php:408 +msgid "PHP database extension" +msgstr "" + +#: includes/functions.system.php:410 +msgid "Database server version" +msgstr "" + +#: includes/functions.system.php:413 +msgid "Installed PHP version" +msgstr "" + +#: includes/functions.system.php:418 includes/functions.system.php:422 +#: includes/functions.system.php:426 includes/functions.system.php:447 +msgid "activated" +msgstr "" + +#: includes/functions.system.php:418 includes/functions.system.php:422 +#: includes/functions.system.php:426 includes/functions.system.php:447 +msgid "deactivated" +msgstr "" + +#: includes/functions.system.php:439 +msgid "nothing disabled" +msgstr "" + +#: includes/functions.system.php:440 +msgid "Disabled functions" +msgstr "" + +#: includes/functions.system.php:443 +msgid "loaded" +msgstr "" + +#: includes/functions.system.php:443 +msgid "not loaded" +msgstr "" + +#: includes/functions.system.php:444 +msgid "Gettext extension" +msgstr "" + +#: includes/functions.system.php:455 includes/main.login.php:186 +msgid "Settings" +msgstr "" + +#: includes/functions.system.php:456 +msgid "Values" +msgstr "" + +#: includes/functions.system.php:473 +msgid "GD library" +msgstr "" + +#: includes/functions.system.php:636 +msgid "an error occured while sending your bug report! Please try again" +msgstr "" + +#: includes/functions.system.php:639 +msgid "bug report forwarded" +msgstr "" + +#: includes/functions.system.php:645 +msgid "please fill out all mandatory fields" +msgstr "" + +#: includes/functions.system.php:649 +msgid "please enter a valid E-Mail adress" +msgstr "" + +#: includes/functions.system.php:653 +msgid "you must agree the declaration of consent" +msgstr "" + +#: includes/rights_con.inc.php:223 includes/grouprights_str.inc.php:212 +#: includes/rights_str.inc.php:217 includes/grouprights_con.inc.php:237 +msgid "" +"Apply rights for this category to all categories on the same level or above" +msgstr "" + +#: includes/rights_con.inc.php:224 includes/grouprights_str.inc.php:213 +#: includes/rights_str.inc.php:218 includes/grouprights_con.inc.php:238 +msgid "" +"Apply rights for this category to all categories below the current category" +msgstr "" + +#: includes/rights_con.inc.php:227 includes/grouprights_str.inc.php:215 +#: includes/include.str_overview.php:169 includes/rights_str.inc.php:221 +#: includes/include.upl_dirs_overview.php:56 +#: includes/grouprights_con.inc.php:241 includes/functions.stat.php:313 +#: includes/functions.stat.php:314 includes/functions.stat.php:644 +#: includes/functions.stat.php:645 +msgid "Open category" +msgstr "" + +#: includes/rights_con.inc.php:227 includes/grouprights_str.inc.php:215 +#: includes/include.str_overview.php:174 includes/rights_str.inc.php:221 +#: includes/include.upl_dirs_overview.php:60 +#: includes/grouprights_con.inc.php:241 +msgid "Close category" +msgstr "" + +#: includes/include.frontend.left_top.php:58 +#: includes/include.frontend.user_menu.php:53 +msgid "-- All fields --" +msgstr "" + +#: includes/include.frontend.left_top.php:58 +#: includes/include.frontend.left_top.php:59 +#: includes/include.rights_overview.php:203 +#: includes/include.frontend.user_menu.php:53 +#: includes/include.frontend.user_menu.php:54 +#: includes/include.rights_create.php:150 +msgid "Username" +msgstr "" + +#: includes/include.frontend.left_top.php:141 +msgid "Frontend users" +msgstr "" + +#: includes/include.frontend.left_top.php:148 +msgid "Frontend groups" +msgstr "" + +#: includes/include.frontend.left_top.php:228 +#: includes/include.frontend.user_menu.php:139 +msgid "-- All Groups --" +msgstr "" + +#: includes/include.frontend.left_top.php:261 +msgid "Show group" +msgstr "" + +#: includes/include.frontend.left_top.php:395 +#: includes/include.rights_menu.php:133 +#: includes/include.frontend.user_menu.php:273 +#, php-format +msgid "Do you really want to delete the user %s?" +msgstr "" + +#: includes/include.grouprights_create.php:57 +msgid "New Group" +msgstr "" + +#: includes/include.grouprights_create.php:71 +msgid "group created" +msgstr "" + +#: includes/include.grouprights_create.php:76 +msgid "Group couldn't created" +msgstr "" + +#: includes/include.note.popup.php:63 +msgid "Add note" +msgstr "" + +#: includes/include.note.popup.php:75 +msgid "No category" +msgstr "" + +#: includes/include.note.popup.php:92 +msgid "Note" +msgstr "" + +#: includes/include.lay_edit_form.php:46 +msgid "-- New Layout --" +msgstr "" + +#: includes/include.lay_edit_form.php:56 +msgid "Layout deleted" +msgstr "" + +#: includes/include.lay_edit_form.php:128 +#, php-format +msgid "Container %s was defined %s times" +msgstr "" + +#: includes/include.lay_edit_form.php:141 +msgid "" +"The body tag does not exist in the layout. This is a requirement for the in-" +"site editing." +msgstr "" + +#: includes/include.lay_edit_form.php:147 +msgid "" +"The head tag does not exist in the layout. This is a requirement for the in-" +"site editing." +msgstr "" + +#: includes/include.lay_edit_form.php:186 includes/include.lay_history.php:87 +msgid "Edit Layout" +msgstr "" + +#: includes/include.lay_edit_form.php:202 +msgid "On save, apply default modules to new containers" +msgstr "" + +#: includes/include.mycontenido.tasks.php:128 +msgid "No status type set" +msgstr "" + +#: includes/include.mycontenido.tasks.php:155 +#, php-format +msgid "%d %% complete" +msgstr "" + +#: includes/include.mycontenido.tasks.php:196 +msgid "Today" +msgstr "" + +#: includes/include.mycontenido.tasks.php:201 +#: includes/include.mycontenido.tasks.php:203 +msgid "Day(s)" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +msgid "End Date" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +#, php-format +msgid "%% complete" +msgstr "" + +#: includes/include.mycontenido.tasks.php:276 +msgid "Due in" +msgstr "" + +#: includes/include.mycontenido.tasks.php:302 +msgid "Unnamed item" +msgstr "" + +#: includes/include.mycontenido.tasks.php:307 +msgid "No end date set" +msgstr "" + +#: includes/include.mycontenido.tasks.php:314 +msgid "No status set" +msgstr "" + +#: includes/include.mycontenido.tasks.php:338 +msgid "Delete item" +msgstr "" + +#: includes/include.mycontenido.tasks.php:345 +msgid "Edit item" +msgstr "" + +#: includes/include.mycontenido.tasks.php:376 +msgid "Restrict display" +msgstr "" + +#: includes/include.mycontenido.tasks.php:386 +msgid "Hide done tasks" +msgstr "" + +#: includes/include.mycontenido.tasks.php:401 +msgid "No tasks found" +msgstr "" + +#: includes/functions.lay.php:66 +msgid "-- Unnamed Layout --" +msgstr "" + +#: includes/include.tpl_overview.php:96 includes/include.lay_overview.php:83 +#: includes/include.mod_overview.php:226 +msgid "Click for more information about usage" +msgstr "" + +#: includes/include.tpl_overview.php:100 +#, php-format +msgid "Do you really want to delete the following template:

    %s
    " +msgstr "" + +#: includes/include.tpl_overview.php:105 +msgid "Template in use, cannot delete" +msgstr "" + +#: includes/include.tpl_overview.php:128 +#, php-format +msgid "The template '%s' is used for following categories and articles" +msgstr "" + +#: includes/include.lay_overview.php:78 includes/include.mod_overview.php:239 +#: includes/include.str_overview.php:741 includes/include.mod_edit_form.php:51 +msgid "No permission" +msgstr "" + +#: includes/include.lay_overview.php:82 +msgid "Layout is in use, cannot delete" +msgstr "" + +#: includes/include.lay_overview.php:93 +#, php-format +msgid "Do you really want to delete the following layout:

    %s
    " +msgstr "" + +#: includes/include.lay_overview.php:118 +#, php-format +msgid "The layout '%s' is used for following templates" +msgstr "" + +#: includes/functions.con.php:331 includes/functions.con.php:518 +msgid "Default title" +msgstr "" + +#: includes/functions.upl.php:791 +msgid "OpenOffice.org Presentation" +msgstr "" + +#: includes/functions.upl.php:792 +msgid "OpenOffice.org Presentation Template" +msgstr "" + +#: includes/functions.upl.php:793 +msgid "Microsoft PowerPoint Screen Presentation" +msgstr "" + +#: includes/functions.upl.php:794 includes/functions.upl.php:796 +msgid "Microsoft PowerPoint Presentation Template" +msgstr "" + +#: includes/functions.upl.php:795 +msgid "KDE KPresenter Document" +msgstr "" + +#: includes/functions.upl.php:799 +msgid "Microsoft Word Document or regular text file" +msgstr "" + +#: includes/functions.upl.php:800 +msgid "Microsoft Word Template" +msgstr "" + +#: includes/functions.upl.php:801 +msgid "OpenOffice.org Text Document" +msgstr "" + +#: includes/functions.upl.php:802 +msgid "OpenOffice.org Text Document Template" +msgstr "" + +#: includes/functions.upl.php:803 +msgid "StarOffice 5.0 Text Document" +msgstr "" + +#: includes/functions.upl.php:804 +msgid "KDE KWord Document" +msgstr "" + +#: includes/functions.upl.php:807 +msgid "Microsoft Excel Worksheet" +msgstr "" + +#: includes/functions.upl.php:808 +msgid "OpenOffice.org Table" +msgstr "" + +#: includes/functions.upl.php:809 +msgid "OpenOffice.org Table Template" +msgstr "" + +#: includes/functions.upl.php:810 +msgid "Microsoft Excel File" +msgstr "" + +#: includes/functions.upl.php:811 +msgid "Microsoft Excel Template" +msgstr "" + +#: includes/functions.upl.php:812 +msgid "Comma Seperated Value File" +msgstr "" + +#: includes/functions.upl.php:813 +msgid "KDE KSpread Document" +msgstr "" + +#: includes/functions.upl.php:814 +msgid "StarOffice 5.0 Table" +msgstr "" + +#: includes/functions.upl.php:817 +msgid "Plain Text" +msgstr "" + +#: includes/functions.upl.php:818 +msgid "Rich Text Format" +msgstr "" + +#: includes/functions.upl.php:821 +msgid "GIF Image" +msgstr "" + +#: includes/functions.upl.php:822 +msgid "PNG Image" +msgstr "" + +#: includes/functions.upl.php:823 includes/functions.upl.php:824 +msgid "JPEG Image" +msgstr "" + +#: includes/functions.upl.php:825 +msgid "TIFF Image" +msgstr "" + +#: includes/functions.upl.php:826 +msgid "Adobe Photoshop Image" +msgstr "" + +#: includes/functions.upl.php:829 includes/functions.upl.php:830 +msgid "Hypertext Markup Language Document" +msgstr "" + +#: includes/functions.upl.php:831 +msgid "Cascading Style Sheets" +msgstr "" + +#: includes/functions.upl.php:834 +msgid "LHA Archive" +msgstr "" + +#: includes/functions.upl.php:835 +msgid "RAR Archive" +msgstr "" + +#: includes/functions.upl.php:836 +msgid "ARJ Archive" +msgstr "" + +#: includes/functions.upl.php:837 +msgid "bz2-compressed File" +msgstr "" + +#: includes/functions.upl.php:838 +msgid "bzip-compressed File" +msgstr "" + +#: includes/functions.upl.php:839 +msgid "ZIP Archive" +msgstr "" + +#: includes/functions.upl.php:840 +msgid "TAR Archive" +msgstr "" + +#: includes/functions.upl.php:841 +msgid "GZ Compressed File" +msgstr "" + +#: includes/functions.upl.php:844 +msgid "C Program Code" +msgstr "" + +#: includes/functions.upl.php:847 +msgid "C++ Program Code" +msgstr "" + +#: includes/functions.upl.php:849 +msgid "C or C++ Program Header" +msgstr "" + +#: includes/functions.upl.php:852 +msgid "PHP Program Code" +msgstr "" + +#: includes/functions.upl.php:853 +msgid "PHP Source File" +msgstr "" + +#: includes/functions.upl.php:855 +msgid "Adobe Acrobat Portable Document" +msgstr "" + +#: includes/functions.upl.php:858 +msgid "QuickTime Movie" +msgstr "" + +#: includes/functions.upl.php:859 +msgid "avi Movie" +msgstr "" + +#: includes/functions.upl.php:861 +msgid "MPEG Movie" +msgstr "" + +#: includes/functions.upl.php:862 +msgid "Windows Media Video" +msgstr "" + +#: includes/functions.upl.php:864 +msgid "-File" +msgstr "" + +#: includes/include.upl_left_top.php:112 +msgid "Create directory in" +msgstr "" + +#: includes/functions.file.php:206 +msgid "Please insert filename." +msgstr "" + +#: includes/functions.file.php:218 +#, php-format +msgid "Could not open file %s" +msgstr "" + +#: includes/functions.file.php:223 +#, php-format +msgid "Could not write file %s" +msgstr "" + +#: includes/functions.file.php:234 includes/functions.file.php:338 +#, php-format +msgid "%s is not writable" +msgstr "" + +#: includes/functions.file.php:255 +#, php-format +msgid "Can not open file%s " +msgstr "" + +#: includes/functions.file.php:304 +msgid "Unable to change file access permission." +msgstr "" + +#: includes/functions.file.php:308 +#, php-format +msgid "Unable to create file %s" +msgstr "" + +#: includes/functions.file.php:334 +#, php-format +msgid "Can not rename file %s" +msgstr "" + +#: includes/functions.file.php:361 +msgid "Wrong filename." +msgstr "" + +#: includes/include.mod_overview.php:228 +msgid "Module in use, cannot delete" +msgstr "" + +#: includes/include.mod_overview.php:235 +#, php-format +msgid "Do you really want to delete the following module:

    %s
    " +msgstr "" + +#: includes/include.mod_overview.php:302 +#, php-format +msgid "The module '%s' is used for following templates" +msgstr "" + +#: includes/include.frontend.group_rights.php:47 +msgid "Invalid plugin" +msgstr "" + +#: includes/include.frontend.group_rights.php:96 +#, php-format +msgid "Permissions for plugin '%s'" +msgstr "" + +#: includes/include.frontend.group_rights.php:101 +msgid "(All)" +msgstr "" + +#: includes/include.frontend.group_rights.php:109 +msgid "Global rights" +msgstr "" + +#: includes/include.frontend.group_rights.php:131 +msgid "No items found" +msgstr "" + +#: includes/include.str_overview.php:511 +#, php-format +msgid "" +"Do you really want to duplicate the following category:

    %s

    Notice: The duplicate process can take up to several minutes, " +"depending on how many subitems and articles you've got." +msgstr "" + +#: includes/include.str_overview.php:513 +#, php-format +msgid "Do you really want to delete the following category:

    %s" +msgstr "" + +#: includes/include.str_overview.php:920 +msgid "Create new category" +msgstr "" + +#: includes/include.str_overview.php:993 +#, php-format +msgid "Cancel moving %s" +msgstr "" + +#: includes/include.tpl_edit_form.php:44 +msgid "- New Template -" +msgstr "" + +#: includes/include.tpl_edit_form.php:159 +#: includes/include.tpl_edit_form.php:237 +msgid "Default" +msgstr "" + +#: includes/include.upl_files_upload.php:51 +msgid "Upload" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:79 +#, php-format +msgid "Category Template configuration is in use by %s (%s)" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:362 +msgid "Module in container" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:492 +msgid "Categorytemplate configuration" +msgstr "" + +#: includes/include.tplcfg_edit_form.php:495 +msgid "Articletemplate configuration" +msgstr "" + +#: includes/include.lay_history.php:137 +msgid "No layout history available" +msgstr "" + +#: includes/functions.general.php:175 +msgid "Saterday" +msgstr "" + +#: includes/functions.general.php:2183 +#, php-format +msgid "MySQL Database not reachable for installation %s" +msgstr "" + +#: includes/functions.general.php:2186 +#, php-format +msgid "" +"The MySQL Database for the installation %s is not reachable. Please check if " +"this is a temporary problem or if it is a real fault." +msgstr "" + +#: includes/include.info.php:38 +msgid "" +"You can find a lot of information and a community forum on the ConLite Portal" +msgstr "" + +#: includes/include.mycontenido_lastarticles.php:293 +msgid "No article found" +msgstr "" + +#: includes/include.upl_artlist.php:66 +msgid "Use this category" +msgstr "" + +#: includes/include.upl_artlist.php:81 +msgid "Sort Order" +msgstr "" + +#: includes/include.upl_artlist.php:81 +msgid "Online" +msgstr "" + +#: includes/include.CMS_IMG.php:275 +msgid "Directory / File" +msgstr "" + +#: includes/include.rights_overview.php:75 +msgid "User deleted" +msgstr "" + +#: includes/include.rights_overview.php:144 +#: includes/include.rights_overview.php:149 +msgid "An error occured while saving user info." +msgstr "" + +#: includes/include.rights_overview.php:236 +#: includes/include.rights_create.php:180 +msgid "Phone number" +msgstr "" + +#: includes/include.rights_overview.php:242 +#: includes/include.rights_create.php:186 +msgid "Street" +msgstr "" + +#: includes/include.rights_overview.php:248 +#: includes/include.rights_create.php:192 +msgid "ZIP code" +msgstr "" + +#: includes/include.rights_overview.php:254 +#: includes/include.rights_create.php:198 +msgid "City" +msgstr "" + +#: includes/include.rights_overview.php:260 +#: includes/include.rights_create.php:204 includes/include.lang_edit.php:250 +msgid "Country" +msgstr "" + +#: includes/include.rights_overview.php:373 +#: includes/include.rights_create.php:269 +msgid "Use WYSIWYG-Editor" +msgstr "" + +#: includes/include.rights_overview.php:398 +#: includes/include.rights_create.php:290 +msgid "Valid from" +msgstr "" + +#: includes/include.rights_overview.php:418 +#: includes/include.rights_create.php:307 +msgid "Valid to" +msgstr "" + +#: includes/include.rights_overview.php:436 +msgid "This account is currently inactive." +msgstr "" + +#: includes/include.rights_overview.php:439 +msgid "This account is currently active." +msgstr "" + +#: includes/include.stat_overview.php:47 includes/include.stat_overview.php:60 +msgid "Full statistics" +msgstr "" + +#: includes/include.stat_overview.php:50 includes/functions.stat.php:989 +#: includes/functions.stat.php:1015 +msgid "Top 10" +msgstr "" + +#: includes/include.stat_overview.php:53 includes/functions.stat.php:990 +#: includes/functions.stat.php:1016 +msgid "Top 20" +msgstr "" + +#: includes/include.stat_overview.php:56 includes/functions.stat.php:991 +#: includes/functions.stat.php:1017 +msgid "Top 30" +msgstr "" + +#: includes/include.stat_overview.php:76 +msgid "Yearly" +msgstr "" + +#: includes/include.stat_overview.php:80 +msgid "Current" +msgstr "" + +#: includes/include.stat_overview.php:94 +msgid "Hits in this language" +msgstr "" + +#: includes/include.upl_dirs_overview.php:153 +msgid "Failed to delete the following files:" +msgstr "" + +#: includes/include.upl_dirs_overview.php:159 +#, php-format +msgid "Failed to remove directory %s" +msgstr "" + +#: includes/include.upl_dirs_overview.php:172 +msgid "Upload directory" +msgstr "" + +#: includes/include.upl_dirs_overview.php:175 +msgid "" +"The following directories contains invalid characters and were ignored: " +msgstr "" + +#: includes/include.upl_dirs_overview.php:178 +msgid "Please click here in order to rename automatically." +msgstr "" + +#: includes/include.upl_dirs_overview.php:300 +msgid "Categories" +msgstr "" + +#: includes/include.upl_dirs_overview.php:381 +#: includes/include.upl_dirs_overview.php:528 +msgid "Delete directory" +msgstr "" + +#: includes/include.upl_dirs_overview.php:381 +#: includes/include.upl_dirs_overview.php:528 +msgid "Do you really want to delete the following directory:" +msgstr "" + +#: includes/include.upl_dirs_overview.php:386 +#: includes/include.upl_dirs_overview.php:533 +msgid "Directory contains files" +msgstr "" + +#: includes/include.upl_dirs_overview.php:435 +msgid "Database Filesystem" +msgstr "" + +#: includes/main.login.php:67 +msgid "No Login Information available." +msgstr "" + +#: includes/main.login.php:72 +msgid "" +"You're logged in with a temporary password. Please change your password." +msgstr "" + +#: includes/main.login.php:80 +msgid "Welcome" +msgstr "" + +#: includes/main.login.php:81 +msgid "Last login" +msgstr "" + +#: includes/main.login.php:101 includes/main.login.php:138 +#, php-format +msgid "Client %s (%s) has no languages" +msgstr "" + +#: includes/main.login.php:121 +msgid "Change client" +msgstr "" + +#: includes/main.login.php:126 +msgid "No clients available!" +msgstr "" + +#: includes/main.login.php:178 +#, php-format +msgid "Reminder list: %d Task open" +msgstr "" + +#: includes/main.login.php:180 +#, php-format +msgid "Reminder list: %d Tasks open" +msgstr "" + +#: includes/main.login.php:211 +msgid "Symbol help" +msgstr "" + +#: includes/main.login.php:214 +msgid "Contenido Manual" +msgstr "" + +#: includes/include.lay_new.php:38 +msgid "New Layout" +msgstr "" + +#: includes/functions.stat.php:44 +msgid "Info about article" +msgstr "" + +#: includes/functions.stat.php:46 +msgid "Info about directory" +msgstr "" + +#: includes/functions.stat.php:285 +msgid "Category is online" +msgstr "" + +#: includes/functions.stat.php:287 +msgid "Category is offline" +msgstr "" + +#: includes/functions.stat.php:478 +msgid "Sum" +msgstr "" + +#: includes/include.rights_create.php:53 +msgid "Username can't be empty" +msgstr "" + +#: includes/include.rights_create.php:85 +msgid "User created" +msgstr "" + +#: includes/include.rights_create.php:106 +msgid "Username already exists" +msgstr "" + +#: includes/include.rights_create.php:110 +msgid "Unknown error" +msgstr "" + +#: includes/include.lang_edit.php:228 +msgid "Left to right" +msgstr "" + +#: includes/include.lang_edit.php:228 +msgid "Right to left" +msgstr "" + +#: includes/include.lang_edit.php:244 +msgid "Language name" +msgstr "" + +#: includes/include.lang_edit.php:248 +msgid "Encoding" +msgstr "" + +#: includes/include.lang_edit.php:251 +msgid "Text direction" +msgstr "" + +#: includes/include.html_tpl_history.php:179 +#: includes/include.html_tpl_history.php:187 +msgid "No template history available" +msgstr "" + +#: includes/include.system_db_backup.php:36 +msgid "Backupfolder missing or not writable!" +msgstr "" + +#: includes/include.system_db_backup.php:43 +msgid "Start your Backup!" +msgstr "" + +#: includes/include.system_db_backup.php:77 +msgid "Permission denied!" +msgstr "" + +#: includes/include.system_db_backup.php:87 +msgid "Starting Backup." +msgstr "" + +#: includes/include.system_db_backup.php:196 +msgid "Backup in Progress!" +msgstr "" + +#: includes/include.system_db_backup.php:203 +#: includes/include.system_db_backup.php:229 +msgid "Tables saved: " +msgstr "" + +#: includes/include.system_db_backup.php:203 +msgid "Last processed: " +msgstr "" + +#: includes/include.system_db_backup.php:204 +#: includes/include.system_db_backup.php:229 +msgid "Pageviews: " +msgstr "" + +#: includes/include.system_db_backup.php:228 +msgid "Backup done!" +msgstr "" + +#: includes/include.system_db_backup.php:233 +msgid "Go Back to Overview" +msgstr "" + +#: includes/include.system_db_backup.php:268 +msgid "File successfully deleted." +msgstr "" + +#: includes/include.system_db_backup.php:283 +msgid "Download File" +msgstr "" + +#: includes/include.mod_edit_form.php:57 +msgid "" +msgstr "" + +#: includes/include.mod_edit_form.php:57 +msgid "Author: " +msgstr "" + +#: includes/include.mod_edit_form.php:57 +msgid "Version:" +msgstr "" + +#: includes/include.mod_edit_form.php:304 +#: includes/include.mod_edit_form.php:306 +msgid "Custom" +msgstr "" + +#: includes/include.mod_edit_form.php:332 +#: includes/include.mod_edit_form.php:342 +#, php-format +msgid "Error in module. Error location: %s" +msgstr "" + +#: includes/include.mod_edit_form.php:335 +#: includes/include.mod_edit_form.php:345 +msgid "Module successfully compiled" +msgstr "" + +#: includes/include.mod_edit_form.php:410 +msgid "" +"This module uses variables and/or functions which are probably not available " +"in this Contenido version. Please make sure that you use up-to-date modules." +msgstr "" + +#: includes/include.systemsettings.php:47 +msgid "Please set this property in systemsettings directly" +msgstr "" + +#: includes/include.systemsettings.php:157 +#: includes/include.clientsettings.php:172 +msgid "No defined properties" +msgstr "" + +#: includes/include.systemsettings.php:167 +#: includes/include.clientsettings.php:181 +msgid "Add new variable" +msgstr "" + +#: includes/include.clientsettings.php:50 +msgid "Select range" +msgstr "" + +#: includes/include.clientsettings.php:53 +msgid "Language independent" +msgstr "" + +#: includes/include.clientsettings.php:79 +msgid "Range" +msgstr "" + +#: includes/functions.mod.php:200 +msgid "Please do not use short open Tags. (Use %s" +msgstr "" + +#: includes/include.style_left_top.php:50 +msgid "Create style" +msgstr "" + +#: includes/include.pretplcfg_edit_form.php:101 +#, php-format +msgid "Module in Container %s" +msgstr "" + +#: includes/include.pretplcfg_edit_form.php:150 +msgid "Template preconfiguration" +msgstr "" + +#: main.loginform.php:76 +msgid "" +"The setup directory still exists. Please remove the setup directory before " +"you continue." +msgstr "" + +#: main.loginform.php:93 +msgid "" +"The sysadmin and/or the admin account still contains a well-known default " +"password. Please change immediately after login." +msgstr "" + +#: main.loginform.php:97 +msgid "" +"Contenido is in maintenance mode. Only sysadmins are allowed to login. " +"Please try again later." +msgstr "" + +#: main.loginform.php:195 +msgid "ConLite Backend" +msgstr "" + +#: main.loginform.php:204 +msgid "Invalid Login or Password!" +msgstr "" + +#: main.loginform.php:211 +msgid "Password" +msgstr "" diff --git a/conlite/locale/potfiles.txt b/conlite/locale/potfiles.txt new file mode 100644 index 0000000..aa6c315 --- /dev/null +++ b/conlite/locale/potfiles.txt @@ -0,0 +1,585 @@ +./main.php +./tools/phpcompatinfo.php +./tools/mpAutoloaderClassMap/mpClassTypeFinder.php +./tools/mpAutoloaderClassMap/mpClassMapFileCreator.php +./tools/mpAutoloaderClassMap/mpClassMapFileCreatorContenido.php +./tools/create_autoloader_cfg.php +./includes/include.system_configuration.php +./includes/functions.con2.php +./includes/include.left_top_blank.php +./includes/include.lang_edit.php +./includes/include.CMS_SIMPLELINK.php +./includes/functions.upl.php +./includes/include.frontend.user_edit.php +./includes/include.lay_preview.php +./includes/rights.inc.php +./includes/include.grouprights_menu.php +./includes/functions.api.category.php +./includes/include.upl_left_top.php +./includes/include.mod_sync.php +./includes/include.tpl_visualedit.php +./includes/include.logs.php +./includes/include.frontend.group_rights.php +./includes/include.style_files_overview.php +./includes/include.CMS_IMG.php +./includes/include.tpl_new.php +./includes/functions.stat.php +./includes/include.upl_files_overview.php +./includes/include.tplcfg_edit.php +./includes/grouprights_lay.inc.php +./includes/include.grouprights_left_top.php +./includes/include.blank.php +./includes/functions.api.string.php +./includes/include.tpl_edit_form.php +./includes/include.js_edit_form.php +./includes/include.CMS_HEAD.php +./includes/functions.api.images.php +./includes/functions.api.php +./includes/include.CMS_LINK.php +./includes/include.tpl_overview.php +./includes/functions.system.php +./includes/include.stat_left_top.php +./includes/include.grouprights_create.php +./includes/include.html_tpl_history.php +./includes/include.default_subnav.php +./includes/include.client_left_top.php +./includes/rights_lay.inc.php +./includes/include.todo.popup.php +./includes/include.lay_new.php +./includes/functions.general.php +./includes/rights_mod.inc.php +./includes/include.CMS_HTMLTEXT.php +./includes/index.php +./includes/include.client_artspec.php +./includes/include.mycontenido.tasks.php +./includes/include.systemsettings.php +./includes/include.con_edit_form.php +./includes/include.CMS_EASYIMG.php +./includes/grouprights_str.inc.php +./includes/include.upl_dirs_overview.php +./includes/include.pretplcfg_edit.php +./includes/api/functions.frontend.list.php +./includes/api/functions.api.general.php +./includes/include.tplcfg_edit_form.php +./includes/include.rights_menu.php +./includes/include.mod_translate_stringlist.php +./includes/include.CMS_SWF.php +./includes/include.info.php +./includes/include.CMS_HTMLHEAD.php +./includes/functions.tpl.php +./includes/include.con_left_top.php +./includes/include.con_art_overview.php +./includes/include.frontend.user_menu.php +./includes/include.rights_external.php +./includes/include.mycontenido.tasks.edit.php +./includes/grouprights_tpl.inc.php +./includes/include.grouprights_subnav.php +./includes/rights_con.inc.php +./includes/functions.forms.php +./includes/include.upl_search_results.php +./includes/include.client_edit.php +./includes/functions.pathresolver.php +./includes/include.debug.php +./includes/include.rights_left_top.php +./includes/include.mycontenido_settings.php +./includes/include.mod_edit_form.php +./includes/startup.php +./includes/ajax/include.ajax.con.php +./includes/include.js_files_overview.php +./includes/grouprights.inc.php +./includes/include.str_subnav.php +./includes/include.lay_overview.php +./includes/include.stat_overview.php +./includes/include.mod_history.php +./includes/include.js_history.php +./includes/include.grouprights_details.php +./includes/include.mod_translate.php +./includes/include.mod_package.php +./includes/include.clientsettings.php +./includes/include.system_db_backup.php +./includes/include.upl_artlist.php +./includes/include.js_left_top.php +./includes/include.stat_menu.php +./includes/include.con_editcontent.php +./includes/functions.con.php +./includes/include.lay_history.php +./includes/include.note.display.php +./includes/include.con_subnav.php +./includes/include.upl_edit.php +./includes/functions.file.php +./includes/include.mycontenido_lastarticles.php +./includes/include.grouprights_overview.php +./includes/functions.includePluginConf.php +./includes/include.upl_files_upload.php +./includes/include.lay_edit_form.php +./includes/include.rights_overview.php +./includes/functions.database.php +./includes/include.pretplcfg_edit_form.php +./includes/include.files_subnav.php +./includes/functions.rights.php +./includes/grouprights_area.inc.php +./includes/include.mod_overview.php +./includes/include.lang_left_top.php +./includes/include.backendedit.php +./includes/include.frontend.group.subnav.php +./includes/include.html_tpl_files_overview.php +./includes/grouprights_mod.inc.php +./includes/include.CMS_HTML.php +./includes/include.frontend.group_edit.php +./includes/functions.php54.php +./includes/grouprights_members.inc.php +./includes/globals_off.inc.php +./includes/include.style_left_top.php +./includes/functions.str.php +./includes/include.html_tpl_edit_form.php +./includes/functions.domxml-php4-to-php5.php +./includes/include.grouprights_external.php +./includes/main.login.php +./includes/cfg_language_de.inc.php +./includes/include.style_history.php +./includes/include.style_edit_form.php +./includes/include.con_str_overview.php +./includes/include.frontend.left_top.php +./includes/include.mod_new.php +./includes/functions.lang.php +./includes/include.str_overview.php +./includes/functions.i18n.php +./includes/include.upl_subnav.php +./includes/include.CMS_TEXT.php +./includes/functions.encoding.php +./includes/include.html_tpl_left_top.php +./includes/grouprights_con.inc.php +./includes/include.lang_overview.php +./includes/pseudo-cron.inc.php +./includes/include.CMS_QRCODE.php +./includes/include.system_sysvalues.php +./includes/include.symbolhelp.php +./includes/include.frontend.group_menu.php +./includes/include.rights_create.php +./includes/functions.mod.php +./includes/rights_str.inc.php +./includes/rights_area.inc.php +./includes/include.client_menu.php +./includes/include.note.popup.php +./includes/functions.lay.php +./includes/old.config.misc.php +./includes/rights_tpl.inc.php +./includes/include.system_purge.php +./includes/include.subnav.php +./backend_search.php +./ajaxmain.php +./logout.php +./images/index.php +./external/edit_area/edit_area_compressor_cl.php +./external/edit_area/class.edit_area.php +./external/edit_area/template.html +./external/edit_area/plugins/charmap/popup.html +./external/edit_area/edit_area_compressor.php +./external/index.php +./external/backendedit/front_content.php +./external/PHPMailer/test/contents.html +./external/PHPMailer/test/test_callback.php +./external/PHPMailer/test/testemail.php +./external/PHPMailer/test/phpmailerTest.php +./external/PHPMailer/class.phpmailer.php +./external/PHPMailer/class.pop3.php +./external/PHPMailer/class.smtp.php +./external/PHPMailer/examples/test_smtp_gmail_advanced.php +./external/PHPMailer/examples/contents.html +./external/PHPMailer/examples/test_smtp_advanced.php +./external/PHPMailer/examples/test_pop_before_smtp_advanced.php +./external/PHPMailer/examples/test_db_smtp_basic.php +./external/PHPMailer/examples/test_smtp_basic.php +./external/PHPMailer/examples/test_mail_basic.php +./external/PHPMailer/examples/test_pop_before_smtp_basic.php +./external/PHPMailer/examples/test_smtp_basic_no_auth.php +./external/PHPMailer/examples/test_sendmail_advanced.php +./external/PHPMailer/examples/test_mail_advanced.php +./external/PHPMailer/examples/test_smtp_gmail_basic.php +./external/PHPMailer/examples/index.html +./external/PHPMailer/examples/test_smtp_advanced_no_auth.php +./external/PHPMailer/examples/test_sendmail_basic.php +./external/PHPMailer/language/phpmailer.lang-tr.php +./external/PHPMailer/language/phpmailer.lang-ca.php +./external/PHPMailer/language/phpmailer.lang-dk.php +./external/PHPMailer/language/phpmailer.lang-fo.php +./external/PHPMailer/language/phpmailer.lang-et.php +./external/PHPMailer/language/phpmailer.lang-ja.php +./external/PHPMailer/language/phpmailer.lang-nl.php +./external/PHPMailer/language/phpmailer.lang-ch.php +./external/PHPMailer/language/phpmailer.lang-es.php +./external/PHPMailer/language/phpmailer.lang-it.php +./external/PHPMailer/language/phpmailer.lang-ro.php +./external/PHPMailer/language/phpmailer.lang-zh.php +./external/PHPMailer/language/phpmailer.lang-br.php +./external/PHPMailer/language/phpmailer.lang-zh_cn.php +./external/PHPMailer/language/phpmailer.lang-cz.php +./external/PHPMailer/language/phpmailer.lang-hu.php +./external/PHPMailer/language/phpmailer.lang-pl.php +./external/PHPMailer/language/phpmailer.lang-se.php +./external/PHPMailer/language/phpmailer.lang-fr.php +./external/PHPMailer/language/phpmailer.lang-fi.php +./external/PHPMailer/language/phpmailer.lang-no.php +./external/PHPMailer/language/phpmailer.lang-ar.php +./external/PHPMailer/language/phpmailer.lang-de.php +./external/PHPMailer/language/phpmailer.lang-ru.php +./external/PHPMailer/aboutus.html +./external/PHPMailer/docs/faq.html +./external/PHPMailer/docs/extending.html +./external/frontend/includes/index.php +./external/frontend/includes/class.input.helper.php +./external/frontend/includes/concache.php +./external/frontend/includes/class.concache.php +./external/frontend/js/index.php +./external/frontend/dbfs.php +./external/frontend/images/index.php +./external/frontend/index.php +./external/frontend/css/index.php +./external/frontend/error.php +./external/frontend/templates/index.php +./external/frontend/front_content.php +./external/frontend/front_crcloginform.inc.php +./external/frontend/config.php +./external/frontend/cache/index.php +./external/frontend/logs/index.php +./external/phpqrcode/tools/merged_config.php +./external/phpqrcode/tools/merged_header.php +./external/phpqrcode/tools/merge.php +./external/phpqrcode/bindings/tcpdf/qrcode.php +./external/phpqrcode/qrbitstream.php +./external/phpqrcode/qrinput.php +./external/phpqrcode/index.php +./external/phpqrcode/qrconst.php +./external/phpqrcode/qrimage.php +./external/phpqrcode/qrconfig.php +./external/phpqrcode/qrrscode.php +./external/phpqrcode/qrtools.php +./external/phpqrcode/qrsplit.php +./external/phpqrcode/phpqrcode.php +./external/phpqrcode/qrmask.php +./external/phpqrcode/qrencode.php +./external/phpqrcode/qrspec.php +./external/phpqrcode/qrlib.php +./external/wysiwyg/tinymce3/editor.php +./external/wysiwyg/tinymce3/editorclass.php +./external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/preview.html +./external/wysiwyg/tinymce3/jscripts/tiny_mce/plugins/preview/example.html +./external/wysiwyg/tinymce3/list.php +./external/wysiwyg/tinymce3/tiny_mce_gzip.php +./external/wysiwyg/tinymce3/tinymce.tpl.html +./external/wysiwyg/tinymce3/config.php +./external/wysiwyg/index.php +./index.php +./subnav.php +./templates/index.php +./templates/standard/template.cms_filelist_metadata_limititem.html +./templates/standard/template.blank.html +./templates/standard/template.mycontenido_subnav.html +./templates/standard/template.system_purge.html +./templates/standard/template.grouprights_memberselect.html +./templates/standard/template.con_str_overview.html +./templates/standard/template.tplcfg_edit_form.html +./templates/standard/template.tpl_edit_form.html +./templates/standard/frameset_content_right.html +./templates/standard/template.generic_form.html +./templates/standard/template.js_left_top.html +./templates/standard/template.symbolhelp.html +./templates/standard/template.mycontenido_start.html +./templates/standard/template.cms_teaser_edit.html +./templates/standard/template.backend_search_results.html +./templates/standard/template.generic_page.html +./templates/standard/template.file_subnav.html +./templates/standard/template.info.html +./templates/standard/template.inuse_lay_mod.html +./templates/standard/submenu.html +./templates/standard/template.system_variables.html +./templates/standard/template.newsletter_edit.html +./templates/standard/template.upl_left_top.html +./templates/standard/template.rights_inc.html +./templates/standard/template.deco.html +./templates/standard/widgets/template.widgets.left_top.html +./templates/standard/template.str_overview.html +./templates/standard/template.stat_menu.html +./templates/standard/template.generic_list_row.html +./templates/standard/template.lang_overview.html +./templates/standard/template.subnav_blank.html +./templates/standard/template.rights_overview.html +./templates/standard/template.client_subnav.html +./templates/standard/index.php +./templates/standard/template.con_art_overview.html +./templates/standard/template.system_subnav.html +./templates/standard/template.grouprights_overview.html +./templates/standard/frameset.html +./templates/standard/template.cms_filelist_edit.html +./templates/standard/template.html_tpl_left_top.html +./templates/standard/template.lang_edit.html +./templates/standard/template.con_subnav.html +./templates/standard/html5/template.generic_page.html +./templates/standard/template.tpl_overview.html +./templates/standard/template.grouprights_memberlist.html +./templates/standard/template.lang_left_top.html +./templates/standard/template.generic_list.html +./templates/standard/template.log_menu.html +./templates/standard/template.grouprights_menu.html +./templates/standard/template.generic_left_top.html +./templates/standard/white.html +./templates/standard/template.recipient_edit.html +./templates/standard/template.newsletter_menu.html +./templates/standard/template.default_subnav.html +./templates/standard/template.mycontenido_settings.html +./templates/standard/template.client_edit.html +./templates/standard/template.right_top_blank.html +./templates/standard/template.left_top.html +./templates/standard/template.subnav.html +./templates/standard/template.stat_top.html +./templates/standard/template.client_menu.html +./templates/standard/template.recipient_left_top.html +./templates/standard/filler.html +./templates/standard/template.con_edit_form.html +./templates/standard/template.con_str_overview.list.html +./templates/standard/template.left_top_blank.html +./templates/standard/template.upl_dirs_overview.html +./templates/standard/generic_list.html +./templates/standard/template.mod_left_top.html +./templates/standard/template.stat_subnav.html +./templates/standard/template.con_left_top.html +./templates/standard/frameset_menuless_content.html +./templates/standard/template.cms_filelist_dirlistitem.html +./templates/standard/template.rights_menu.html +./templates/standard/header.html +./templates/standard/template.rights_details.html +./templates/standard/template.grouprights_create.html +./templates/standard/frameset_content_left.html +./templates/standard/template.mycontenido_lastarticles.html +./templates/standard/template.welcome.html +./templates/standard/template.newsletter_left_top.html +./templates/standard/template.upl_files_overview.html +./templates/standard/template.select.html +./templates/standard/template.generic_table_form.html +./templates/standard/template.mod_edit_form.html +./templates/standard/template.con_subnav_noleft.html +./templates/standard/template.grouprights_left_top.html +./templates/standard/template.admin_frontend.html +./templates/standard/template.generic_menu.html +./templates/standard/template.recipient_menu.html +./templates/standard/template.request_password.html +./templates/standard/template.client_left_top.html +./templates/standard/template.rights_left_top.html +./templates/standard/template.style_left_top.html +./templates/standard/template.files_overview.html +./templates/standard/template.lay_overview.html +./templates/standard/template.stat_left_top.html +./templates/standard/template.inuse_tpl.html +./templates/standard/template.lay_edit_form.html +./templates/standard/template.grouprights_details.html +./templates/standard/template.welcome_update.html +./templates/standard/template.subnav_noleft.html +./templates/standard/template.rights_create.html +./templates/standard/template.log_main.html +./templates/standard/template.stat_overview.html +./templates/standard/frameset_content.html +./cronjobs/setfrontenduserstate.php +./cronjobs/send_reminder.php +./cronjobs/index.php +./cronjobs/move_old_stats.php +./cronjobs/linkchecker.php +./cronjobs/optimize_database.php +./cronjobs/session_cleanup.php +./cronjobs/run_newsletter_job.php +./cronjobs/advance_workflow.php +./cronjobs/move_articles.php +./main.loginform.php +./classes/Url/Contenido_Url.class.php +./classes/class.versionFile.php +./classes/class.cec.php +./classes/abstract_classes/class.conuser.php +./classes/class.csv.php +./classes/class.backend.php +./classes/class.frontend.groups.php +./classes/class.htmlparser.php +./classes/class.xsltprocessor.php +./classes/class.request.password.php +./classes/class.cec_hook.php +./classes/class.area.php +./classes/class.notification.php +./classes/widgets/class.views.advancedmenu.php +./classes/widgets/class.widgets.actionlist.php +./classes/widgets/class.widgets.tableedit.php +./classes/widgets/class.widgets.actionbutton.php +./classes/widgets/class.widgets.foldingrow.php +./classes/widgets/class.widgets.datawidgets.php +./classes/widgets/class.widgets.datefield.php +./classes/widgets/class.widgets.switchabledatechooser.php +./classes/widgets/class.widgets.treeview.php +./classes/widgets/class.widgets.views.php +./classes/widgets/class.widgets.dateselect.php +./classes/widgets/class.widgets.pager.php +./classes/widgets/class.widgets.page.php +./classes/widgets/class.widgets.buttons.php +./classes/widgets/class.widgets.datechooser.php +./classes/widgets/class.widgets.nominaltextfield.php +./classes/widgets/class.widgets.calendar.php +./classes/class.genericdb.php +./classes/class.treeitem.php +./classes/class.frontend.logic.php +./classes/con2con/class.filehandler.php +./classes/con2con/class.registry.php +./classes/con2con/class.dirhandler.php +./classes/class.autoload.php +./classes/exceptions/exception.conuser.php +./classes/class.versionImport.php +./classes/class.ui.php +./classes/class.user.php +./classes/class.metaobject.php +./classes/index.php +./classes/class.cms_teaser.php +./classes/class.ajax.php +./classes/class.iterator.php +./classes/Debug/Debug_File.class.php +./classes/Debug/DebuggerFactory.class.php +./classes/Debug/Debug_DevNull.class.php +./classes/Debug/Debug_Hidden.class.php +./classes/Debug/Debug_Visible.class.php +./classes/Debug/Sample.php +./classes/Debug/Debug_VisibleAdv.class.php +./classes/Debug/IDebug.php +./classes/class.frontend.users.php +./classes/class.action.php +./classes/class.cms_date.php +./classes/class.versionModule.php +./classes/class.purge.php +./classes/datatypes/class.datatype.number.php +./classes/datatypes/class.datatype.currency.php +./classes/datatypes/class.datatype.datetime.php +./classes/datatypes/class.datatype.php +./classes/class.version.php +./classes/class.conuser.php +./classes/cApi/class.upload.meta.php +./classes/cApi/class.action.php +./classes/cApi/class.system_property.php +./classes/cApi/class.upload.php +./classes/cApi/class.stat_archive.php +./classes/cApi/class.stat.php +./classes/class.structure.php +./classes/class.search.php +./classes/class.input.helper.php +./classes/class.security.php +./classes/class.phpmailer.php +./classes/class.chartable.php +./classes/class.xmltree.php +./classes/class.templateconfig.php +./classes/class.form.php +./classes/class.htmlvalidator.php +./classes/class.update.notifier.php +./classes/class.httpinputvalidator.php +./classes/tree/class.ctreeitem.php +./classes/tree/class.ctree.php +./classes/interfaces/interface.conuser.php +./classes/class.lang.php +./classes/cHTML5/class.chtml5.list.element.php +./classes/cHTML5/class.chtml5.button.php +./classes/cHTML5/class.chtml5.meta.php +./classes/cHTML5/class.chtml.php +./classes/cHTML5/class.chtml5.list.php +./classes/class.xml.php +./classes/Contenido_FrontendNavigation/Contenido_FrontendNavigation_Breadcrumb.class.php +./classes/Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php +./classes/Contenido_FrontendNavigation/Contenido_FrontendNavigation_Base.class.php +./classes/Contenido_FrontendNavigation/Sample.php +./classes/class.smtp.php +./classes/class.dbfs.php +./classes/template/class.clCounterFunctionParser.php +./classes/template/class.clStrAPIFunctionsParser.php +./classes/template/class.clAbstractTemplateParser.php +./classes/template/class.template.php +./classes/template/class.clIfFunctionParser.php +./classes/class.communications.php +./classes/class.group.php +./classes/contenido/class.clientslang.php +./classes/contenido/class.file.php +./classes/contenido/class.area.php +./classes/contenido/class.articlelanguage.php +./classes/contenido/class.categorytree.php +./classes/contenido/class.user.php +./classes/contenido/class.metatag.php +./classes/contenido/class.containerconfig.php +./classes/contenido/class.templateconfig.php +./classes/contenido/class.language.php +./classes/contenido/class.type.php +./classes/contenido/class.layout.php +./classes/contenido/class.categoryarticle.php +./classes/contenido/class.category.php +./classes/contenido/class.container.php +./classes/contenido/class.client.php +./classes/contenido/class.article.php +./classes/contenido/class.framefile.php +./classes/contenido/class.categorylanguage.php +./classes/contenido/class.metatype.php +./classes/contenido/class.template.php +./classes/contenido/class.module.php +./classes/contenido/class.content.php +./classes/class.todo.php +./classes/class.artspec.php +./classes/class.layout.php +./classes/class.xmlparser.php +./classes/UrlBuilder/Contenido_UrlBuilder_CustomPath.class.php +./classes/UrlBuilder/Contenido_UrlBuilder_Frontcontent.class.php +./classes/UrlBuilder/Contenido_UrlBuilderFactory.class.php +./classes/UrlBuilder/Contenido_UrlBuilder_Custom.class.php +./classes/UrlBuilder/Sample.php +./classes/UrlBuilder/Contenido_UrlBuilderConfig.class.php +./classes/UrlBuilder/Contenido_UrlBuilder.class.php +./classes/UrlBuilder/Contenido_UrlBuilder_MR.class.php +./classes/class.cl_db_backup.php +./classes/log/class.log.writer.php +./classes/log/class.modulelog.php +./classes/log/class.log.writer.file.php +./classes/log/class.log.php +./classes/class.upload.php +./classes/class.versionLayout.php +./classes/class.activeusers.php +./classes/class.wysiwyg_editor.php +./classes/class.category.php +./classes/content_types/class.content.type.abstract.php +./classes/frontend/navigation/class.frontend.navigation.php +./classes/frontend/navigation/class.frontend.navigation.abstract.php +./classes/class.frontend.permissions.php +./classes/class.htmlelements.php +./classes/class.client.php +./classes/xml/class.xml.base.php +./classes/xml/class.xml.writer.php +./classes/xml/class.xml.reader.php +./classes/xml/class.xml2array.php +./classes/class.navigation.php +./classes/class.cat.php +./classes/drivers/mysql/class.gdb.mysql.php +./classes/drivers/class.gdb.driver.php +./classes/class.properties.php +./classes/class.note.php +./classes/class.article.php +./classes/class.inuse.php +./classes/class.output_compressor.php +./classes/class.article.collector.php +./classes/class.cms_filelist.php +./classes/class.excel.php +./classes/Contenido_Category/Contenido_Category_Articles.class.php +./classes/Contenido_Category/Contenido_Category.class.php +./classes/Contenido_Category/Sample.php +./classes/class.template.php +./classes/class.table.php +./classes/class.art.php +./header.php +./frameset.php +./frameset_left.php +./frameset_right.php +./styles/index.php +./xml/index.php +./scripts/HTMLObj.js.php +./scripts/help.js.php +./scripts/index.php +./scripts/messageBox.js.php +./scripts/rights.js.php +./scripts/langref.php +./scripts/articleObject.js.php +./scripts/iZoom.js.php +./logs/index.php diff --git a/conlite/logout.php b/conlite/logout.php new file mode 100644 index 0000000..d919a0a --- /dev/null +++ b/conlite/logout.php @@ -0,0 +1,57 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-05-20 + * modified 2008-07-02, Frederic Schneider, new code-header and include security_class + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * + * $Id: logout.php 284 2014-01-09 23:58:34Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + + +page_open(array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +cInclude("includes", 'cfg_language_de.inc.php'); +cInclude("includes", 'functions.forms.php'); + +$oActiveUser = new ActiveUsers($db, $cfg, $auth); +$iUserId= $auth->auth["uid"]; +$oActiveUser->deleteUser($iUserId); + +$auth->logout(); +page_close(); +$sess->delete(); +header("location:index.php"); +?> \ No newline at end of file diff --git a/conlite/logs/deprecated.txt b/conlite/logs/deprecated.txt new file mode 100644 index 0000000..e69de29 diff --git a/conlite/logs/index.php b/conlite/logs/index.php new file mode 100644 index 0000000..ef8b776 --- /dev/null +++ b/conlite/logs/index.php @@ -0,0 +1,4 @@ + diff --git a/conlite/main.loginform.php b/conlite/main.loginform.php new file mode 100644 index 0000000..32c770c --- /dev/null +++ b/conlite/main.loginform.php @@ -0,0 +1,211 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-21 + * modified 2008-06-17, Rudi Bieller, some ugly fix for possible abuse of belang... + * modified 2008-07-02, Frederic Schneider, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * modified 2010-05-25, Dominik Ziegler, Remove password and username maxlength definitions at backend login [#CON-314] + * modified 2010-05-27, Dominik Ziegler, restored maxlength definition for username at backend login [#CON-314] + * + * $Id: main.loginform.php 445 2016-07-08 09:27:16Z oldperl $: + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +global $cfg, $username; + +$aLangs = i18nStripAcceptLanguages($_SERVER['HTTP_ACCEPT_LANGUAGE']); + +foreach ($aLangs as $sValue) { + $sEncoding = i18nMatchBrowserAccept($sValue); + $GLOBALS['belang'] = $sEncoding; + + if ($sEncoding !== false) { + break; + } +} + + +if (isset($_POST['belang']) && $_POST['belang'] != '') { + $sSelectedLang = $_POST['belang']; + $GLOBALS['belang'] = $sSelectedLang; +} + +if (!isset($belang) || empty($belang)) { + $belang = $GLOBALS['belang']; +} + + +$db = new DB_ConLite(); + +$noti = ""; +if (getenv('CONTENIDO_IGNORE_SETUP') != "true") { + $aMessages = array(); + + if (getSystemProperty('maintenance', 'mode') == 'enabled') { + $aMessages[] = i18n("Contenido is in maintenance mode. Only sysadmins are allowed to login. Please try again later."); + } + + if (count($aMessages) > 0) { + $notification = new Contenido_Notification; + $noti = $notification->messageBox("warning", implode("
    ", $aMessages), 1) . "
    "; + } +} +?> + + + + + + :: :: :: :: ConLite Login + + + " /> + + + + + +
    + +
    +
     
    +
    +
    + + +
    + + + auth["uname"])) : "" ?>" /> + + +
    +
    + +
    + +
    +
    + + + + + +
    +
    +
    +
    + +
    + +
    + + + +
    © 2012 - ConLite by CL-Community, based on CONTENIDO 4.8
    + + \ No newline at end of file diff --git a/conlite/main.php b/conlite/main.php new file mode 100644 index 0000000..b2a8be7 --- /dev/null +++ b/conlite/main.php @@ -0,0 +1,293 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2003-01-20 + * modified 2008-06-16, Holger Librenz, Hotfix: added check for invalid calls + * modified 2008-06-25, Timo Trautmann, Contenido Framework Constand added + * modified 2008-07-02, Frederic Schneider, add security fix and include security_class + * modified 2010-05-20, Murat Purc, standardized Contenido startup and security check invocations, see [#CON-307] + * modified 2011-02-08, Dominik Ziegler, removed old PHP compatibility stuff as contenido now requires at least PHP 5 + * + * $Id: main.php 301 2014-02-03 22:30:20Z oldperl $: + * }} + * + */ + +if (!defined("CON_FRAMEWORK")) { + define("CON_FRAMEWORK", true); +} + +// Contenido startup process +include_once ('./includes/startup.php'); + +$cfg["debug"]["backend_exectime"]["fullstart"] = getmicrotime(); + +cInclude ("includes", 'functions.api.php'); +cInclude ("includes", 'functions.forms.php'); + +page_open(array('sess' => 'Contenido_Session', + 'auth' => 'Contenido_Challenge_Crypt_Auth', + 'perm' => 'Contenido_Perm')); + +i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); + +/** + * Bugfix + * @see http://contenido.org/forum/viewtopic.php?t=18291 + * + * added by H. Librenz (2007-12-07) + */ +//includePluginConf(); +require_once $cfg['path']['contenido'] . $cfg['path']['includes'] . 'functions.includePluginConf.php'; + +cInclude ("includes", 'cfg_language_de.inc.php'); + +if ($cfg["use_pseudocron"] == true) +{ + /* Include cronjob-Emulator, but only for frame 1 */ + if($frame == 1) { + $sess->freeze(); + $oldpwd = getcwd(); + + chdir($cfg["path"]["contenido"].$cfg["path"]["cronjobs"]); + cInclude("includes", "pseudo-cron.inc.php"); + chdir($oldpwd); + + if($bJobRunned == true) { + // Some cronjobs might overwrite important system variables. + // We are thaw'ing the session again to re-register these variables. + $sess->thaw(); + } + } +} + + +/* Remove all own marks, only for frame 1 and 4 if $_REQUEST['appendparameters'] == 'filebrowser' + filebrowser is used in tiny in this case also do not remove session marks*/ +if (($frame == 1 || $frame == 4) && isset($_REQUEST['appendparameters']) && $_REQUEST['appendparameters'] != 'filebrowser') +{ + $col = new InUseCollection; + $col->removeSessionMarks($sess->id); +} + +/* If the override flag is set, override a specific InUseItem */ +if (isset($overrideid) && isset($overridetype)) +{ + $col = new InUseCollection; + $col->removeItemMarks($overridetype, $overrideid); +} + +# Create Contenido classes +$oDb = new DB_ConLite(); +/* @var $db DB_ConLite */ +$db = &$oDb; +$notification = new Contenido_Notification; +$classarea = new Area(); +$classlayout = new Layout(); +$classclient = new Client(); +$classuser = new User(); + +$currentuser = new User(); +$currentuser->loadUserByUserID($auth->auth["uid"]); + + +# change Client +if (isset($changeclient) && is_numeric($changeclient) ) { + $client = $changeclient; + unset($lang); +} + +# Sprache wechseln +if (isset($changelang) && is_numeric($changelang) ) { + unset($area_rights); + unset($item_rights); + + $lang = $changelang; +} + +if (!is_numeric($client) || + (!$perm->have_perm_client("client[".$client."]") && + !$perm->have_perm_client("admin[".$client."]"))) +{ + // use first client which is accessible + $sess->register("client"); + $sql = "SELECT idclient FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC"; + $db->query($sql); + + while ($db->next_record()) + { + $mclient = $db->f("idclient"); + + if ($perm->have_perm_client("client[".$mclient."]") || + $perm->have_perm_client("admin[".$mclient."]") ) + { + unset($lang); + $client = $mclient; + break; + } + } +} else { + $sess->register("client"); +} + +if (!is_numeric($lang) || $lang == "") { + $sess->register("lang"); + # search for the first language of this client + $sql = "SELECT * FROM ".$cfg["tab"]["lang"]." AS A, ".$cfg["tab"]["clients_lang"]." AS B WHERE A.idlang=B.idlang AND idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idlang ASC"; + $db->query($sql); + $db->next_record(); + $lang = $db->f("idlang"); +} else { + $sess->register("lang"); +} + +// send right encoding http header +sendEncodingHeader($db, $cfg, $lang); + +$perm->load_permissions(); + +# Create Contenido classes +$xml = new XML_doc; +$tpl = new Template; +$backend = new Contenido_Backend; +//$backend->debug=true; + +# Register session variables +$sess->register("sess_area"); + +if (isset($area)) { + $sess_area = $area; +} else { + $area = ( isset($sess_area) && $sess_area != "" ) ? $sess_area : 'login'; +} + +$sess->register("cfgClient"); +$sess->register("errsite_idcat"); +$sess->register("errsite_idart"); + +if(!isset($cfgClient) || !isset($cfgClient["set"]) || $cfgClient["set"] != "set") { + rereadClients(); +} + +# Initialize Contenido_Backend. +# Load all actions from the DB +# and check if permission is +# granted. +if ($cfg["debug"]["rendering"] == true) +{ + $oldmemusage = memory_get_usage(); +} +# Select frameset +$backend->setFrame($frame); + +# Select area +$backend->select($area); + +$cfg["debug"]["backend_exectime"]["start"] = getmicrotime(); + +# Include all required 'include' files. +# Can be an array of files, if more than +# one file is required. +if (is_array($backend->getFile('inc'))) { + foreach ($backend->getFile('inc') as $filename) { + include_once($cfg['path']['contenido'].$filename); + + } +} + +# If $action is set -> User klicked some button/link +# get the appopriate code for this action and evaluate it. + +if (isset($action) && $action != "") +{ + if (!isset($idart)) + { + $idart = 0; + } + + $backend->log($idcat, $idart, $client, $lang, $action); +} + + +if (isset($action)) { + if ($backend->getCode($action) != '') { + if ($backend->debug == 1) { + echo '
    Executing:'."\n";
    +            echo $backend->getCode($action)."\n";
    +            echo '
    '; + } + eval($backend->getCode($action)); + + } else { + if ($backend->debug == 1) { + echo '
    Executing:'."\n";
    +            echo "no code available in action\n";
    +            echo '
    '; + } + } +} + +# Include the 'main' file for the selected area. +# Usually there is only one main file +if (is_array($backend->getFile('main'))) +{ + foreach ($backend->getFile('main') as $id => $filename) + { + include_once($cfg['path']['contenido'].$filename); + } + +} +elseif( $frame == 3 ) +{ + include_once($cfg['path']['contenido'].$cfg['path']['includes'] ."include.default_subnav.php" ); +} +else +{ + include_once($cfg['path']['contenido'].$cfg['path']['includes'] ."include.blank.php"); +} + +$cfg["debug"]["backend_exectime"]["end"] = getmicrotime(); + +if ($cfg["debug"]["rendering"] == true) +{ + echo "Building this page (excluding contenido includes) took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds
    "; + echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds
    "; + + echo "Include memory usage: ".human_readable_size(memory_get_usage()-$oldmemusage)."
    "; + echo "Complete memory usage: ".human_readable_size(memory_get_usage())."
    "; +} + +/** + * Start User Tracking (who is online) + * + **/ +$oActiveUser = new ActiveUsers($db, $cfg, $auth); +$oActiveUser->startUsersTracking(); +/** + * + * End of the User Tracking + */ + +$db->disconnect(); +page_close(); + +?> \ No newline at end of file diff --git a/conlite/plugins/chains/createmetatags/classes/class.metatag.creator.html5.php b/conlite/plugins/chains/createmetatags/classes/class.metatag.creator.html5.php new file mode 100644 index 0000000..0807c13 --- /dev/null +++ b/conlite/plugins/chains/createmetatags/classes/class.metatag.creator.html5.php @@ -0,0 +1,480 @@ + + * @copyright (c) 2012-2013, ConLite Team + * @license http://www.gnu.de/documents/gpl.en.html GPL v3 (english version) + * @license http://www.gnu.de/documents/gpl.de.html GPL v3 (deutsche Version) + * @link http://www.conlite.org ConLite.org + * + * $Id: class.metatag.creator.html5.php 301 2014-02-03 22:30:20Z oldperl $ + */ + +// security check +defined('CON_FRAMEWORK') or die('Illegal call'); + +/** + * Description of class + * + * @author Ortwin Pinke + */ +class MetaTagCreatorHtml5 { + + /** + * + * @var array + */ + protected static $_MetaExtensions = null; + + /** + * + * @var array default values for meta names + */ + protected $_aDefinedMeta = array('application-name','author','description','generator','keywords'); + + /** + * Holds all config vars for metatag-creator + * You may add custom-settings using client-setting + * meta_tag_creator_html5 | [name of setting] | [value] + * + * possible names|values are + * only_html5|boolean (default:true) ,if set to true non-valide metas are deleted + * add_article_meta|boolean (default:true), if set to true metas set in article conf will overwrite existing meta + * use_cache|boolean (default:true) use cache/cachefile or not + * cachetime|[seconds] + * cachedir|[path to writable cache dir] + * + * @var array predefined config array + */ + protected $_aConfig = array( + 'only_html5' => true, + 'add_article_meta' => true, + 'use_cache' => true + ); + + /** + * + * @var string path/filename of cachefile + */ + protected $_sCacheFile = null; + + /** + * Incoming and Outgoing MetaTags + * + * @var array holds all metatags + */ + protected $_aMetaTags = array(); + + /** + * New created MetaTags + * + * @var array + */ + protected $_aCreatedMetaTags = array(); + + + /** + * + * @var boolean switch on debugging output + */ + protected $_bDebug = false; + + /** + * Object of the current article + * + * @var Article + */ + protected $_oArticle = NULL; + + /** + * Constructor + * + * @global int $idart + * @global int $client + * @global int $lang + * @param array $aMTags given array of metatags + * @param array $aConfig configuration array + * + * @return void + */ + public function __construct($aMTags, $aConfig) { + global $idart, $client, $lang; + + $this->_iIdart = (int) $idart; + $this->_iClient = (int) $client; + $this->_iLang = (int) $lang; + + if(is_null(self::$_MetaExtensions)) { + $file = dirname(dirname(__FILE__))."/conf/MetaExtension.php"; + if ($aTmp = include_once($file)) { + self::$_MetaExtensions = $aTmp; + } + self::$_MetaExtensions = array_merge(self::$_MetaExtensions, $this->_aDefinedMeta); + } + + if(is_array($aConfig) && count($aConfig) > 0) { + $this->_aConfig = array_merge($this->_aConfig, $aConfig); + } + $aCustomConfig = getEffectiveSettingsByType("meta_tag_creator_html5"); + if(is_array($aCustomConfig) && count($aCustomConfig) > 0) { + $this->_aConfig = array_merge($this->_aConfig, $aCustomConfig); + } + + if(is_array($aMTags) && count($aMTags) > 0) { + $this->_aMetaTags = array_merge($this->_aMetaTags, $aMTags); + } + if($this->_bDebug) { + echo "
    ";
    +            print_r($this->_aMetaTags);
    +        }
    +        $this->_createCacheFileHash();
    +    }
    +    
    +    /**
    +     * 
    +     * @return array generated cached metatag array
    +     */
    +    public function generateMetaTags() {
    +        if($this->_aConfig['use_cache'] && $this->_checkCacheFile()) {
    +            return $this->_getCacheFile();
    +        }
    +        // add metatags
    +        $this->_addArticleMeta();
    +        $this->_addFacebookMetaTags();
    +        
    +        $this->_mergeNewMetaTags();
    +        if(count($this->_aMetaTags) > 0) {
    +            $this->_checkForHtml5Tags();
    +        }        
    +        if($this->_bDebug) {
    +            echo "
    ";
    +            print_r($this->_aMetaTags);
    +        }
    +        if($this->_aConfig['use_cache'] && $this->_createCacheFile()) {
    +            return $this->_getCacheFile();
    +        } 
    +        return $this->_aMetaTags;
    +    }
    +    
    +    /**
    +     * Adds article meta to meta array
    +     * 
    +     * @global int $lang
    +     * @global array $encoding
    +     * @return void
    +     */
    +    protected function _addArticleMeta() {
    +        global $lang, $encoding;
    +        if($this->_aConfig['add_article_meta'] === false) return false;
    +        if(is_null($this->_oArticle) || !is_object($this->_oArticle)) {
    +            $this->_oArticle = new Article($this->_iIdart, $this->_iClient, $this->_iLang);        
    +        }
    +        $aHeadLines = $this->_checkAndMergeArrays($this->_oArticle->getContent("htmlhead"),
    +                $this->_oArticle->getContent("head"));
    +        $aText = $this->_checkAndMergeArrays($this->_oArticle->getContent("html"),
    +                $this->_oArticle->getContent("text"));
    +        $sHead = $this->_getFirstArrayValue($aHeadLines);
    +        $sText = $this->_getFirstArrayValue($aText);
    +        if($sHead) {
    +            $sHead = substr(str_replace(chr(13).chr(10),' ',strip_tags($sHead)),0,100);
    +            $this->_addMeta('description', $sHead);
    +        }
    +        if($sText) {
    +            $sText = keywordDensity($sHead, strip_tags(urldecode($sText)), $encoding[$lang]);
    +            $this->_addMeta('keywords', $sText);
    +        }
    +        
    +        // get custom meta from article conf
    +        $aAvailableMeta = conGetAvailableMetaTagTypes();
    +        foreach($aAvailableMeta as $iIdMeta=>$aValue) {
    +            if($aValue['fieldname'] != 'name') continue;
    +            if($this->_isHtml5Ext($aValue['name'])) {
    +                $sTmpContent = conGetMetaValue($this->_oArticle->getIdArtLang(), $iIdMeta);
    +                if(empty($sTmpContent)) continue;
    +                $this->_addMeta($aValue['name'], $sTmpContent);
    +            }
    +        }
    +        unset($oArticle);
    +    }
    +    
    +    /**
    +     * 
    +     *
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * 
    +     * @return boolean
    +     */
    +    protected function _addFacebookMetaTags() {
    +        if(!$this->_aConfig['add_facebook_meta']) return;
    +        // add always article data, cause they needed for fb-meta
    +        if($this->_aConfig['add_article_meta'] === false) {
    +            $this->_aConfig['add_article_meta'] = true;
    +            $this->_addArticleMeta();
    +        }        
    +        $aAllowedFbMetas = array("og:image","og:locality","og:country-name","og:latitude","og:longitude",
    +            "og:type","og:title","og:url","og:site_name","fb_admins","fb:page_id");
    +        $this->_aDefinedMeta = array_merge($this->_aDefinedMeta, $aAllowedFbMetas);
    +        $aFbSystemSettings = getEffectiveSettingsByType('facebook');
    +        $bHasSysSettings = (count($aFbSystemSettings) > 0)?true:false;
    +        foreach ($aAllowedFbMetas as $sMetaName) {
    +            if($sProp = $this->_oArticle->getProperty('facebook', $sMetaName)) {
    +                if(empty($sProp)) {
    +                    continue;
    +                } else {
    +                    $this->_addPropertyMeta($sMetaName, $sProp);
    +                }
    +            }
    +            if($bHasSysSettings) {
    +                if(array_key_exists($sMetaName, $aFbSystemSettings)) {
    +                    $this->_addPropertyMeta($sMetaName, $aFbSystemSettings[$sMetaName]);
    +                }
    +            }
    +            
    +            switch ($sMetaName) {
    +                case "og:url":
    +                    $aParams = array ('idcat' => $this->_iIdart,'lang' => $this->_iLang);
    +                    $sUrl = Contenido_Url::getInstance()->build($aParams, true);
    +                    $this->_addPropertyMeta($sMetaName, $sUrl);
    +                    break;
    +                
    +                case "og:title":
    +                    $sTitle = $this->_oArticle->getField("title");
    +                    $this->_addPropertyMeta($sMetaName, $sTitle);
    +                    break;
    +                
    +                case "og:image":
    +                    if(!isset($this->_aCreatedMetaTags[$sMetaName])) {
    +                        $aImages = $this->_oArticle->getContent("img");
    +                        $iImg = 0;
    +                        if(is_array($aImages) && count($aImages) > 0) {
    +                            if(isset($aFbSystemSettings['cms_img_no']) 
    +                                    && (int)$aFbSystemSettings['cms_img_no'] > 0
    +                                    && array_key_exists($aFbSystemSettings['cms_img_no'], $aImages)) {
    +                                $iImg = $aFbSystemSettings['cms_img_no'];
    +                            } else {
    +                                $iImg = 1;
    +                            }
    +                            if($iImg && $aFbSystemSettings['use_cms_img']) {
    +                                /* @var $oImg UploadItem */
    +                                $oImg = new UploadItem($iImg);
    +                                $sImgHtmlPath = $oImg->getField("url");
    +                                unset($oImg);                                
    +                            }
    +                        }                        
    +                    }
    +                    break;
    +            }
    +        }        
    +    }
    +    
    +    protected function _mergeNewMetaTags() {
    +        if(count($this->_aCreatedMetaTags) > 0) {
    +            foreach($this->_aCreatedMetaTags as $iKey=>$aValue) {
    +                $iKey = $this->_inMetaArray($aValue['name'], $this->_aMetaTags);
    +                if($iKey !== false) {
    +                    $this->_aMetaTags[$iKey]['content'] = $aValue['content'];
    +                } else {
    +                    array_push($this->_aMetaTags, $aValue);
    +                }
    +            }
    +        }
    +    }
    +
    +    /**
    +     * Check meta array for valid html5 meta tags
    +     * 
    +     * @todo add support for other meta tags than name
    +     * @return void
    +     */
    +    protected function _checkForHtml5Tags() {
    +        if(!$this->_aConfig['only_html5']) return;
    +        foreach($this->_aMetaTags as $iKey => $aValue) {
    +            if(key_exists('name', $aValue)) {
    +                if($this->_isHtml5Ext($aValue['name'])) continue;
    +                unset($this->_aMetaTags[$iKey]);
    +            }
    +        }
    +        
    +    }
    +    
    +    /**
    +     * Check if extensions is registered
    +     * 
    +     * @uses $_MetaExtensions Array of default and registered extensions
    +     * @param string $sExt
    +     * @return boolean
    +     */
    +    protected function _isHtml5Ext($sExt) {
    +        $sExt = strtolower($sExt);
    +        // check standard tags first
    +        if(in_array($sExt, $this->_aDefinedMeta)) return true;
    +        // check only names to save time
    +        if(in_array($sExt, self::$_MetaExtensions['names'])) return true;
    +        // now check keys with deeper arrays
    +        if(array_key_exists($sExt, self::$_MetaExtensions)) return true;
    +        // parts
    +        foreach(self::$_MetaExtensions as $sKey=>$aValue) {
    +            if($sKey === $sExt) return true;
    +            if(stristr($sKey, $sExt)) return true;
    +        }        
    +        return false;
    +    }
    +
    +    /**
    +     * Cachefile exists and not outdated
    +     * 
    +     * @return boolean
    +     */
    +    protected function _checkCacheFile() {
    +        if(file_exists($this->_sCacheFile)) {
    +            $iDiff = mktime() - filemtime($this->_sCacheFile);
    +            if($iDiff < $this->_aConfig['cachetime']) {
    +                return true;
    +            }
    +        }
    +        return false;
    +    }
    +    
    +    /**
    +     * Get meta-array from cachefile
    +     * 
    +     * @return array
    +     */
    +    protected function _getCacheFile() {
    +        return unserialize(file_get_contents($this->_sCacheFile));
    +    }
    +    
    +    /**
    +     * Create cachefile
    +     * 
    +     * @return boolean
    +     */
    +    protected function _createCacheFile() {
    +        if(empty($this->_sCacheFile)) {
    +            return false;
    +        }
    +        return (file_put_contents($this->_sCacheFile, serialize($this->_aMetaTags)) === false)?false:true;
    +    }
    +
    +    /**
    +     * Create path to cachefile with hashed filename
    +     * 
    +     * @global int $idart
    +     * @global int $lang
    +     * @return void
    +     */
    +    protected function _createCacheFileHash() {
    +        global $idart, $lang;
    +        if(isset($this->_aConfig['cachedir']) 
    +                && !empty($this->_aConfig['cachedir']) 
    +                && is_dir($this->_aConfig['cachedir'])
    +                && is_writable($this->_aConfig['cachedir'])) {
    +            $hash = 'metatag_'.md5($idart.'/'.$lang);
    +            $this->_sCacheFile = $this->_aConfig['cachedir'].$hash.'.tmp';
    +        }
    +    }
    +    
    +    /**
    +     * Merge 2 arrays
    +     * 
    +     * @param array $aArr1
    +     * @param array $aArr2
    +     * @return array merged array
    +     */
    +    protected function _checkAndMergeArrays($aArr1, $aArr2) {
    +        if(!is_array($aArr1)) {
    +            $aArr1 = array();
    +        }
    +        if(!is_array($aArr2)) {
    +            $aArr2 = array();
    +        }
    +        return array_merge($aArr1, $aArr2);
    +    }
    +    
    +    /**
    +     * 
    +     * @param type $aArr
    +     * @return mixed text as string or false
    +     */
    +    protected function _getFirstArrayValue($aArr) {
    +        $sText = "";
    +        foreach ($aArr as $key => $value) {
    +            if ($value != '') {
    +                $sText = $value;
    +                break;
    +            }
    +        }
    +        return (empty($sText))?false:$sText;
    +    }
    +    
    +    /**
    +     * Add new meta to meta-array
    +     * overwrite if exist
    +     * 
    +     * @param string $sName
    +     * @param string $sValue
    +     * @return void
    +     */
    +    protected function _addMeta($sName, $sValue) {
    +        $aTmp = array(
    +            'name'      =>  $sName,
    +            'content'   =>  $sValue
    +        );
    +        $iTmpKey = $this->_inMetaArray($sName, $this->_aCreatedMetaTags);
    +        if(false !== $iTmpKey) {
    +            $this->_aCreatedMetaTags[$iTmpKey]['content'] = $sValue;
    +        } else {
    +            array_push($this->_aCreatedMetaTags, $aTmp);
    +        }
    +    }
    +    
    +    protected function _addPropertyMeta($sName, $sValue) {
    +        $aTmp = array(
    +            'property'      =>  $sName,
    +            'content'   =>  $sValue
    +        );
    +        $iTmpKey = $this->_inMetaArray($sName, $this->_aCreatedMetaTags);
    +        if(false !== $iTmpKey) {
    +            $this->_aCreatedMetaTags[$iTmpKey]['content'] = $sValue;
    +        } else {
    +            array_push($this->_aCreatedMetaTags, $aTmp);
    +        }
    +    }
    +    
    +    /**
    +     * Search in meta-array for a name/content
    +     * returns the key if the needle is found
    +     * 
    +     * @param string $sNeedle
    +     * @param array $aHaystack
    +     * @param boolean $bStrict
    +     * @return mixed key_number in haystack or false if nothing was found
    +     */
    +    protected function _inMetaArray($sNeedle, $aHaystack, $bStrict = false) {
    +        foreach($aHaystack as $iKey=>$aValue) {
    +            if(in_array($sNeedle, $aValue)) return $iKey;
    +        }
    +        return false;
    +    }
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/createmetatags/conf/MetaExtension.php b/conlite/plugins/chains/createmetatags/conf/MetaExtension.php
    new file mode 100644
    index 0000000..ca5ed7f
    --- /dev/null
    +++ b/conlite/plugins/chains/createmetatags/conf/MetaExtension.php
    @@ -0,0 +1,314 @@
    + array([name1],[name2],...),
    + *     [group]    =>  array(
    + *         'separator' => [.|:|/|-],
    + *         'names'     =>  array(
    + *             name1,
    + *             name2,
    + *             name2,
    + *             namen)
    + *     )
    + * );
    + * @todo struct is not good, maybe i have to overthink it again
    + * @see http://wiki.whatwg.org/wiki/MetaExtensions
    + * @author Ortwin Pinke 
    + * 
    + * $Id: MetaExtension.php 278 2013-11-20 14:28:48Z oldperl $
    + */
    +
    +return array(
    +    'names' => array(
    +        'alexaverifyid',
    +        'tysontcsverid',
    +        'apple-itunes-app',
    +        'baiduspider',
    +        'citeseerxbot',
    +        'collection',
    +        'designer',
    +        'entity',
    +        'EssayDirectory',
    +        'publisher',
    +        'review_date',
    +        'es.title',
    +        'format-detection',
    +        'verify-v1',
    +        'googlebot',
    +        'revisit-after',
    +        'icbm',
    +        'HandheldFriendly',
    +        'markosweb.com/validation',
    +        'MobileOptimized',
    +        'itemsPerPage',
    +        'msvalidate.01',
    +        'norton-safeweb-site-verification',
    +        'pinterest',
    +        'rating',
    +        'referrer',
    +        'rights-standard',
    +        'robots',
    +        'skype_toolbar',
    +        'slurp',
    +        'startIndex',
    +        'teoma',
    +        'totalResults',
    +        'vieport',
    +        'y_key',
    +        'yandex-verification',
    +        'meta_date',
    +        'Site-Type',
    +        'wot-verification',
    +        'mobile-agent'
    +        ),
    +    'AGLSTERMS' =>  array(
    +        'separator' =>  '.',
    +        'names' =>  array(
    +            'serviceType',
    +            'regulation',
    +            'protectiveMarking',
    +            'mandate',
    +            'jurisdiction',
    +            'isBasedOn',
    +            'isBasisFor',
    +            'function',
    +            'documentType',
    +            'dateLicensed',
    +            'category',
    +            'case',
    +            'availability',
    +            'aggregationLevel',
    +            'act'
    +        )
    +    ),
    +    'apple-mobile-web-app'  =>  array(
    +        'separator' =>  '-',
    +        'names'     =>  array(
    +            'title',
    +            'status-bar-style',
    +            'capable'
    +        )
    +    ),
    +    'csrf'  =>  array(
    +        'separator' =>  '-',
    +        'names'     =>  array(
    +            'token',
    +            'param'
    +        )  
    +    ),
    +    'dc'    =>  array(
    +        'separator' =>  '.',
    +        'names'     =>  array(
    +            'language',
    +            'date'  =>  array(
    +                'separator' =>  '.',
    +                'names'     =>  array(
    +                    'issued'
    +                )
    +            )
    +        )
    +    ),
    +    'dcterms'   =>  array(
    +        'separator' =>  '.',
    +        'names'     =>  array(
    +            'valid',
    +            'type',
    +            'title',
    +            'temporal',
    +            'tableOfContents',
    +            'subject',
    +            'spatial',
    +            'source',
    +            'rightsHolder',
    +            'rights',
    +            'requires',
    +            'replaces',
    +            'relation',
    +            'references',
    +            'publisher',
    +            'provenance',
    +            'modified',
    +            'medium',
    +            'mediator',
    +            'license',
    +            'language',
    +            'isVersionOf',
    +            'issued',
    +            'isRequiredBy',
    +            'isReplacedBy',
    +            'isReferencedBy',
    +            'isPartOf',
    +            'isFormatOf',
    +            'instructionalMethod',
    +            'identifier',
    +            'hasVersion',
    +            'hasPart',
    +            'hasFormat',
    +            'format',
    +            'extent',
    +            'educationLevel',
    +            'description',
    +            'dateSubmitted',
    +            'dateCopyrighted',
    +            'dateAccepted',
    +            'date',
    +            'creator',
    +            'created',
    +            'coverage',
    +            'contributor',
    +            'conformsTo',
    +            'collection',
    +            'bibliographicCitation',
    +            'available',
    +            'audience',
    +            'alternative',
    +            'accrualPolicy',
    +            'accrualPeriodicity',
    +            'accrualMethod',
    +            'accessRights',
    +            'abstract'            
    +        )
    +    ),
    +    'icas'  =>  array(
    +        'separator' =>  '.',
    +        'names'     =>  array(
    +            'datetime'  =>  array(
    +                'separator' =>  '.',
    +                'names'     =>  array(
    +                    null,
    +                    'abbr',
    +                    'day',
    +                    'long'                    
    +                )
    +            )
    +        )
    +    ),
    +    'geo'   =>  array(
    +        'separator' =>  '.',
    +        'names'     =>  array(
    +            'placename',
    +            'region',
    +            'lmk',
    +            'a3',
    +            'a2',
    +            'a1',
    +            'country',
    +            'position'            
    +        )
    +    ),
    +    'google'    =>  array(
    +        'separator' =>  '-',
    +        'names'     =>  array(
    +            null,
    +            'translate' =>  array(
    +                'separator' =>  '-',
    +                'names'     =>  array(
    +                    'customization'
    +                )
    +            ),
    +            'site'  =>  array(
    +                'separator' =>  '-',
    +                'names'     =>  array(
    +                    'verification'
    +                )
    +            )
    +        )
    +    ),
    +    'msapplication' =>  array(
    +        'separator' =>  '-',
    +        'names'     =>  array(
    +            'TileColor',
    +            'TileImage',
    +            'window',
    +            'navbutton' =>  array(
    +                'separator' =>  '-',
    +                'names'     =>  array(
    +                    'color'
    +                )
    +            )
    +        ),
    +        'tooltip',
    +        'starturl',
    +        'task'
    +    ),
    +    'og'    =>  array(
    +        'separator' =>  ':',
    +        'names'     =>  array(
    +            'video',
    +            'url',
    +            'type',
    +            'title',
    +            'site_name',
    +            'locale' => array(
    +                'separator' =>  ':',
    +                'names'     =>  array(
    +                    null,
    +                    'alternate'
    +                )
    +            ),
    +            'image',
    +            'determiner',
    +            'description',
    +            'audio'
    +        )
    +    ),
    +    'wt'    =>  array(
    +        'separator' =>  '.',
    +        'names'     =>  array(
    +            'ti',
    +            'sv',
    +            'mc_id',
    +            'ad',
    +            'ac',
    +            'si_x',
    +            'si_p',
    +            'si_n',
    +            'cg_s',
    +            'cg_n'            
    +        )
    +    ),
    +    'globrix'   =>  array(
    +        'separator' =>  '.',
    +        'names'     =>  array(
    +            'longitude',
    +            'latitude',
    +            'priceproximity',
    +            'underoffer',
    +            'tenure',
    +            'poa',
    +            'period',
    +            'parking',
    +            'outsidespace',
    +            'features',
    +            'condition',
    +            'type',
    +            'bathrooms',
    +            'bedrooms',
    +            'postcode',
    +            'price',
    +            'instruction'
    +        )
    +    ),
    +    'gwt'   =>  array(
    +        'separator' =>  ':',
    +        'names'     =>  array(
    +            'property'
    +        )
    +    ),
    +    'twitter'   =>  array(
    +        'separator' => ':',
    +        'names'     =>  array(
    +            'card',
    +            'url',
    +            'title',
    +            'description',
    +            'image',
    +            'site',
    +            'creator'
    +        )
    +    )
    +)
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/createmetatags/include.chain.content.createmetatags.php b/conlite/plugins/chains/createmetatags/include.chain.content.createmetatags.php
    new file mode 100644
    index 0000000..1a67bf6
    --- /dev/null
    +++ b/conlite/plugins/chains/createmetatags/include.chain.content.createmetatags.php
    @@ -0,0 +1,298 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + *
    + */
    +
    +/**
    + * No direct call
    + */
    +if(!defined('CON_FRAMEWORK')) {
    +    die('Illegal call');
    +}
    +
    +// Compatibility for php < 5.3 using closures or not, @todo remove if we only support PHP >= 5.3
    +if(version_compare(PHP_VERSION, "5.3", "<")) {
    +    cInclude("plugins", "chains/createmetatags/includes/keyword_density_php52.php");
    +} else {
    +    cInclude("plugins", "chains/createmetatags/includes/keyword_density.php");
    +}
    +cInclude("plugins", "chains/createmetatags/classes/class.metatag.creator.html5.php");
    +
    +function cecCreateMetatags($metatags) {
    +
    +    global $cfg, $lang, $idart, $client, $cfgClient, $idcat, $idartlang;
    +    
    +    $bIsHTML5   = ((getEffectiveSetting('generator', 'html5', 'false') == 'false') ? false : true);
    +    
    +    if($bIsHTML5) {        
    +        $aConfig = array(
    +            'cachetime' => 3600,
    +            'cachedir'  => $cfgClient[$client]['path']['frontend'] . "cache/"            
    +        );
    +        
    +        $oHtml5MetaCreator = new MetaTagCreatorHtml5($metatags, $aConfig);        
    +        return $oHtml5MetaCreator->generateMetaTags();
    +    }   
    +
    +    //Basic settings
    +    $cachetime = 3600; // measured in seconds
    +    $cachedir = $cfgClient[$client]['path']['frontend'] . "cache/";
    +
    +    if (!is_array($metatags)) {
    +        $metatags = array();
    +    }
    +
    +    $hash = 'metatag_'.md5($idart.'/'.$lang);
    +    $cachefilename = $cachedir.$hash.'.tmp';
    +
    +    #Check if rebuilding of metatags is necessary
    +    $reload = true;
    +
    +    $fileexists = false;
    +
    +    if (file_exists($cachefilename)) {
    +        $fileexists = true;
    +
    +        $diff =  mktime() - filemtime($cachefilename);
    +
    +        if ($diff > $cachetime) {
    +            $reload = true;
    +        } else {
    +            $reload = false;
    +        }
    +    }
    +
    +    if ($reload) {
    +        //(Re)build metatags
    +        $db = new DB_ConLite();
    +
    +        #Get encoding
    +        $sql = "SELECT * FROM ".$cfg['tab']['lang']." WHERE idlang=".(int)$lang;
    +        $db->query($sql);
    +        if ($db->next_record()) {
    +            $sEncoding = strtoupper($db->f('encoding'));
    +        } else {
    +            $sEncoding = "ISO-8859-1";
    +        }
    +
    +        #Get idcat of homepage
    +        $sql = "SELECT a.idcat
    +            FROM
    +                ".$cfg['tab']['cat_tree']." AS a,
    +                ".$cfg['tab']['cat_lang']." AS b
    +            WHERE
    +                (a.idcat = b.idcat) AND
    +                (b.visible = 1) AND
    +                (b.idlang = ".Contenido_Security::toInteger($lang).")
    +            ORDER BY a.idtree LIMIT 1";
    +
    +        $db->query($sql);
    +
    +        if ($db->next_record()) {
    +            $idcat_homepage = $db->f('idcat');
    +        }
    +
    +        $availableTags = conGetAvailableMetaTagTypes();
    +
    +        #Get first headline and first text for current article
    +        $oArt = new Article ($idart, $client, $lang);
    +
    +        #Set idartlang, if not set
    +        if ($idartlang == '') {
    +            $idartlang = $oArt->getIdArtLang();
    +        }
    +
    +        $arrHead1 = $oArt->getContent("htmlhead");
    +        $arrHead2 = $oArt->getContent("head");
    +
    +        if (!is_array($arrHead1)) {
    +            $arrHead1 = array();
    +        }
    +
    +        if (!is_array($arrHead2)) {
    +            $arrHead2 = array();
    +        }
    +
    +        $arrHeadlines = array_merge($arrHead1, $arrHead2);
    +
    +        foreach ($arrHeadlines as $key => $value) {
    +            if ($value != '') {
    +                $sHeadline = $value;
    +                break;
    +            }
    +        }
    +
    +        $sHeadline = strip_tags($sHeadline);
    +        $sHeadline = substr(str_replace(chr(13).chr(10),' ',$sHeadline),0,100);
    +
    +        $arrText1 = $oArt->getContent("html");
    +        $arrText2 = $oArt->getContent("text");
    +
    +        if (!is_array($arrText1)) {
    +            $arrText1 = array();
    +        }
    +
    +        if (!is_array($arrText2)) {
    +            $arrText2 = array();
    +        }
    +
    +        $arrText = array_merge($arrText1, $arrText2);
    +
    +        foreach ($arrText as $key => $value) {
    +            if ($value != '') {
    +                $sText = $value;
    +                break;
    +            }
    +        }
    +
    +        $sText = strip_tags(urldecode($sText));
    +        $sText = keywordDensity ('', $sText);
    +
    +        //Get metatags for homeapge
    +        $arrHomepageMetaTags = array();
    +
    +        $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE (idcat=".Contenido_Security::toInteger($idcat_homepage).") AND(idlang=".Contenido_Security::toInteger($lang).")";
    +        $db->query($sql);
    +
    +        if($db->next_record()){
    +            $iIdArtLangHomepage = $db->f('startidartlang');
    +
    +            #get idart of homepage
    +            $sql = "SELECT idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang =".Contenido_Security::toInteger($iIdArtLangHomepage);
    +
    +            $db->query($sql);
    +
    +            if ($db->next_record()) {
    +                $iIdArtHomepage = $db->f('idart');
    +            }
    +
    +            $t1 = $cfg["tab"]["meta_tag"];
    +            $t2 = $cfg["tab"]["meta_type"];
    +
    +            $sql = "SELECT ".$t1.".metavalue,".$t2.".metatype FROM ".$t1.
    +                " INNER JOIN ".$t2." ON ".$t1.".idmetatype = ".$t2.".idmetatype WHERE ".
    +                $t1.".idartlang =".$iIdArtLangHomepage.
    +                " ORDER BY ".$t2.".metatype";
    +
    +            $db->query($sql);
    +
    +            while ($db->next_record()) {
    +                $arrHomepageMetaTags[$db->f("metatype")] = $db->f("metavalue");
    +            }
    +
    +            $oArt = new Article ($iIdArtHomepage, $client, $lang);
    +
    +            $arrHomepageMetaTags['pagetitle'] = $oArt->getField('title');
    +        }
    +
    +        //Cycle through all metatags
    +        foreach ($availableTags as $key => $value) {
    +            $metavalue = conGetMetaValue($idartlang, $key);
    +
    +            if (strlen($metavalue) == 0){
    +                //Add values for metatags that don't have a value in the current article
    +                switch(strtolower($value["name"])){
    +                    case 'author':
    +                        //Build author metatag from name of last modifier
    +                        $oArt = new Article ($idart, $client, $lang);
    +                        $lastmodifier = $oArt->getField("modifiedby");
    +                        $oUser = new User();
    +                        $oUser->loadUserByUserID(md5($lastmodifier));
    +                        $lastmodifier_real = $oUser->getRealname(md5($lastmodifier));
    +
    +                        $iCheck = CheckIfMetaTagExists($metatags, 'author');
    +                        $metatags[$iCheck]['name'] = 'author';
    +                        $metatags[$iCheck]['content'] = $lastmodifier_real;
    +
    +                        break;
    +                    case 'date':
    +                        //Build date metatag from date of last modification
    +                        $oArt = new Article ($idart, $client, $lang);
    +                        $lastmodified = $oArt->getField("lastmodified");
    +
    +                        $iCheck = CheckIfMetaTagExists($metatags, 'date');
    +                        $metatags[$iCheck]['name'] = 'date';
    +                        $metatags[$iCheck]['content'] = $lastmodified;
    +
    +                        break;
    +                    case 'description':
    +                        //Build description metatag from first headline on page
    +                        $iCheck = CheckIfMetaTagExists($metatags, 'description');
    +                        $metatags[$iCheck]['name'] = 'description';
    +                        $metatags[$iCheck]['content'] = $sHeadline;
    +
    +                        break;
    +                    case 'keywords':
    +                        $iCheck = CheckIfMetaTagExists($metatags, 'keywords');
    +                        $metatags[$iCheck]['name'] = 'keywords';
    +                        $metatags[$iCheck]['content'] = $sText;
    +
    +                        break;
    +                    case 'revisit-after':
    +                    case 'robots':
    +                    case 'expires':
    +                        //Build these 3 metatags from entries in homepage
    +                        $sCurrentTag = strtolower($value["name"]);
    +                        $iCheck = CheckIfMetaTagExists($metatags, $sCurrentTag);
    +                        $metatags[$iCheck]['name'] = $sCurrentTag;
    +                        $metatags[$iCheck]['content'] = $arrHomepageMetaTags[$sCurrentTag];
    +                        break;
    +                }
    +            }
    +        }
    +
    +        // save metatags in cache file
    +        file_put_contents($cachefilename, serialize($metatags));
    +
    +    } else {
    +        #Get metatags from file system cache
    +        $metatags = unserialize(file_get_contents($cachefilename));
    +    }
    +
    +    return $metatags;
    +}
    +
    +
    +/**
    + * Checks if the metatag allready exists inside the metatag list.
    + *
    + * @param   array|mixed  $arrMetatags       List of metatags or not a list
    + * @param   string       $sCheckForMetaTag  The metatag to check
    + * @return  int                             Position of metatag inside the metatag list or the next
    + *                                          available position
    + */
    +function CheckIfMetaTagExists($arrMetatags, $sCheckForMetaTag) {
    +    if (!is_array($arrMetatags) || count($arrMetatags) == 0) {
    +        // metatag list ist not set or empty, return initial position
    +        return 0;
    +    }
    +
    +    // loop thru existing metatags and check against the listitem name
    +    foreach ($arrMetatags as $pos => $item) {
    +        if ($item['name'] == $sCheckForMetaTag) {
    +            // metatag found -> return the position
    +            return $pos;
    +        }
    +    }
    +
    +    // metatag doesn't exists, return next position
    +    return count($arrMetatags);
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/createmetatags/includes/keyword_density.php b/conlite/plugins/chains/createmetatags/includes/keyword_density.php
    new file mode 100644
    index 0000000..5d6f80f
    --- /dev/null
    +++ b/conlite/plugins/chains/createmetatags/includes/keyword_density.php
    @@ -0,0 +1,220 @@
    + $b) ? -1 : 1;
    +}
    +
    +/**
    + * 
    + * @param array $singlewordcounter
    + * @param int $maxKeywords
    + * @return array Array with valued keywords
    + */
    +function stripCount($singlewordcounter, $maxKeywords = 15) {
    +    // strip all with only 1
    +    $tmp = array();
    +    $result = array();
    +    $tmpToRemove = 1;
    +    
    +    foreach ($singlewordcounter as $key => $value) {
    +        if ($value > $tmpToRemove) {
    +            $tmp[$key] = $value;
    +        }
    +    }
    +    
    +    if (sizeof($tmp) <= $maxKeywords) {
    +        foreach ($tmp as $key => $value) {
    +            $result[] = $key;
    +        }
    +    } else {
    +        $dist = array();
    +        foreach ($tmp as $key => $value) {
    +            $dist[$value]++;
    +        }
    +        uksort($dist, "__cmp");
    +        reset($dist);
    +        $count = 0;
    +        $resultset = array();
    +        $useQuantity = array();
    +        
    +        foreach ($dist as $key => $value) {
    +            $_count = $count + $value;
    +            if ($_count <= $maxKeywords) {
    +                $count += $value;
    +                $useQuantity[] = $key;
    +            } else {
    +                break;
    +            }
    +        }
    +        // run all keywords and select by quantities to use
    +        foreach ($singlewordcounter as $key => $value) {
    +            if (in_array($value, $useQuantity)) {
    +                $result[] = $key;
    +            }
    +        }
    +    }
    +    return $result;
    +}
    +
    +/**
    + * Generate keywords from content
    + * 
    + * @version 1.0
    + * @since 2.0.0
    + * @author Ortwin Pinke 
    + * 
    + * @param string $sHeadline
    + * @param string $sText
    + * @param string $sEncoding
    + * @param int $iMinLen
    + * @return mixed commaseparated string of keywords or false
    + */
    +function keywordDensity($sHeadline, $sText, $sEncoding = "UTF-8", $iMinLen = 5) {
    +    $sHeadline = strip_tags($sHeadline);
    +    $sText = strip_tags($sText);
    +    $sText = clHtmlEntityDecode($sText, ENT_QUOTES, $sEncoding);
    +    
    +    $aSingleWordHeadline = str_word_count($sHeadline, 1);
    +    // double array for higher valenz of headline
    +    $aSingleWordHeadline = array_merge($aSingleWordHeadline,$aSingleWordHeadline);
    +    $aSingleWordHeadline = array_count_values($aSingleWordHeadline);
    +    
    +    $aSingleWordText = str_word_count($sText, 1);
    +    $aSingleWordText = array_count_values($aSingleWordText);    
    +    
    +    $aAllWords = array_merge($aSingleWordHeadline, $aSingleWordText);
    +    array_walk($aAllWords, function(&$n, $key, $iLen) use(&$aAllWords){
    +        if(strlen($key) < $iLen || clIsStopWord($key)) {
    +            unset($aAllWords[$key]);
    +        }    
    +    }, $iMinLen);
    +    arsort($aAllWords, SORT_NUMERIC);
    +    $aAllWords = stripCount($aAllWords);
    +    if(is_array($aAllWords)) {
    +        return implode(', ', $aAllWords);
    +    }
    +    return false;
    +}
    +
    +/**
    + * Check keyword against stopword list
    + * 
    + * @version 1.0
    + * @since 2.0.0
    + * @author Ortwin Pinke 
    + * @todo move stopwords to sqlite
    + * 
    + * @global int $lang
    + * @global array $encoding
    + * @param string $sWord
    + * @return boolean
    + */
    +function clIsStopWord($sWord) {
    +    global $lang, $encoding;    
    +    $aStopWords = array();
    +    $aStopWords['de_DE'] = array("aber", "als", "am", "an", "auch", "auf", "aus", "bei", "bin",
    +        "bis", "bist", "da", "dadurch", "daher", "darum", "das", "daß", "dass", "dein",
    +        "deine", "dem", "den", "der", "des", "dessen", "deshalb", "die", "dies", "dieser", "dieses",
    +        "doch", "dort", "du", "durch", "ein", "eine", "einem", "einen", "einer", "eines", "er",
    +        "es", "euer", "eure", "für", "hatte", "hatten", "hattest", "hattet", "hier", "hinter",
    +        "ich", "ihr", "ihre", "im", "in", "ist", "ja", "jede", "jedem", "jeden", "jeder", "jedes",
    +        "jener", "jenes", "jetzt", "kann", "kannst", "können", "könnt", "machen", "mein",
    +        "meine", "mit", "muß", "mußt", "musst", "müssen", "müßt", "nach", "nachdem", "nein",
    +        "nicht", "nun", "oder", "seid", "sein", "seine", "sich", "sie",
    +        "sind", "soll", "sollen", "sollst", "sollt", "sonst", "soweit", "sowie", "und", "unser",
    +        "unsere", "unter", "vom", "von", "vor", "wann", "warum", "was", "weiter", "weitere", "wenn",
    +        "wer", "werde", "werden", "werdet", "weshalb", "wie", "wieder", "wieso", "wir", "wird",
    +        "wirst", "wo", "woher", "wohin", "zu", "zum", "zur", "über");
    +    $aStopWords['en_EN'] = $aStopWords['en_US'] = array("a", "able", "about", "above", "abst",
    +        "accordance", "according", "accordingly", "across", "act", "actually", "added", "adj",
    +        "affected", "affecting", "affects", "after", "afterwards", "again", "against", "ah", "all",
    +        "almost", "alone", "along", "already", "also", "although", "always", "am", "among",
    +        "amongst", "an", "and", "announce", "another", "any", "anybody", "anyhow", "anymore",
    +        "anyone", "anything", "anyway", "anyways", "anywhere", "apparently", "approximately",
    +        "are", "aren", "arent", "arise", "around", "as", "aside", "ask", "asking", "at", "auth",
    +        "available", "away", "awfully", "b", "back", "be", "became", "because", "become", "becomes",
    +        "becoming", "been", "before", "beforehand", "begin", "beginning", "beginnings", "begins",
    +        "behind", "being", "believe", "below", "beside", "besides", "between", "beyond", "biol",
    +        "both", "brief", "briefly", "but", "by", "c", "ca", "came", "can", "cannot", "can't",
    +        "cause", "causes", "certain", "certainly", "co", "com", "come", "comes", "contain",
    +        "containing", "contains", "could", "couldnt", "d", "date", "did", "didn't", "different",
    +        "do", "does", "doesn't", "doing", "done", "don't", "down", "downwards", "due", "during",
    +        "e", "each", "ed", "edu", "effect", "eg", "eight", "eighty", "either", "else", "elsewhere",
    +        "end", "ending", "enough", "especially", "et", "et-al", "etc", "even", "ever", "every",
    +        "everybody", "everyone", "everything", "everywhere", "ex", "except", "f", "far", "few",
    +        "ff", "fifth", "first", "five", "fix", "followed", "following", "follows", "for", "former",
    +        "formerly", "forth", "found", "four", "from", "further", "furthermore", "g", "gave", "get",
    +        "gets", "getting", "give", "given", "gives", "giving", "go", "goes", "gone", "got", "gotten",
    +        "h", "had", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "hed",
    +        "hence", "her", "here", "hereafter", "hereby", "herein", "heres", "hereupon", "hers",
    +        "herself", "hes", "hi", "hid", "him", "himself", "his", "hither", "home", "how", "howbeit",
    +        "however", "hundred", "i", "id", "ie", "if", "i'll", "im", "immediate", "immediately",
    +        "importance", "important", "in", "inc", "indeed", "index", "information", "instead", "into",
    +        "invention", "inward", "is", "isn't", "it", "itd", "it'll", "its", "itself", "i've", "j",
    +        "just", "k", "keep", "keeps", "kept", "kg", "km", "know", "known", "knows", "l", "largely",
    +        "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "lets",
    +        "like", "liked", "likely", "line", "little", "'ll", "look", "looking", "looks", "ltd", "m",
    +        "made", "mainly", "make", "makes", "many", "may", "maybe", "me", "mean", "means", "meantime",
    +        "meanwhile", "merely", "mg", "might", "million", "miss", "ml", "more", "moreover", "most",
    +        "mostly", "mr", "mrs", "much", "mug", "must", "my", "myself", "n", "na", "name", "namely",
    +        "nay", "nd", "near", "nearly", "necessarily", "necessary", "need", "needs", "neither",
    +        "never", "nevertheless", "new", "next", "nine", "ninety", "no", "nobody", "non", "none",
    +        "nonetheless", "noone", "nor", "normally", "nos", "not", "noted", "nothing", "now", "nowhere",
    +        "o", "obtain", "obtained", "obviously", "of", "off", "often", "oh", "ok", "okay", "old",
    +        "omitted", "on", "once", "one", "ones", "only", "onto", "or", "ord", "other", "others",
    +        "otherwise", "ought", "our", "ours", "ourselves", "out", "outside", "over", "overall", "owing",
    +        "own", "p", "page", "pages", "part", "particular", "particularly", "past", "per", "perhaps",
    +        "placed", "please", "plus", "poorly", "possible", "possibly", "potentially", "pp", "predominantly",
    +        "present", "previously", "primarily", "probably", "promptly", "proud", "provides", "put",
    +        "q", "que", "quickly", "quite", "qv", "r", "ran", "rather", "rd", "re", "readily", "really",
    +        "recent", "recently", "ref", "refs", "regarding", "regardless", "regards", "related",
    +        "relatively", "research", "respectively", "resulted", "resulting", "results", "right",
    +        "run", "s", "said", "same", "saw", "say", "saying", "says", "sec", "section", "see",
    +        "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sent", "seven",
    +        "several", "shall", "she", "shed", "she'll", "shes", "should", "shouldn't", "show",
    +        "showed", "shown", "showns", "shows", "significant", "significantly", "similar", "similarly",
    +        "since", "six", "slightly", "so", "some", "somebody", "somehow", "someone", "somethan",
    +        "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specifically",
    +        "specified", "specify", "specifying", "still", "stop", "strongly", "sub", "substantially",
    +        "successfully", "such", "sufficiently", "suggest", "sup", "sure", "t", "take", "taken",
    +        "taking", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that'll",
    +        "thats", "that've", "the", "their", "theirs", "them", "themselves", "then", "thence",
    +        "there", "thereafter", "thereby", "thered", "therefore", "therein", "there'll", "thereof",
    +        "therere", "theres", "thereto", "thereupon", "there've", "these", "they", "theyd", "they'll",
    +        "theyre", "they've", "think", "this", "those", "thou", "though", "thoughh", "thousand",
    +        "throug", "through", "throughout", "thru", "thus", "til", "tip", "to", "together", "too",
    +        "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "ts", "twice",
    +        "two", "u", "un", "under", "unfortunately", "unless", "unlike", "unlikely", "until", "unto",
    +        "up", "upon", "ups", "us", "use", "used", "useful", "usefully", "usefulness", "uses", "using",
    +        "usually", "v", "value", "various", "'ve", "very", "via", "viz", "vol", "vols", "vs", "w",
    +        "want", "wants", "was", "wasn't", "way", "we", "wed", "welcome", "we'll", "went", "were",
    +        "weren't", "we've", "what", "whatever", "what'll", "whats", "when", "whence", "whenever",
    +        "where", "whereafter", "whereas", "whereby", "wherein", "wheres", "whereupon", "wherever",
    +        "whether", "which", "while", "whim", "whither", "who", "whod", "whoever", "whole", "who'll",
    +        "whom", "whomever", "whos", "whose", "why", "widely", "willing", "wish", "with", "within",
    +        "without", "won't", "words", "world", "would", "wouldn't", "www", "x", "y", "yes", "yet",
    +        "you", "youd", "you'll", "your", "youre", "yours", "yourself", "yourselves", "you've", "z", "zero");    
    +    
    +    if(is_int($lang) && is_array($encoding)) {
    +        $sUseEnc = $encoding[$lang];
    +        if(empty($sUseEnc) || !array_key_exists($sUseEnc, $aStopWords)) {
    +            $sUseEnc = "de_DE";
    +        }
    +    }
    +    
    +    if(in_array(utf8_encode($sWord), $aStopWords['de_DE'])) {
    +        return true;
    +    }
    +    return false;
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/createmetatags/includes/keyword_density_php52.php b/conlite/plugins/chains/createmetatags/includes/keyword_density_php52.php
    new file mode 100644
    index 0000000..887f9c4
    --- /dev/null
    +++ b/conlite/plugins/chains/createmetatags/includes/keyword_density_php52.php
    @@ -0,0 +1,221 @@
    + $b) ? -1 : 1;
    +}
    +
    +/**
    + * 
    + * @param array $singlewordcounter
    + * @param int $maxKeywords
    + * @return array Array with valued keywords
    + */
    +function stripCount($singlewordcounter, $maxKeywords = 15) {
    +    // strip all with only 1
    +    $tmp = array();
    +    $result = array();
    +    $tmpToRemove = 1;
    +    
    +    foreach ($singlewordcounter as $key => $value) {
    +        if ($value > $tmpToRemove) {
    +            $tmp[$key] = $value;
    +        }
    +    }
    +    
    +    if (sizeof($tmp) <= $maxKeywords) {
    +        foreach ($tmp as $key => $value) {
    +            $result[] = $key;
    +        }
    +    } else {
    +        $dist = array();
    +        foreach ($tmp as $key => $value) {
    +            $dist[$value]++;
    +        }
    +        uksort($dist, "__cmp");
    +        reset($dist);
    +        $count = 0;
    +        $resultset = array();
    +        $useQuantity = array();
    +        
    +        foreach ($dist as $key => $value) {
    +            $_count = $count + $value;
    +            if ($_count <= $maxKeywords) {
    +                $count += $value;
    +                $useQuantity[] = $key;
    +            } else {
    +                break;
    +            }
    +        }
    +        // run all keywords and select by quantities to use
    +        foreach ($singlewordcounter as $key => $value) {
    +            if (in_array($value, $useQuantity)) {
    +                $result[] = $key;
    +            }
    +        }
    +    }
    +    return $result;
    +}
    +
    +/**
    + * Generate keywords from content
    + * 
    + * @version 1.0
    + * @since 2.0.0
    + * @author Ortwin Pinke 
    + * 
    + * @param string $sHeadline
    + * @param string $sText
    + * @param string $sEncoding
    + * @param int $iMinLen
    + * @return mixed commaseparated string of keywords or false
    + */
    +function keywordDensity($sHeadline, $sText, $sEncoding = "UTF-8", $iMinLen = 5) {
    +    global $aAllWords;
    +    $sHeadline = strip_tags($sHeadline);
    +    $sText = strip_tags($sText);
    +    $sText = clHtmlEntityDecode($sText, ENT_QUOTES, $sEncoding);
    +    
    +    $aSingleWordHeadline = str_word_count($sHeadline, 1);
    +    // double array for higher valenz of headline
    +    $aSingleWordHeadline = array_merge($aSingleWordHeadline,$aSingleWordHeadline);
    +    $aSingleWordHeadline = array_count_values($aSingleWordHeadline);
    +    
    +    $aSingleWordText = str_word_count($sText, 1);
    +    $aSingleWordText = array_count_values($aSingleWordText);    
    +    
    +    $aAllWords = array_merge($aSingleWordHeadline, $aSingleWordText);
    +    array_walk($aAllWords, create_function('&$n, $key, $iLen', '
    +        global $aAllWords;
    +        if(strlen($key) < $iLen || clIsStopWord($key)) {
    +            unset($aAllWords[$key]);
    +        }'), $iMinLen);
    +    arsort($aAllWords, SORT_NUMERIC);
    +    $aAllWords = stripCount($aAllWords);
    +    if(is_array($aAllWords)) {
    +        return implode(', ', $aAllWords);
    +    }
    +    return false;
    +}
    +
    +/**
    + * Check keyword against stopword list
    + * 
    + * @version 1.0
    + * @since 2.0.0
    + * @author Ortwin Pinke 
    + * @todo move stopwords to sqlite
    + * 
    + * @global int $lang
    + * @global array $encoding
    + * @param string $sWord
    + * @return boolean
    + */
    +function clIsStopWord($sWord) {
    +    global $lang, $encoding;    
    +    $aStopWords = array();
    +    $aStopWords['de_DE'] = array("aber", "als", "am", "an", "auch", "auf", "aus", "bei", "bin",
    +        "bis", "bist", "da", "dadurch", "daher", "darum", "das", "daß", "dass", "dein",
    +        "deine", "dem", "den", "der", "des", "dessen", "deshalb", "die", "dies", "dieser", "dieses",
    +        "doch", "dort", "du", "durch", "ein", "eine", "einem", "einen", "einer", "eines", "er",
    +        "es", "euer", "eure", "für", "hatte", "hatten", "hattest", "hattet", "hier", "hinter",
    +        "ich", "ihr", "ihre", "im", "in", "ist", "ja", "jede", "jedem", "jeden", "jeder", "jedes",
    +        "jener", "jenes", "jetzt", "kann", "kannst", "können", "könnt", "machen", "mein",
    +        "meine", "mit", "muß", "mußt", "musst", "müssen", "müßt", "nach", "nachdem", "nein",
    +        "nicht", "nun", "oder", "seid", "sein", "seine", "sich", "sie",
    +        "sind", "soll", "sollen", "sollst", "sollt", "sonst", "soweit", "sowie", "und", "unser",
    +        "unsere", "unter", "vom", "von", "vor", "wann", "warum", "was", "weiter", "weitere", "wenn",
    +        "wer", "werde", "werden", "werdet", "weshalb", "wie", "wieder", "wieso", "wir", "wird",
    +        "wirst", "wo", "woher", "wohin", "zu", "zum", "zur", "über");
    +    $aStopWords['en_EN'] = $aStopWords['en_US'] = array("a", "able", "about", "above", "abst",
    +        "accordance", "according", "accordingly", "across", "act", "actually", "added", "adj",
    +        "affected", "affecting", "affects", "after", "afterwards", "again", "against", "ah", "all",
    +        "almost", "alone", "along", "already", "also", "although", "always", "am", "among",
    +        "amongst", "an", "and", "announce", "another", "any", "anybody", "anyhow", "anymore",
    +        "anyone", "anything", "anyway", "anyways", "anywhere", "apparently", "approximately",
    +        "are", "aren", "arent", "arise", "around", "as", "aside", "ask", "asking", "at", "auth",
    +        "available", "away", "awfully", "b", "back", "be", "became", "because", "become", "becomes",
    +        "becoming", "been", "before", "beforehand", "begin", "beginning", "beginnings", "begins",
    +        "behind", "being", "believe", "below", "beside", "besides", "between", "beyond", "biol",
    +        "both", "brief", "briefly", "but", "by", "c", "ca", "came", "can", "cannot", "can't",
    +        "cause", "causes", "certain", "certainly", "co", "com", "come", "comes", "contain",
    +        "containing", "contains", "could", "couldnt", "d", "date", "did", "didn't", "different",
    +        "do", "does", "doesn't", "doing", "done", "don't", "down", "downwards", "due", "during",
    +        "e", "each", "ed", "edu", "effect", "eg", "eight", "eighty", "either", "else", "elsewhere",
    +        "end", "ending", "enough", "especially", "et", "et-al", "etc", "even", "ever", "every",
    +        "everybody", "everyone", "everything", "everywhere", "ex", "except", "f", "far", "few",
    +        "ff", "fifth", "first", "five", "fix", "followed", "following", "follows", "for", "former",
    +        "formerly", "forth", "found", "four", "from", "further", "furthermore", "g", "gave", "get",
    +        "gets", "getting", "give", "given", "gives", "giving", "go", "goes", "gone", "got", "gotten",
    +        "h", "had", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "hed",
    +        "hence", "her", "here", "hereafter", "hereby", "herein", "heres", "hereupon", "hers",
    +        "herself", "hes", "hi", "hid", "him", "himself", "his", "hither", "home", "how", "howbeit",
    +        "however", "hundred", "i", "id", "ie", "if", "i'll", "im", "immediate", "immediately",
    +        "importance", "important", "in", "inc", "indeed", "index", "information", "instead", "into",
    +        "invention", "inward", "is", "isn't", "it", "itd", "it'll", "its", "itself", "i've", "j",
    +        "just", "k", "keep", "keeps", "kept", "kg", "km", "know", "known", "knows", "l", "largely",
    +        "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "lets",
    +        "like", "liked", "likely", "line", "little", "'ll", "look", "looking", "looks", "ltd", "m",
    +        "made", "mainly", "make", "makes", "many", "may", "maybe", "me", "mean", "means", "meantime",
    +        "meanwhile", "merely", "mg", "might", "million", "miss", "ml", "more", "moreover", "most",
    +        "mostly", "mr", "mrs", "much", "mug", "must", "my", "myself", "n", "na", "name", "namely",
    +        "nay", "nd", "near", "nearly", "necessarily", "necessary", "need", "needs", "neither",
    +        "never", "nevertheless", "new", "next", "nine", "ninety", "no", "nobody", "non", "none",
    +        "nonetheless", "noone", "nor", "normally", "nos", "not", "noted", "nothing", "now", "nowhere",
    +        "o", "obtain", "obtained", "obviously", "of", "off", "often", "oh", "ok", "okay", "old",
    +        "omitted", "on", "once", "one", "ones", "only", "onto", "or", "ord", "other", "others",
    +        "otherwise", "ought", "our", "ours", "ourselves", "out", "outside", "over", "overall", "owing",
    +        "own", "p", "page", "pages", "part", "particular", "particularly", "past", "per", "perhaps",
    +        "placed", "please", "plus", "poorly", "possible", "possibly", "potentially", "pp", "predominantly",
    +        "present", "previously", "primarily", "probably", "promptly", "proud", "provides", "put",
    +        "q", "que", "quickly", "quite", "qv", "r", "ran", "rather", "rd", "re", "readily", "really",
    +        "recent", "recently", "ref", "refs", "regarding", "regardless", "regards", "related",
    +        "relatively", "research", "respectively", "resulted", "resulting", "results", "right",
    +        "run", "s", "said", "same", "saw", "say", "saying", "says", "sec", "section", "see",
    +        "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sent", "seven",
    +        "several", "shall", "she", "shed", "she'll", "shes", "should", "shouldn't", "show",
    +        "showed", "shown", "showns", "shows", "significant", "significantly", "similar", "similarly",
    +        "since", "six", "slightly", "so", "some", "somebody", "somehow", "someone", "somethan",
    +        "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specifically",
    +        "specified", "specify", "specifying", "still", "stop", "strongly", "sub", "substantially",
    +        "successfully", "such", "sufficiently", "suggest", "sup", "sure", "t", "take", "taken",
    +        "taking", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that'll",
    +        "thats", "that've", "the", "their", "theirs", "them", "themselves", "then", "thence",
    +        "there", "thereafter", "thereby", "thered", "therefore", "therein", "there'll", "thereof",
    +        "therere", "theres", "thereto", "thereupon", "there've", "these", "they", "theyd", "they'll",
    +        "theyre", "they've", "think", "this", "those", "thou", "though", "thoughh", "thousand",
    +        "throug", "through", "throughout", "thru", "thus", "til", "tip", "to", "together", "too",
    +        "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "ts", "twice",
    +        "two", "u", "un", "under", "unfortunately", "unless", "unlike", "unlikely", "until", "unto",
    +        "up", "upon", "ups", "us", "use", "used", "useful", "usefully", "usefulness", "uses", "using",
    +        "usually", "v", "value", "various", "'ve", "very", "via", "viz", "vol", "vols", "vs", "w",
    +        "want", "wants", "was", "wasn't", "way", "we", "wed", "welcome", "we'll", "went", "were",
    +        "weren't", "we've", "what", "whatever", "what'll", "whats", "when", "whence", "whenever",
    +        "where", "whereafter", "whereas", "whereby", "wherein", "wheres", "whereupon", "wherever",
    +        "whether", "which", "while", "whim", "whither", "who", "whod", "whoever", "whole", "who'll",
    +        "whom", "whomever", "whos", "whose", "why", "widely", "willing", "wish", "with", "within",
    +        "without", "won't", "words", "world", "would", "wouldn't", "www", "x", "y", "yes", "yet",
    +        "you", "youd", "you'll", "your", "youre", "yours", "yourself", "yourselves", "you've", "z", "zero");    
    +    
    +    if(is_int($lang) && is_array($encoding)) {
    +        $sUseEnc = $encoding[$lang];
    +        if(empty($sUseEnc) || !array_key_exists($sUseEnc, $aStopWords)) {
    +            $sUseEnc = "de_DE";
    +        }
    +    }
    +    
    +    if(in_array(utf8_encode($sWord), $aStopWords['de_DE'])) {
    +        return true;
    +    }
    +    return false;
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/class.ceccreatefacebookmeta.php b/conlite/plugins/chains/includes/class.ceccreatefacebookmeta.php
    new file mode 100644
    index 0000000..002db82
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/class.ceccreatefacebookmeta.php
    @@ -0,0 +1,48 @@
    +
    + * @copyright (c) 2012-2013, ConLite Team 
    + * @license http://www.gnu.de/documents/gpl.en.html GPL v3 (english version)
    + * @license http://www.gnu.de/documents/gpl.de.html GPL v3 (deutsche Version)
    + * @link http://www.conlite.org ConLite.org
    + * 
    + * $Id: class.ceccreatefacebookmeta.php 291 2014-01-14 23:48:52Z oldperl $
    + */
    +
    +// security check
    +defined('CON_FRAMEWORK') or die('Illegal call');
    +
    +/**
    + * Description of createFacebookMeta
    + *
    + * @author Ortwin Pinke 
    + */
    +class cecCreateFacebookMeta {
    +    
    +    protected $_aConfig = array();
    +    
    +    private $_sFbHeadTag = '';
    +
    +    public function __construct() {
    +        $this->_aConfig = getEffectiveSettingsByType("meta_tag_creator_html5", array("add_facebook_meta"=>false));
    +    }
    +    
    +    public function createHeadTag($sCode) {
    +        $bIsHTML5 = ((getEffectiveSetting('generator', 'html5', 'false') == 'false') ? false : true);
    +        if($bIsHTML5 && $this->_aConfig['add_facebook_meta']) return str_ireplace_once("", $this->_sFbHeadTag, $sCode);
    +        return $sCode;
    +    }
    +}
    +
    +cAutoload::addClassmapConfig(array("cecCreateFacebookMeta" => "conlite/plugins/chains/includes/class.ceccreatefacebookmeta.php"))
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/config.plugin.php b/conlite/plugins/chains/includes/config.plugin.php
    new file mode 100644
    index 0000000..6b57d8d
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/config.plugin.php
    @@ -0,0 +1,48 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * 
    + * {@internal 
    + *   created 
    + *
    + *   $Id: config.plugin.php 291 2014-01-14 23:48:52Z oldperl $: 
    + * }}
    + * 
    + */
    + 
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +global $_cecRegistry, $cfg;
    +
    +#$cfg['plugins']['frontendlogic'][] = "category";
    +
    +cInclude("plugins", "chains/includes/include.chain.frontend.cat_backendaccess.php");
    +cInclude("plugins", "chains/includes/include.chain.frontend.cat_access.php");
    +cInclude("plugins", "chains/createmetatags/include.chain.content.createmetatags.php");
    +cInclude("plugins", "chains/includes/class.ceccreatefacebookmeta.php");
    +cInclude("plugins", "chains/includes/include.chain.frontend.createbasehref.php");
    +plugin_include('chains', 'includes/include.chain.frontend.output_compressor.php');
    +
    +$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess");
    +$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess_Backend");
    +$_cecRegistry->addChainFunction("Contenido.Content.CreateMetatags", "cecCreateMetatags");
    +$_cecRegistry->addChainFunction("Contenido.Frontend.HTMLCodeOutput", "cecCreateFacebookMeta->createHeadTag");
    +$_cecRegistry->addChainFunction("Contenido.Frontend.BaseHrefGeneration", "cecCreateBaseHref");
    +$_cecRegistry->addChainFunction('Contenido.Frontend.HTMLCodeCompression', 'cecOutputCompressor');
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/include.chain.content.set_clear_cache.php b/conlite/plugins/chains/includes/include.chain.content.set_clear_cache.php
    new file mode 100644
    index 0000000..83e8a0c
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/include.chain.content.set_clear_cache.php
    @@ -0,0 +1,98 @@
    +addChainFunction("Contenido.Content.SaveContentEntry", "cecContentSetClearCache");
    + * 
    + *
    + * @package    Contenido Backend
    + * @subpackage Contenido Chain
    + * @version    $Id: include.chain.content.set_clear_cache.php 17 2011-08-09 10:49:01Z oldperl $
    + * @since      2011-07-14
    + * @author     Ortwin Pinke
    + * @copyright  DCEonline 
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.contenido.org
    + * @link       http://www.ortwinpinke.de
    + * @link       http://forum.contenido.org/viewtopic.php?f=66&t=31432
    + *
    + */
    +
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +/**
    + *
    + * @param int $idartlang
    + * @param int $type
    + * @param int $typeid
    + * @param string $value
    + * @return bool 
    + */
    +function cecContentSetClearCache($idartlang, $type, $typeid, $value) {
    +    
    +    $aArticle2Clear = array($idartlang);
    +    
    +    $bClearCache = getEffectiveSetting('save_article', 'clear_cache', false);
    +    $sAdditionalArticles = getEffectiveSetting('save_article', 'clear_cache_add_idart', null);
    +    $iLimitAdditionalArticles = (int) getEffectiveSetting('save_article', 'clear_cache_limit_add_idart', 10);
    +    $iLimitAdditionalArticles = ($iLimitAdditionalArticles < 10)?10:$iLimitAdditionalArticles;
    +    
    +    if(!is_null($sAdditionalArticles)) {
    +        $aAdditionalArticles = array_map('trim',explode(",", $sAdditionalArticles, $iLimitAdditionalArticles +1));
    +        $iCountElements = count($aAdditionalArticles);        
    +        if($iCountElements > 0) {
    +            if($iCountElements > 1 && $iCountElements > $iLimitAdditionalArticles) {
    +                array_pop ($aAdditionalArticles);
    +            }
    +            array_splice($aArticle2Clear, count($aArticle2Clear), 0, $aAdditionalArticles);
    +        }
    +    }
    +    
    +    if($bClearCache) {
    +        cInclude("classes", "contenido/class.articlelanguage.php");
    +        cInclude("classes", "contenido/class.categoryarticle.php");
    +        
    +        foreach($aArticle2Clear as $iIdArt) {
    +            $oArtLang = new cApiArticleLanguage();
    +            if($oArtLang->loadByPrimaryKey($iIdArt)) {
    +                $oArtCat = new cApiCategoryArticle();
    +                if($oArtCat->loadBy('idart', $oArtLang->get('idart'))) {
    +                    $bCreateCode = !$oArtCat->get('createcode');
    +                    if($bCreateCode) {
    +                        $oArtCat->set('createcode', 1);
    +                        $oArtCat->store();
    +                    }
    +                }
    +                unset($oArtCat);
    +            }
    +            unset($oArtLang);
    +        }       
    +    }
    +    return $value;
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/include.chain.frontend.cat_access.php b/conlite/plugins/chains/includes/include.chain.frontend.cat_access.php
    new file mode 100644
    index 0000000..a33c499
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/include.chain.frontend.cat_access.php
    @@ -0,0 +1,74 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * 
    + * {@internal 
    + *   created 
    + *   modified 2008-07-04, bilal arslan, added security fix
    + *   $Id: include.chain.frontend.cat_access.php 306 2014-03-13 23:03:26Z oldperl $: 
    + * }}
    + * 
    + */
    + 
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +
    +function cecFrontendCategoryAccess ($idlang, $idcat, $user)
    +{
    +	global $cfg;
    +	
    +	$db = new DB_ConLite;
    +	
    +	$FrontendUser = new FrontendUser;
    +	$FrontendUser->loadByPrimaryKey($user);
    +
    +	if ($FrontendUser->virgin)
    +	{
    +		return false;	
    +	}
    +	
    +	$groups = $FrontendUser->getGroupsForUser();
    +
    +	$FrontendPermissionCollection = new FrontendPermissionCollection;
    +	
    +	$sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = " . Contenido_Security::toInteger($idcat) . " AND idlang = " . Contenido_Security::toInteger($idlang);
    +	$db->query($sql);
    +	
    +	if ($db->next_record())
    +	{
    +		$idcatlang = $db->f("idcatlang");	
    +	} else {
    +		return false;	
    +	}
    +	
    +	foreach ($groups as $group)
    +	{
    +		$allow = $FrontendPermissionCollection->checkPerm($group, "category", "access", $idcatlang);
    +		
    +		if ($allow == true)
    +		{
    +			return true;	
    +		}
    +	}
    +	
    +	return false;
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/include.chain.frontend.cat_backendaccess.php b/conlite/plugins/chains/includes/include.chain.frontend.cat_backendaccess.php
    new file mode 100644
    index 0000000..81e21f0
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/include.chain.frontend.cat_backendaccess.php
    @@ -0,0 +1,72 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * 
    + * {@internal 
    + *   created 
    + *   modified 2008-07-04, bilal arslan, added security fix
    + *   modified 2008-09-14, Murat Purc, CON-206: fixed backend access logic
    + *   modified 2008-10-30, Andreas Lindner, also consider group memnership of backend users    
    + *   $Id: include.chain.frontend.cat_backendaccess.php 306 2014-03-13 23:03:26Z oldperl $: 
    + * }}
    + * 
    + */
    + 
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +
    +function cecFrontendCategoryAccess_Backend($idlang, $idcat, $user)
    +{
    +	global $cfg, $perm;
    +
    +	if ($perm->have_perm()) {
    +        // sysadmin or client admin can always access to protected areas
    +        return true;
    +    }
    +    
    +	$db2 = new DB_ConLite;
    +	
    +	$arrSearchFor = array("'".Contenido_Security::escapeDB($user, $db2)."'");
    +
    +	$sql = "SELECT * FROM ".$cfg['tab']['groupmembers']." WHERE user_id = '".Contenido_Security::escapeDB($user, $db2)."'";
    +
    +	$db2->query($sql);
    +	
    +	while ($db2->next_record()) {
    +		$arrSearchFor[] = "'".Contenido_Security::escapeDB($db2->f('group_id'), $db2)."'";
    +	}
    +
    +	$sSearchFor = implode(",", $arrSearchFor);
    +	
    +	$sql = "SELECT idright
    +					FROM ".$cfg["tab"]["rights"]." AS A,
    +						 ".$cfg["tab"]["actions"]." AS B,
    +						 ".$cfg["tab"]["area"]." AS C
    +					 WHERE B.name = 'front_allow' AND C.name = 'str' AND A.user_id IN (". $sSearchFor .") AND A.idcat = '".Contenido_Security::toInteger($idcat)."'
    +							AND A.idarea = C.idarea AND B.idaction = A.idaction AND A.idlang = '".Contenido_Security::toInteger($idlang)."'";
    +
    +	$db2->query($sql);
    +
    +	if (!$db2->next_record()) {
    +		return false;
    +	} else {
    +		return true;
    +	}
    +}?>
    diff --git a/conlite/plugins/chains/includes/include.chain.frontend.createbasehref.php b/conlite/plugins/chains/includes/include.chain.frontend.createbasehref.php
    new file mode 100644
    index 0000000..5724318
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/include.chain.frontend.createbasehref.php
    @@ -0,0 +1,70 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * 
    + * {@internal 
    + *   created 2008-07-31
    + *   modified 2008-08-05, Bj�rn Behrens (HerrB) - added missing parameter and refactored
    + *   modified 2008-08-15, Oliver Lohkemper (OliverL) - run only Client-Properties return Array
    + *   $Id: include.chain.frontend.createbasehref.php 306 2014-03-13 23:03:26Z oldperl $: 
    + * }}
    + * 
    + */
    + 
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +function cecCreateBaseHref ($sCurrentBaseHref)
    +{
    +	global $cfg, $client;
    +	
    +	$oClient	= new cApiClient($client);
    +	$aSettings	= $oClient->getProperties();
    +	if( is_array($aSettings) ) {
    +		foreach ($aSettings as $aClient)
    +		{
    +			if ($aClient["type"] == "client" && strstr($aClient["name"], "frontend_path") !== false)
    +			{
    +				$aUrlData = parse_url($aClient["value"]);
    +	
    +				if ($aUrlData["host"] == $_SERVER['HTTP_HOST'] || 
    +					("www." . $aUrlData["host"]) == $_SERVER['HTTP_HOST'] || 
    +					 $aUrlData["host"] ==  "www." . $_SERVER['HTTP_HOST'] )
    +				{
    +					// The currently used host has been found as 
    +					// part of the base href(s) specified in client settings
    +					
    +					// Return base href as specified in client settings
    +					$sNewBaseHref = $aClient["value"];
    +					return $sNewBaseHref;
    +				}
    +			}
    +		}
    +	}
    +	
    +	// We are still here, so no alternative href was found - return the default one 
    +	return $sCurrentBaseHref;
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/include.chain.frontend.output_compressor.php b/conlite/plugins/chains/includes/include.chain.frontend.output_compressor.php
    new file mode 100644
    index 0000000..d9c5a90
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/include.chain.frontend.output_compressor.php
    @@ -0,0 +1,699 @@
    +
    + * @license    http://www.conlite.org/license/LIZENZ.txt
    + * @link       http://www.conlite.org
    + * 
    + * {@internal 
    + *   created 2012-12-16
    + *
    + *   $Id: include.chain.frontend.output_compressor.php 312 2014-06-18 11:01:08Z oldperl $: 
    + * }}
    + * 
    + */
    + 
    +if(!defined('CON_FRAMEWORK')) {
    +    die('Illegal call');
    +}
    +
    +function cecOutputCompressor($sCode) {
    +    global $cfgClient, $client;
    +    
    +    # How is output compression switched?
    +    $switch = getEffectiveSetting('generator', 'output_compression', 'off');
    +    if ($switch == 'off') {
    +        return $sCode;
    +    }
    +    if(!is_writable($cfgClient[$client]['path']['frontend'] . 'cache/')) {
    +        return $sCode;
    +    }
    +    
    +    # Remove comments (NOT IE conditional comment tags and HTML comments in Javascript blocks) from the code
    +    $p0 = strpos($sCode, '');
    +    $p1 = strpos($sCode, '', ($p1 + 1));
    +            $p1 = strpos($sCode, ')
    +            $p1 = strpos($sCode, '', $p1);
    +            while (substr($sCode, ($p2 - 6), 9) == 'endif]-->') {
    +                # IE conditional comment end tag, but in commented block
    +                $p2 = strpos($sCode, '-->', ($p2 + 1));
    +            }
    +            $tmp = substr($sCode, $p1, ($p2 - $p1 + 3));
    +            $sCode = str_replace($tmp, '', $sCode);
    +            $p0 = strpos($sCode, '');
    +            $p1 = strpos($sCode, ')
    +    # We can move the complete block to the end of the head section if only link tags are included, otherwise we must move only the links
    +    # while rebuilding the IE conditional comments around them
    +    $IE = array();
    +    $IElinks = array();
    +    $IEscripts = array();
    +    $IEscriptblocks = array();
    +    $IEstyles = array();
    +    $p1 = strpos($sCode, '', $p1);
    +        $tmp = substr($sCode, $p1, (($p2 - $p1) + 9));
    +        # Find all style link tags with rel="stylesheet" and type="text/css"
    +        $p3 = strpos($tmp, '', $p3);
    +            $tmp2 = substr($tmp, $p3, (($p4 - $p3) + 1));
    +            if ((strpos(strtolower($tmp2), 'rel="stylesheet"')) || (strpos(strtolower($tmp2), "rel='stylesheet'"))) {
    +                if ((strpos(strtolower($tmp2), 'type="text/css"')) || (strpos(strtolower($tmp2), "type='text/css'"))) {
    +                    # Extract the path and filename
    +                    $url = '';
    +                    $p5 = strpos($tmp2, 'href=');
    +                    if ($p5 !== false) { # shouldn't happen, an address is needed
    +                        $p5 += 6;
    +                        $char = substr($tmp2, ($p5 - 1), 1);
    +                        $p6 = strpos($tmp2, $char, $p5);
    +                        $url = substr($tmp2, $p5, ($p6 - $p5));
    +                        # Clean the url from unnessecary path information (just leave the folder name like "css/xxx.css")
    +                        $url = str_replace($cfgClient[$client]['path']['htmlpath'], '', $url);
    +                        $url = ((substr($url, 0, 1) == '/') ? substr($url, 1) : $url);
    +                    }
    +                    # Sort into array grouped by media type
    +                    $p5 = strpos($tmp2, 'media=');
    +                    if ($p5 !== false) {
    +                        $p5 += 7;
    +                        $char = substr($tmp2, ($p5 - 1), 1);
    +                        $p6 = strpos($tmp2, $char, $p5);
    +                        $media = substr($tmp2, $p5, ($p6 - $p5));
    +                        $IElinks[$c][$media][] = array('url' => $url, 'old' => $tmp2);
    +                    } else {
    +                        $IElinks[$c]['all'][] = array('url' => $url, 'old' => $tmp2);
    +                    }
    +                    $IEtmp[] = $tmp2;
    +                }
    +            }
    +            $p3 = strpos($tmp, '', $p3);
    +            # Check if this is included code, or code directly in the page
    +            if (substr($tmp, $p4, 10) == '>') {
    +                $tmp2 = substr($tmp, $p3, (($p4 - $p3) + 10));
    +                # Check if this script tag has a type or language set
    +                $p5 = strpos($tmp2, 'type=');
    +                if ($p5 !== false) {
    +                    $p5 += 6;
    +                    $char = substr($tmp2, ($p5 - 1), 1);
    +                    $p6 = strpos($tmp2, $char, $p5);
    +                    $type = substr($tmp2, $p5, ($p6 - $p5));
    +                    # If type isn't "text/javascript", leave the tag alone
    +                    if (strtolower($type) != 'text/javascript') {
    +                        continue;
    +                    }
    +                } else {
    +                    $p5 = strpos($tmp2, 'language=');
    +                    if ($p5 !== false) {
    +                        $p5 += 10;
    +                        $char = substr($tmp2, ($p5 - 1), 1);
    +                        $p6 = strpos($tmp2, $char, $p5);
    +                        $lang = substr($tmp2, $p5, ($p6 - $p5));
    +                        # If language isn't "javascript", leave the tag alone
    +                        if (strtolower($lang) != 'javascript') {
    +                            continue;
    +                        }
    +                    }
    +                }
    +                # We now definitely have a javascript link tag, save it in an array
    +                $url = '';
    +                $p5 = strpos($tmp2, 'src=');
    +                if ($p5 !== false) { # shouldn't happen, an address is needed
    +                    $p5 += 5;
    +                    $char = substr($tmp2, ($p5 - 1), 1);
    +                    $p6 = strpos($tmp2, $char, $p5);
    +                    $url = substr($tmp2, $p5, ($p6 - $p5));
    +                    # Clean the url from unnessecary path information (just leave the folder name like "js/xxx.js")
    +                    $url = str_replace($cfgClient[$client]['path']['htmlpath'], '', $url);
    +                    $url = ((substr($url, 0, 1) == '/') ? substr($url, 1) : $url);
    +                }
    +                # Exclude files with complete URLs or parameters from the compressor
    +                $compress = (((substr($url, 0, 7) == 'http://') || (substr($url, 0, 8) == 'https://') || (strpos($url, '?') !== false)) ? false : true);
    +                $IEscripts[$c][] = array('url' => $url, 'compress' => $compress, 'old' => $tmp2);
    +                $IEtmp[] = $tmp2;
    +            } else {
    +                # Script block
    +                $p5 = strpos($sCode, '');
    +                if ($p3 < $p5) {
    +                    $p4 = strpos($tmp, '', $p3);
    +                    $tmp2 = substr($tmp, $p3, (($p4 - $p3) + 9));
    +                    $IEscriptblocks[$c][] = $tmp2;
    +                    $IEtmp[] = $tmp2;
    +                }
    +            }
    +            $p3 = strpos($tmp, '', $p3);
    +            $tmp2 = substr($tmp, $p3, (($p4 - $p3) + 8));
    +            $IEstyles[$c][] = $tmp2;
    +            $IEtmp[] = $tmp2;
    +            $p3 = strpos($tmp, '', $p1);
    +        $tmp = substr($sCode, $p1, (($p2 - $p1) + 1));
    +        if ((strpos(strtolower($tmp), 'rel="stylesheet"')) || (strpos(strtolower($tmp), "rel='stylesheet'"))) {
    +            if ((strpos(strtolower($tmp), 'type="text/css"')) || (strpos(strtolower($tmp), "type='text/css'"))) {
    +                # Extract the path and filename
    +                $url = '';
    +                $p3 = strpos($tmp, 'href=');
    +                if ($p3 !== false) { # shouldn't happen, an address is needed
    +                    $p3 += 6;
    +                    $char = substr($tmp, ($p3 - 1), 1);
    +                    $p4 = strpos($tmp, $char, $p3);
    +                    $url = substr($tmp, $p3, ($p4 - $p3));
    +                    # Clean the url from unnessecary path information (just leave the folder name like "css/xxx.css")
    +                    $url = str_replace($cfgClient[$client]['path']['htmlpath'], '', $url);
    +                    $url = ((substr($url, 0, 1) == '/') ? substr($url, 1) : $url);
    +                }
    +                # Exclude files with complete URLs or parameters
    +                if ((substr($url, 0, 7) != 'http://') && (substr($url, 0, 8) != 'https://') && (strpos($url, '?') === false)) {
    +                    # Sort into array grouped by media type
    +                    $p3 = strpos($tmp, 'media=');
    +                    if ($p3 !== false) {
    +                        $p3 += 7;
    +                        $char = substr($tmp, ($p3 - 1), 1);
    +                        $p4 = strpos($tmp, $char, $p3);
    +                        $media = substr($tmp, $p3, ($p4 - $p3));
    +                        $stylesheets[$media][] = array('url' => $url, 'old' => $tmp);
    +                    } else {
    +                        $stylesheets['all'][] = array('url' => $url, 'old' => $tmp);
    +                    }
    +                }
    +            }
    +        }
    +        $p1 = strpos($sCode, '', $p1);
    +        $tmp = substr($sCode, $p1, (($p2 - $p1) + 8));
    +        $styles[] = $tmp;
    +        $p1 = strpos($sCode, ' $sheets) {
    +        # Correct or compress?
    +        if ($switch == 'correct') {
    +            for ($i = 0, $n = count($sheets); $i < $n; $i ++) {
    +                # Remove the old links for this media type
    +                if (strlen($sheets[$i]['url'])) {
    +                    $sCode = str_replace($sheets[$i]['old'], '', $sCode);
    +                }
    +                # Add the links to the end of the head section
    +                $p1 = strpos($sCode, '');
    +                if (strlen($sheets[$i]['url'])) {
    +                    $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +                }
    +            }
    +        } else {
    +            # Call the compressor class for each media type and replace the old links with the single new one
    +            $files = array();
    +            for ($i = 0, $n = count($sheets); $i < $n; $i ++) {
    +                if (strlen($sheets[$i]['url'])) {
    +                    # Find and extract included stylesheet files
    +                    if (is_file($cfgClient[$client]['path']['frontend'] . $sheets[$i]['url'])) {
    +                        $content = file_get_contents($cfgClient[$client]['path']['frontend'] . $sheets[$i]['url']);
    +                        if (strrpos($sheets[$i]['url'], '/') > 0) {
    +                            $path = substr($sheets[$i]['url'], 0, (strrpos($sheets[$i]['url'], '/') + 1));
    +                        } else {
    +                            $path = '';
    +                        }
    +                        $p1 = strpos(strtolower($content), '@import url(');
    +                        while ($p1 !== false) {
    +                            $p2 = strpos($content, ');', $p1);
    +                            $url = str_replace(array('"', "'"), '', substr($content, ($p1 + 12), ($p2 - $p1 - 12)));
    +                            # Clean the url from unnessecary path information (just leave the folder name like "css/xxx.css")
    +                            $url = str_replace($cfgClient[$client]['path']['htmlpath'], '', $url);
    +                            $url = ((substr($url, 0, 1) == '/') ? substr($url, 1) : $url);
    +                            # Exclude files with complete URLs or parameters
    +                            if ((substr($url, 0, 7) != 'http://') && (substr($url, 0, 8) != 'https://') && (strpos($url, '?') === false)) {
    +                                $files[] = $path . $url;
    +                            } else {
    +                                # Files with absolute paths must be placed in the HTML head section
    +                                $p1 = strpos($sCode, '');
    +                                $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +                            }
    +                            $content = substr($content, 0, $p1) . substr($content, ($p2 + 2));
    +                            $p1 = strpos(strtolower($content), '@import url(');
    +                        }
    +                        # Is there any content left in this file?
    +                        if (strlen(trim(str_replace(array("\r", "\n"), '', $content)))) {
    +                            # Yes, add it to the compressor, which will include it's remaining content in the compressed file
    +                            $files[] = $sheets[$i]['url'];
    +                        }
    +                    }
    +                }
    +            }
    +            if (count($files)) {
    +                $compressed = Output_Compressor::generate($cfgClient[$client]['path']['frontend'] . 'cache/', $files, 'css', $cfgClient[$client]['path']['htmlpath']);
    +                # Add the compressed file link to the end of the head section
    +                $p1 = strpos($sCode, '');
    +                $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +            }
    +            # Remove the old links for this media type
    +            for ($i = 0, $n = count($sheets); $i < $n; $i ++) {
    +                if (strlen($sheets[$i]['url'])) {
    +                    $sCode = str_replace($sheets[$i]['old'], '', $sCode);
    +                }
    +            }
    +        }
    +    }
    +    unset($stylesheets);
    +    unset($media);
    +    unset($sheets);
    +    
    +    # Rebuild the code for the IE-commented stylesheets
    +    if (count($IElinks)) {
    +        foreach ($IElinks as $condition => $links) {
    +            # Add the conditional comment start tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $condition . "\n" . substr($sCode, $p1);
    +            # Put the links there
    +            foreach ($links as $media => $sheets) {
    +                # Correct or compress?
    +                if ($switch == 'correct') {
    +                    for ($i = 0, $n = count($sheets); $i < $n; $i ++) {
    +                        # Remove the old links for this media type
    +                        if (strlen($sheets[$i]['url'])) {
    +                            $sCode = str_replace($sheets[$i]['old'], '', $sCode);
    +                        }
    +                        # Add the links to the end of the head section
    +                        $p1 = strpos($sCode, '');
    +                        if (strlen($sheets[$i]['url'])) {
    +                            $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +                        }
    +                    }
    +                } else {
    +                    # Call the compressor class for each media type and replace the old links with the single new one
    +                    $files = array();
    +                    for ($i = 0, $n = count($sheets); $i < $n; $i ++) {
    +                        if (strlen($sheets[$i]['url'])) {
    +                            # Find and extract included stylesheet files
    +                            $content = file_get_contents($cfgClient[$client]['path']['frontend'] . $sheets[$i]['url']);
    +                            if (strrpos($sheets[$i]['url'], '/') > 0) {
    +                                $path = substr($sheets[$i]['url'], 0, (strrpos($sheets[$i]['url'], '/') + 1));
    +                            } else {
    +                                $path = '';
    +                            }
    +                            $p1 = strpos(strtolower($content), '@import url(');
    +                            while ($p1 !== false) {
    +                                $p2 = strpos($content, ');', $p1);
    +                                $url = str_replace(array('"', "'"), '', substr($content, ($p1 + 12), ($p2 - $p1 - 12)));
    +                                # Clean the url from unnessecary path information (just leave the folder name like "css/xxx.css")
    +                                $url = str_replace($cfgClient[$client]['path']['htmlpath'], '', $url);
    +                                $url = ((substr($url, 0, 1) == '/') ? substr($url, 1) : $url);
    +                                # Exclude files with complete URLs or parameters
    +                                if ((substr($url, 0, 7) != 'http://') && (substr($url, 0, 8) != 'https://') && (strpos($url, '?') === false)) {
    +                                    $files[] = $path . $url;
    +                                } else {
    +                                    # Files with absolute paths must be placed in the HTML head section
    +                                    $p1 = strpos($sCode, '');
    +                                    $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +                                }
    +                                $content = substr($content, 0, $p1) . substr($content, ($p2 + 2));
    +                                $p1 = strpos(strtolower($content), '@import url(');
    +                            }
    +                            # Is there any content left in this file?
    +                            if (strlen(trim(str_replace(array("\r", "\n"), '', $content)))) {
    +                                # Yes, add it to the compressor, which will include it's remaining content in the compressed file
    +                                $files[] = $sheets[$i]['url'];
    +                            }
    +                        }
    +                    }
    +                    # Make the paths absolute for the compressor
    +                    for ($i = 0, $n = count($files); $i < $n; $i ++) {
    +                        $files[$i] = $cfgClient[$client]['path']['frontend'] . $files[$i];
    +                    }
    +                    # Compress the files into a single one
    +                    $compressed = Output_Compressor::generate($cfgClient[$client]['path']['frontend'] . 'cache/', $files, 'css', $cfgClient[$client]['path']['htmlpath']);
    +                    # Add the compressed file link to the end of the head section
    +                    $p1 = strpos($sCode, '');
    +                    $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +                    # Remove the old links for this media type
    +                    for ($i = 0, $n = count($sheets); $i < $n; $i ++) {
    +                        if (strlen($sheets[$i]['url'])) {
    +                            $sCode = str_replace($sheets[$i]['old'], '', $sCode);
    +                        }
    +                    }
    +                }
    +            }
    +            # Add the conditional comment end tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($IElinks);
    +    unset($condition);
    +    unset($links);
    +    unset($media);
    +    unset($sheets);
    +    unset($files);
    +    
    +    # Rebuild the code for the style blocks
    +    if (count($styles)) {
    +        for ($i = 0, $n = count($styles); $i < $n; $i ++) {
    +            $sCode = str_replace($styles[$i], '', $sCode);
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $styles[$i] . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($styles);
    +    
    +    # Rebuild the code for the IE-commented style blocks
    +    if (count($IEstyles)) {
    +        foreach ($IEstyles as $condition => $styles) {
    +            # Add the conditional comment start tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $condition . "\n" . substr($sCode, $p1);
    +            # Put the style blocks there
    +            for ($i = 0, $n = count($styles); $i < $n; $i ++) {
    +                $p1 = strpos($sCode, '');
    +                $sCode = substr($sCode, 0, $p1) . $styles[$i] . "\n" . substr($sCode, $p1);
    +            }
    +            # Add the conditional comment end tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($IEstyles);
    +    unset($condition);
    +    unset($styles);
    +    
    +    # Find all script link tags and script blocks
    +    $scripts = array();
    +    $scriptblocks = array();
    +    $p1 = strpos($sCode, '', $p1);
    +        # Check if this is included code, or code directly in the page
    +        if (substr($sCode, $p2, 10) == '>') {
    +            # Script link
    +            $tmp = substr($sCode, $p1, (($p2 - $p1) + 10));
    +            # Check if this script tag has a type or language set
    +            $p3 = strpos($tmp, 'type=');
    +            if ($p3 !== false) {
    +                $p3 += 6;
    +                $char = substr($tmp, ($p3 - 1), 1);
    +                $p4 = strpos($tmp, $char, $p3);
    +                $type = substr($tmp, $p3, ($p4 - $p3));
    +                # If type isn't "text/javascript", leave the tag alone
    +                if (strtolower($type) != 'text/javascript') {
    +                    $p1 = strpos($sCode, ' $url, 'compress' => $compress, 'old' => $tmp);
    +        } else {
    +            # Script block
    +            $p3 = strpos($sCode, '');
    +            if ($p1 < $p3) {
    +                $p2 = strpos($sCode, '', $p1);
    +                $tmp = substr($sCode, $p1, (($p2 - $p1) + 9));
    +                $scriptblocks[] = $tmp;
    +            }
    +            $p1 = strpos($sCode, '';
    +                    # Add the link to the end of the head section
    +                    $p1 = strpos($sCode, '');
    +                    $sCode = substr($sCode, 0, $p1) . $tmp . "\n" . substr($sCode, $p1);
    +                    $files = array();
    +                }
    +                # Create the link code
    +                $tmp = '';
    +                # Add the link to the end of the head section
    +                $p1 = strpos($sCode, '');
    +                $sCode = substr($sCode, 0, $p1) . $tmp . "\n" . substr($sCode, $p1);
    +            } else {
    +                $files[] = $cfgClient[$client]['path']['frontend'] . $scripts[$i]['url'];
    +            }
    +        }
    +        if (count($files)) {
    +            # Compress the files into one single file
    +            $compressed = Output_Compressor::generate($cfgClient[$client]['path']['frontend'] . 'cache/', $files, 'js', $cfgClient[$client]['path']['htmlpath']);
    +            $tmp = '';
    +            # Add the link to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $tmp . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($scripts);
    +    unset($type);
    +    unset($lang);
    +    unset($files);
    +    
    +    # Rebuild the code for the script blocks
    +    if (count($scriptblocks)) {
    +        for ($i = 0, $n = count($scriptblocks); $i < $n; $i ++) {
    +            $sCode = str_replace($scriptblocks[$i], '', $sCode);
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $scriptblocks[$i] . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($scriptblocks);
    +    
    +    # Rebuild the code for the IE-commented script links
    +    if (count($IEscripts)) {
    +        foreach ($IEscripts as $condition => $links) {
    +            # Add the conditional comment start tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $condition . "\n" . substr($sCode, $p1);
    +            # Put the links there
    +            # Call the compressor class and replace the old script links with the single new one
    +            $files = array();
    +            if (count($links)) {
    +                for ($i = 0, $n = count($links); $i < $n; $i ++) {
    +                    # Correct or compress?
    +                    if (($switch == 'correct') || ($links[$i]['compress'] == false)) {
    +                        # First, if we have files in our array, compress them and output them as a single file (needed to presave the loading order)
    +                        if (count($files)) {
    +                            $compressed = Output_Compressor::generate($cfgClient[$client]['path']['frontend'] . 'cache/', $files, 'js', $cfgClient[$client]['path']['htmlpath']);
    +                            $tmp = '';
    +                            # Add the link to the end of the head section
    +                            $p1 = strpos($sCode, '');
    +                            $sCode = substr($sCode, 0, $p1) . $tmp . "\n" . substr($sCode, $p1);
    +                            $files = array();
    +                        }
    +                        # Create the link code
    +                        $tmp = '';
    +                        # Add the link to the end of the head section
    +                        $p1 = strpos($sCode, '');
    +                        $sCode = substr($sCode, 0, $p1) . $tmp . "\n" . substr($sCode, $p1);
    +                    } else {
    +                        $files[] = $cfgClient[$client]['path']['frontend'] . $links[$i]['url'];
    +                    }
    +                }
    +                if (count($files)) {
    +                    # Compress the files into one single file
    +                    $compressed = Output_Compressor::generate($cfgClient[$client]['path']['frontend'] . 'cache/', $files, 'js', $cfgClient[$client]['path']['htmlpath']);
    +                    $tmp = '';
    +                    # Add the link to the end of the head section
    +                    $p1 = strpos($sCode, '');
    +                    $sCode = substr($sCode, 0, $p1) . $tmp . "\n" . substr($sCode, $p1);
    +                }
    +            }
    +            # Add the conditional comment end tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . '' . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($IEscripts);
    +    unset($condition);
    +    unset($links);
    +    
    +    # Rebuild the code for the IE-commented script blocks
    +    if (count($IEscriptblocks)) {
    +        foreach ($IEscriptblocks as $condition => $link) {
    +            # Add the conditional comment start tag to the end of the head section
    +            $p1 = strpos($sCode, '');
    +            $sCode = substr($sCode, 0, $p1) . $condition . "\n" . $link . "\n" . '' . "\n" . substr($sCode, $p1);
    +        }
    +    }
    +    unset($IEscriptblocks);
    +    unset($condition);
    +    unset($link);
    +    
    +    # Convert non unix type line breaks to unix type line breaks
    +    $sCode = str_replace(array("\r\n", "\r"), "\n", $sCode);
    +    
    +    if ($switch == 'full') {
    +        # Remove preceding and trailing spaces from each line
    +        $aCnt = explode("\n", $sCode);
    +        for ($i = 0, $n = count($aCnt); $i < $n; $i ++) {
    +            $aCnt[$i] = trim($aCnt[$i]);
    +        }
    +        $sCode = implode("\n", $aCnt);
    +    }
    +    
    +    # Remove blank lines
    +    $aLines = explode("\n", $sCode);
    +    $sCode = '';
    +    for ($i = 0, $n = count($aLines); $i < $n; $i ++) {
    +        if (strlen(trim($aLines[$i]))) {
    +            $sCode .= $aLines[$i] . "\n";
    +        }
    +    }
    +/*
    +    while (strpos($sCode, "\n\n") !== false) {
    +        $sCode = str_replace("\n\n", "\n", $sCode);
    +    }
    +*/
    +    
    +    # Do some more cleanup
    +    unset($tmp);
    +    unset($char);
    +    unset($url);
    +    unset($p1);
    +    unset($p2);
    +    unset($p3);
    +    unset($p4);
    +    unset($p5);
    +    
    +    # Compress the HTML code?
    +    if ((strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) && (extension_loaded('zlib')) && (!ini_get("zlib.output_compression"))) {
    +        header('Content-Encoding: gzip');
    +        $sCode = gzencode($sCode, 6, FORCE_GZIP);
    +    }
    +    
    +    # Return the new page code
    +    return $sCode;
    +}
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/chains/includes/old.config.plugin.php b/conlite/plugins/chains/includes/old.config.plugin.php
    new file mode 100755
    index 0000000..9fe9472
    --- /dev/null
    +++ b/conlite/plugins/chains/includes/old.config.plugin.php
    @@ -0,0 +1,44 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * 
    + * {@internal 
    + *   created 
    + *
    + *   $Id: config.plugin.php 2 2011-07-20 12:00:48Z oldperl $: 
    + * }}
    + * 
    + */
    + 
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +global $_cecRegistry, $cfg;
    +
    +#$cfg['plugins']['frontendlogic'][] = "category";
    +
    +cInclude("plugins", "chains/includes/include.chain.frontend.cat_backendaccess.php");
    +cInclude("plugins", "chains/includes/include.chain.frontend.cat_access.php");
    +//cInclude("plugins", "chains/includes/include.chain.content.createmetatags.php");
    +cInclude("plugins", "chains/includes/include.chain.frontend.createbasehref.php");
    +
    +$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess");
    +$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess_Backend");
    +//$_cecRegistry->addChainFunction("Contenido.Content.CreateMetatags", "cecCreateMetatags");
    +$_cecRegistry->addChainFunction("Contenido.Frontend.BaseHrefGeneration", "cecCreateBaseHref");
    +?>
    diff --git a/conlite/plugins/content_allocation/classes/class.content_allocation.php b/conlite/plugins/content_allocation/classes/class.content_allocation.php
    new file mode 100644
    index 0000000..05b4a6e
    --- /dev/null
    +++ b/conlite/plugins/content_allocation/classes/class.content_allocation.php
    @@ -0,0 +1,404 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * @since      file available since contenido release <= 4.6
    + * 
    + * {@internal 
    + *   created 2005
    + *   modified 2005-10-27, Willi Man, debug option
    + *   modified 2005-11-16, Willi Man, new method findMatchingContentByContentAllocationByCategories
    + *   modified 2005-11-21, Willi Man, new method findMarchingCOntentByContentAllocation_OR_Categories
    + *   modified 2008-04-06, Holger Librenz, direct mysql_* calls remoced, using DB_ConLite:: methods instead
    + *   modified 2008-07-02, Frederic Schneider, add security fix
    + *
    + *   $Id: class.content_allocation.php 306 2014-03-13 23:03:26Z oldperl $:
    + * }}
    + * 
    + */
    +
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +plugin_include('repository', 'custom/FrontendNavigation.php');
    +
    +class pApiContentAllocation {
    +
    +    /**
    +     * References database object
    +     *
    +     * @var DB_ConLite
    +     */
    +	var $db = null;
    +	var $table = null;
    +	var $lang = null;
    +	var $client = null;
    +
    +	var $treeObj = null;
    +
    +	/**
    +	 *
    +	 * @modified 27.10.2005 new class variable $this->bDebug (if true print debug information)
    +	 */
    +	function pApiContentAllocation () {
    +		global $db, $cfg, $lang, $client;
    +
    +		$this->db = new DB_ConLite;
    +		$this->table = $cfg['tab'];
    +		$this->lang = $lang;
    +		$this->client = $client;
    +
    +		# use this option carefully and only temporary.
    +		# the hidden debug output as html-comments can cause display problems.
    +		$this->bDebug = false;
    +
    +		$this->treeObj = new pApiTree('f31a4384-e5c1-4ede-b1bb-f43657ec73a5');
    +	}
    +
    +	function storeAllocations ($idartlang, $allocations) {
    +		// empty before insert
    +		$this->deleteAllocationsByIdartlang($idartlang);
    +
    +		if (is_array($allocations)) {
    +			foreach ($allocations as $value) {
    +				$sql = "INSERT INTO ".$this->table['pica_alloc_con']." (idpica_alloc, idartlang) VALUES (".Contenido_Security::toInteger($value).", ".Contenido_Security::toInteger($idartlang).")";
    +				$this->db->query($sql);
    +			}
    +		}
    +	}
    +
    +	function deleteAllocations ($idpica_alloc) {
    +		$sql = "DELETE FROM ".$this->table['pica_alloc_con']." WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc);
    +		$this->db->query($sql);
    +	}
    +
    +	function deleteAllocationsByIdartlang ($idartlang) {
    +		$sql = "DELETE FROM ".$this->table['pica_alloc_con']." WHERE idartlang = " . Contenido_Security::toInteger($idartlang);
    +		$this->db->query($sql);
    +	}
    +
    +	function loadAllocations ($idartlang) {
    +		$sql = "SELECT idpica_alloc FROM ".$this->table['pica_alloc_con']." WHERE idartlang = " . Contenido_Security::toInteger($idartlang);
    +		$this->db->query($sql);
    +
    +		$items = array();
    +
    +		while ($this->db->next_record()) {
    +			$items[] = $this->db->f('idpica_alloc');
    +		}
    +		return $items;
    +	}
    +
    +	function loadAllocationsWithNames ($idartlang, $parent, $firstonly = false) {
    +
    +		global $cfg;
    +
    +		$sql = "SELECT ".$cfg['tab']['pica_alloc'].".idpica_alloc FROM ".$cfg['tab']['pica_alloc']."
    +					INNER JOIN ".$cfg['tab']['pica_alloc_con']." ON
    +					".$cfg['tab']['pica_alloc'].".idpica_alloc = ".$cfg['tab']['pica_alloc_con'].".idpica_alloc
    +					WHERE (".$cfg['tab']['pica_alloc'].".parentid = ".Contenido_Security::toInteger($parent).") AND (".$cfg['tab']['pica_alloc_con'].".idartlang=".Contenido_Security::toInteger($idartlang).")
    +					ORDER BY ".$cfg['tab']['pica_alloc'].".sortorder";
    +
    +		$this->db->query($sql);
    +
    +		while ($this->db->next_record()) {
    +			$tmp[$this->db->f("idpica_alloc")] = $this->treeObj->_fetchItemNameLang($this->db->f("idpica_alloc"));
    +
    +			if ($firstonly) {
    +				break;
    +			}
    +
    +		}
    +
    +		return $tmp;
    +	}
    +
    +	/**
    +	 * Build query to find matching content by content allocation
    +	 * @param array $restrictions
    +	 * @return string SQL
    +	 * @modified 17.11.2005 by Willi Man
    +	 */
    +	function findMatchingContent ($restrictions = null, $max = 0)
    +	{
    +		if (!is_array($restrictions)) { return false; }
    +
    +		global $aCategoriesToExclude; # @see config.local.php!
    +		$sql = $this->_buildQuery($restrictions, $aCategoriesToExclude, $max);
    +
    +		return $sql;
    +	}
    +
    +	/**
    +	 * Build query to find matching content by content allocation
    +	 * @param array $restrictions
    +	 * @return string SQL
    +	 */
    +	function _buildQuery ($restrictions, $aCategoriesToExclude, $max) {
    +
    +		global $cfg;
    +
    +		$size = sizeof($restrictions);
    +
    +		if ($size == 0) {
    +			return '';
    +		}
    +
    +		$sql_concat = unserialize('a:78:{i:0;s:2:"aa";i:1;s:2:"ab";i:2;s:2:"ac";i:3;s:2:"ad";i:4;s:2:"ae";i:5;s:2:"af";i:6;s:2:"ag";i:7;s:2:"ah";i:8;s:2:"ai";i:9;s:2:"aj";i:10;s:2:"ak";i:11;s:2:"al";i:12;s:2:"am";i:13;s:2:"an";i:14;s:2:"ao";i:15;s:2:"ap";i:16;s:2:"aq";i:17;s:2:"ar";i:18;s:2:"as";i:19;s:2:"at";i:20;s:2:"au";i:21;s:2:"av";i:22;s:2:"aw";i:23;s:2:"ax";i:24;s:2:"ay";i:25;s:2:"az";i:26;s:2:"ca";i:27;s:2:"cb";i:28;s:2:"cc";i:29;s:2:"cd";i:30;s:2:"ce";i:31;s:2:"cf";i:32;s:2:"cg";i:33;s:2:"ch";i:34;s:2:"ci";i:35;s:2:"cj";i:36;s:2:"ck";i:37;s:2:"cl";i:38;s:2:"cm";i:39;s:2:"cn";i:40;s:2:"co";i:41;s:2:"cp";i:42;s:2:"cq";i:43;s:2:"cr";i:44;s:2:"cs";i:45;s:2:"ct";i:46;s:2:"cu";i:47;s:2:"cv";i:48;s:2:"cw";i:49;s:2:"cx";i:50;s:2:"cy";i:51;s:2:"cz";i:52;s:1:"a";i:53;s:1:"b";i:54;s:1:"c";i:55;s:1:"d";i:56;s:1:"e";i:57;s:1:"f";i:58;s:1:"g";i:59;s:1:"h";i:60;s:1:"i";i:61;s:1:"j";i:62;s:1:"k";i:63;s:1:"l";i:64;s:1:"m";i:65;s:1:"n";i:66;s:1:"o";i:67;s:1:"p";i:68;s:1:"q";i:69;s:1:"r";i:70;s:1:"s";i:71;s:1:"t";i:72;s:1:"u";i:73;s:1:"v";i:74;s:1:"w";i:75;s:1:"x";i:76;s:1:"y";i:77;s:1:"z";}');
    +
    +		$sqlTemplate = "SELECT cal.idart, cal.online, aa.idartlang, cat.idcat FROM {TABLES} WHERE {WHERE} ";
    +
    +		$tables = array();
    +		$where = array();
    +
    +		for ($i = 0; $i < $size; $i++) {
    +			if ($i == 0) { // first
    +				$tables[] = " ".$cfg['tab']['pica_alloc_con']." AS " . $sql_concat[$i];
    +			} else {
    +				$tables[] = " LEFT JOIN ".$cfg['tab']['pica_alloc_con']." AS " . $sql_concat[$i] . " USING (idartlang)";
    +			}
    +			if (is_int((int)$restrictions[$i]) AND $restrictions[$i] > 0)
    +			{
    +				$where[] =  $sql_concat[$i] . ".idpica_alloc = " . $restrictions[$i];
    +			}
    +		}
    +
    +		# fetch only articles which are online
    +		$where[] = 'cal.online = 1';
    +
    +		# fetch only articles which are not in following categories
    +		if (count($aCategoriesToExclude) > 0)
    +		{
    +			$where[] = "cat.idcat NOT IN (".implode(',', $aCategoriesToExclude).")";
    +		}
    +
    +		// join art_lang for idart
    +		$tables[] = " LEFT JOIN ".$this->table['art_lang']." AS cal USING (idartlang)";
    +		$tables[] = " LEFT JOIN ".$this->table['cat_art']." AS cart USING (idart)";
    +		$tables[] = " LEFT JOIN ".$this->table['cat']." as cat USING (idcat)";
    +
    +		$tables = implode('', $tables);
    +		$where = implode(' AND ', $where);
    +
    +		$sql = str_replace('{TABLES}', $tables, $sqlTemplate);
    +		$sql = str_replace('{WHERE}', $where, $sql);
    +
    +		$sql .= " ORDER BY cal.published DESC";
    +
    +		if ($max != 0 && is_integer($max)) {
    +			$sql .= " LIMIT " . $max;
    +		}
    +
    +		if ($this->bDebug) {print "";} # @modified 27.10.2005
    +
    +		return $sql;
    +	}
    +
    +	/**
    +	 * Search articles by content allocation and catgories
    +	 * @param array $aContentAllocation
    +	 * @param array $aCategories
    +	 *
    +	 * @return array of articles
    +	 */
    +	function findMatchingContentByContentAllocationByCategories ($aContentAllocation, $aCategories = array(), $iOffset = 0, $iNumOfRows = 0)
    +	{
    +		if (!is_array($aContentAllocation)) { return array(); }
    +
    +		for ($i = 0; $i < count($aContentAllocation); $i++)
    +		{
    +			if (!is_int((int)$aContentAllocation[$i]) OR !$aContentAllocation[$i] > 0)
    +			{
    +				return array();
    +			}
    +		}
    +
    +		for ($i = 0; $i < count($aCategories); $i++)
    +		{
    +			if (!is_int((int)$aCategories[$i]) OR !$aCategories[$i] > 0)
    +			{
    +				return array();
    +			}
    +		}
    +
    +		$sql = $this->_buildQuery_MatchingContentByContentAllocationByCategories($aContentAllocation, $aCategories, $iOffset, $iNumOfRows);
    +
    +		$this->db->query($sql);
    +
    +	    $aResult = array();
    +		while($oRow = $this->db->getResultObject())
    +		{
    +			$aResult[] = $oRow;
    +		}
    +		return $aResult;
    +
    +	}
    +
    +	/**
    +	 * build SQL query to find articles by content allocation and catgories
    +	 *
    +	 */
    +	function _buildQuery_MatchingContentByContentAllocationByCategories ($aContentAllocation, $aCategories, $iOffset, $iNumOfRows) {
    +
    +		global $cfg;
    +
    +		$size = sizeof($aContentAllocation);
    +
    +		$sql_concat = unserialize('a:78:{i:0;s:2:"aa";i:1;s:2:"ab";i:2;s:2:"ac";i:3;s:2:"ad";i:4;s:2:"ae";i:5;s:2:"af";i:6;s:2:"ag";i:7;s:2:"ah";i:8;s:2:"ai";i:9;s:2:"aj";i:10;s:2:"ak";i:11;s:2:"al";i:12;s:2:"am";i:13;s:2:"an";i:14;s:2:"ao";i:15;s:2:"ap";i:16;s:2:"aq";i:17;s:2:"ar";i:18;s:2:"as";i:19;s:2:"at";i:20;s:2:"au";i:21;s:2:"av";i:22;s:2:"aw";i:23;s:2:"ax";i:24;s:2:"ay";i:25;s:2:"az";i:26;s:2:"ca";i:27;s:2:"cb";i:28;s:2:"cc";i:29;s:2:"cd";i:30;s:2:"ce";i:31;s:2:"cf";i:32;s:2:"cg";i:33;s:2:"ch";i:34;s:2:"ci";i:35;s:2:"cj";i:36;s:2:"ck";i:37;s:2:"cl";i:38;s:2:"cm";i:39;s:2:"cn";i:40;s:2:"co";i:41;s:2:"cp";i:42;s:2:"cq";i:43;s:2:"cr";i:44;s:2:"cs";i:45;s:2:"ct";i:46;s:2:"cu";i:47;s:2:"cv";i:48;s:2:"cw";i:49;s:2:"cx";i:50;s:2:"cy";i:51;s:2:"cz";i:52;s:1:"a";i:53;s:1:"b";i:54;s:1:"c";i:55;s:1:"d";i:56;s:1:"e";i:57;s:1:"f";i:58;s:1:"g";i:59;s:1:"h";i:60;s:1:"i";i:61;s:1:"j";i:62;s:1:"k";i:63;s:1:"l";i:64;s:1:"m";i:65;s:1:"n";i:66;s:1:"o";i:67;s:1:"p";i:68;s:1:"q";i:69;s:1:"r";i:70;s:1:"s";i:71;s:1:"t";i:72;s:1:"u";i:73;s:1:"v";i:74;s:1:"w";i:75;s:1:"x";i:76;s:1:"y";i:77;s:1:"z";}');
    +
    +		$sqlTemplate = "SELECT cal.idart, cal.online, aa.idartlang, cat.idcat, aa.idpica_alloc FROM {TABLES} WHERE {WHERE} ";
    +
    +		$tables = array();
    +		$where = array();
    +
    +		for ($i = 0; $i < $size; $i++)
    +		{
    +			if ($i == 0)
    +			{ // first
    +				$tables[] = " ".$cfg['tab']['pica_alloc_con']." AS " . $sql_concat[$i];
    +			} else {
    +				$tables[] = " LEFT JOIN ".$cfg['tab']['pica_alloc_con']." AS " . $sql_concat[$i] . " USING (idartlang)";
    +			}
    +			if (is_int((int)$aContentAllocation[$i]) AND $aContentAllocation[$i] > 0)
    +			{
    +				$where[] =  $sql_concat[$i] . ".idpica_alloc = " . $aContentAllocation[$i];
    +			}
    +		}
    +
    +		# fetch only articles which are online
    +		$where[] = 'cal.online = 1';
    +
    +		# fetch only articles in following categories
    +		if (count($aCategories) > 0)
    +		{
    +			$where[] = "cat.idcat IN (".implode(',', $aCategories).")";
    +		}
    +
    +		// join art_lang for idart
    +		$tables[] = " LEFT JOIN ".$this->table['art_lang']." AS cal USING (idartlang)";
    +		$tables[] = " LEFT JOIN ".$this->table['cat_art']." AS cart USING (idart)";
    +		$tables[] = " LEFT JOIN ".$this->table['cat']." as cat USING (idcat)";
    +
    +		$tables = implode('', $tables);
    +		$where = implode(' AND ', $where);
    +
    +		$sql = str_replace('{TABLES}', $tables, $sqlTemplate);
    +		$sql = str_replace('{WHERE}', $where, $sql);
    +
    +		$sql .= " ORDER BY cal.published DESC";
    +
    +		if (is_integer($iNumOfRows) AND $iNumOfRows > 0)
    +		{
    +			$sql .= " LIMIT ". $iOffset .", ".$iNumOfRows;
    +		}
    +
    +		if ($this->bDebug) {print "";} # @modified 27.10.2005
    +
    +		return $sql;
    +	}
    +
    +	/**
    +	 * Search articles by catgories without start articles
    +	 * @param array $aCategories
    +	 * @param int $iOffset
    +	 * @param int $iNumOfRows
    +	 * @param string $sResultType element of {article_id, object}
    +	 *
    +	 * @return array of articles
    +	 */
    +	function findMatchingContentByCategories ($aCategories = array(), $iOffset = 0, $iNumOfRows = 0, $sResultType = '')
    +	{
    +
    +		for ($i = 0; $i < count($aCategories); $i++)
    +		{
    +			if (!is_int((int)$aCategories[$i]) OR !$aCategories[$i] > 0)
    +			{
    +				return array();
    +			}
    +		}
    +
    +		$sql = $this->_buildQuery_MatchingContentByCategories($aCategories, $iOffset, $iNumOfRows);
    +
    +		$this->db->query($sql);
    +
    +		$aResult = array();
    +
    +		while($oRow = $this->db->getResultObject())
    +		{
    +			if ($sResultType == 'article_language_id')
    +			{
    +				$aResult[] = $oRow->idartlang;
    +			}else
    +			{
    +				$aResult[] = $oRow;
    +			}
    +		}
    +		return $aResult;
    +
    +	}
    +
    +	/**
    +	 * build SQL query to find articles by catgories
    +	 *
    +	 */
    +	function _buildQuery_MatchingContentByCategories ($aCategories, $iOffset, $iNumOfRows)
    +	{
    +
    +		if (count($aCategories) > 0)
    +		{
    +			$sWHERE_Category_IN = " c.idcat IN (".implode(',', $aCategories).") AND ";
    +		}else
    +		{
    +			$sWHERE_Category_IN = '';
    +		}
    +		if (is_integer($iNumOfRows) AND $iNumOfRows > 0)
    +		{
    +			$sLimit = " LIMIT ". Contenido_Security::toInteger($iOffset) .", " . Contenido_Security::toInteger($iNumOfRows);
    +		}else
    +		{
    +			$sLimit = '';
    +		}
    +
    +		$sql = '
    +		SELECT
    +            a.idart, a.online, a.idartlang, c.idcat
    +        FROM
    +            '.$this->table['art_lang'].' AS a,
    +            '.$this->table['art'].' AS b,
    +            '.$this->table['cat_art'].' AS c,
    +            '.$this->table['cat_lang'].' AS d
    +        WHERE
    +			'.$sWHERE_Category_IN.'
    +            b.idclient = '.Contenido_Security::toInteger($this->client).' AND
    +            a.idlang = '.Contenido_Security::toInteger($this->lang).' AND
    +            a.idartlang != d.startidartlang AND
    +            a.online = 1 AND
    +			c.idcat = d.idcat AND
    +            b.idart = c.idart AND
    +            a.idart = b.idart
    +			'.$sLimit.' ';
    +
    +		if ($this->bDebug) {print "";}
    +
    +		return $sql;
    +	}
    +
    +}
    +
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/content_allocation/classes/class.content_allocation_article.php b/conlite/plugins/content_allocation/classes/class.content_allocation_article.php
    new file mode 100644
    index 0000000..0459e5b
    --- /dev/null
    +++ b/conlite/plugins/content_allocation/classes/class.content_allocation_article.php
    @@ -0,0 +1,117 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * @since      file available since contenido release <= 4.6
    + * 
    + * {@internal 
    + *   created unknown
    + *   modified 2008-07-02, Frederic Schneider, add security fix
    + *
    + *   $Id: class.content_allocation_article.php 2 2011-07-20 12:00:48Z oldperl $:
    + * }}
    + * 
    + */
    +
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +class pApiContentAllocationArticle extends pApiTree {
    +
    +	var $tpl = null;
    +	var $template = '';
    +
    +	var $load = array();
    +
    +	function pApiContentAllocationArticle ($uuid) {
    +		global $cfg;
    +		
    +		parent::pApiTree($uuid);
    +		$this->tpl = new Template;
    +		$this->template = $cfg['pica']['treetemplate_article'];
    +	}
    +	
    +	function _buildRenderTree ($tree) {
    +		global $action, $frame, $area, $sess, $idart;
    +		
    +		$result = array();
    +		foreach ($tree as $item_tmp) {
    +			$item = array();
    +			
    +			$expandCollapseImg = 'images/spacer.gif';
    +			$expandCollapse = '';
    +			
    +			$item['ITEMNAME'] = $expandCollapse . ' ' . $item_tmp['name'];
    +			
    +			$item['ITEMINDENT'] = $item_tmp['level'] * 15 + 3;
    +			
    +			// set checked!
    +			$checked = '';
    +			if (in_array($item_tmp['idpica_alloc'], $this->load)) {
    +				$checked = ' checked="checked"';	
    +			}
    +			$item['CHECKBOX'] = '';
    +			
    +			array_push($result, $item);
    +			
    +			if ($item_tmp['children']) {
    +				$children = $this->_buildRenderTree($item_tmp['children']);
    +				$result = array_merge($result, $children);	
    +			}
    +		}
    +		
    +		return $result;
    +	}
    +	
    +	function setChecked($load) {
    +		$this->load = $load;	
    +	}
    +	
    +	function renderTree ($return = true) {
    +		$this->tpl->reset();
    +		
    +		$tree = $this->fetchTree();
    +		if ($tree === false) {
    +			return false;	
    +		}
    +
    +		$tree = $this->_buildRenderTree($tree);
    +		
    +		$even = true;
    +		foreach ($tree as $item) {
    +			$even = !$even;
    +			$bgcolor = ($even) ? '#FFFFFF' : '#F1F1F1';
    +			$this->tpl->set('d', 'BACKGROUND_COLOR', $bgcolor);
    +			foreach ($item as $key => $value) {
    +				$this->tpl->set('d', $key, $value);
    +			}
    +			$this->tpl->next();
    +		}
    +		
    +		$this->tpl->set('s', "CATEGORY", i18n("Category"));
    +		
    +		if ($return === true) {
    +			return $this->tpl->generate($this->template, true);
    +		} else {
    +			$this->tpl->generate($this->template);
    +		}
    +	}
    +}
    +
    +?>
    \ No newline at end of file
    diff --git a/conlite/plugins/content_allocation/classes/class.content_allocation_complexlist.php b/conlite/plugins/content_allocation/classes/class.content_allocation_complexlist.php
    new file mode 100644
    index 0000000..9c37eea
    --- /dev/null
    +++ b/conlite/plugins/content_allocation/classes/class.content_allocation_complexlist.php
    @@ -0,0 +1,113 @@
    +
    + * @license    http://www.contenido.org/license/LIZENZ.txt
    + * @link       http://www.4fb.de
    + * @link       http://www.contenido.org
    + * @since      file available since contenido release <= 4.6
    + * 
    + * {@internal 
    + *   created unknown
    + *   modified 2008-07-02, Frederic Schneider, add security fix
    + *
    + *   $Id: class.content_allocation_complexlist.php 2 2011-07-20 12:00:48Z oldperl $:
    + * }}
    + * 
    + */
    +
    +if(!defined('CON_FRAMEWORK')) {
    +	die('Illegal call');
    +}
    +
    +class pApiContentAllocationComplexList extends pApiTree {
    +
    +	var $idSetter = true;
    +	var $load = array();
    +
    +	function pApiContentAllocationComplexList ($uuid) {
    +		global $cfg;
    +		parent::pApiTree($uuid);
    +	}
    +	
    +	function _buildRenderTree ($tree) {
    +		global $action, $frame, $area, $sess, $idart;
    +		
    +		$oldIdSetter = $this->idSetter;
    +		$this->idSetter = false;
    +		
    +		$result = '';
    +		
    +		$even = true;
    +
    +		$levelElms = sizeof($tree);
    +		$cnt = 1;
    +		foreach ($tree as $item_tmp) {
    +			$item = '';
    +			$checked = '';
    +			if (in_array($item_tmp['idpica_alloc'], $this->load)) {
    +				$checked = ' checked="checked"';	
    +			}
    +			
    +			$li_closeElm = '';
    +			if ($cnt == $levelElms) {
    +				$li_closeElm = 'style="border-bottom: 0;"';
    +			}
    +			$cnt++;
    +			
    +			$even = !$even;
    +			$bgcolor = ($even) ? 'bright' : 'dark';
    +			
    +			// for wrapping purposes
    +			$item_tmp['name'] = str_replace('-', '- ', $item_tmp['name']);
    +			
    +			$checkbox = '';
    +			$item = "\n
  • " . $checkbox . " " . $item_tmp['name']; + + $result .= $item; + + if ($item_tmp['children']) { + $children = $this->_buildRenderTree($item_tmp['children']); + $result .= "\n
      " . $children . ""; + } else { + $result .= "\n"; + } + } + + if ($oldIdSetter === true) { + return "\n
        " . $result . "\n
      "; + } else { + return $result . "\n
    "; + } + } + + function setChecked($load) { + $this->load = $load; + } + + function renderTree ($return = true) { + $tree = $this->fetchTree(); + if ($tree === false) { + return false; + } + + $tree = $this->_buildRenderTree($tree); + if ($return === true) { + return $tree; + } + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/classes/class.content_allocation_selectbox.php b/conlite/plugins/content_allocation/classes/class.content_allocation_selectbox.php new file mode 100644 index 0000000..5305198 --- /dev/null +++ b/conlite/plugins/content_allocation/classes/class.content_allocation_selectbox.php @@ -0,0 +1,99 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: class.content_allocation_selectbox.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +class pApiContentAllocationSelectBox extends pApiTree { + + var $idSetter = true; + var $load = array(); + + function pApiContentAllocationComplexList ($uuid) { + global $cfg; + + parent::pApiTree($uuid); + } + + function _buildRenderTree ($tree) { + global $action, $frame, $area, $sess, $idart; + + $oldIdSetter = $this->idSetter; + $this->idSetter = false; + + $result = ''; + + $levelElms = sizeof($tree); + $cnt = 1; + foreach ($tree as $item_tmp) { + $item = ''; + + $spacer = '|-'; + $spacer = str_pad($spacer, (($item_tmp['level'] + 1) * 2), "--", STR_PAD_RIGHT); + + $result .= ''; + + if ($item_tmp['children']) { + $children = $this->_buildRenderTree($item_tmp['children']); + $result .= $children; + } + } + + return $result; + } + + function setChecked($load) { + return false; + } + + /** + * + * @modified 27.10.2005 $bUseTreeStatus = false (content allocation tree in selectbox is always expanded) + */ + function renderTree ($return = true, $parentId = false, $bUseTreeStatus = false) { + + $tree = $this->fetchTree($parentId, 0, $bUseTreeStatus); + + if ($tree === false) { + return false; + } + + $tree = $this->_buildRenderTree($tree); + + if ($return === true) { + return $tree; + } else { + echo $tree; + } + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/classes/class.content_allocation_tree.php b/conlite/plugins/content_allocation/classes/class.content_allocation_tree.php new file mode 100644 index 0000000..a3e730f --- /dev/null +++ b/conlite/plugins/content_allocation/classes/class.content_allocation_tree.php @@ -0,0 +1,562 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: class.content_allocation_tree.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Todo + * addslashes to all string db inserts + * check if default language exists if new entry is added (otherwise) + */ +class pApiTree { + + /** + * + */ + var $db = null; + + /** + * + */ + var $table = null; + + /** + * + */ + var $lang = 1; + + /** + * + */ + var $client = 1; + + /** + * + */ + var $defaultLang = 1; + + /** + * + */ + var $logger = null; + + /** + * + */ + var $user = null; + + /** + * + */ + var $treeStatus = array(); + + /** + * + */ + var $uuid = null; + + /** + * + */ + var $_arrInFilters = array('urlencode', 'clHtmlSpecialChars', 'addslashes'); + + /** + * + */ + var $_arrOutFilters = array('stripslashes', 'htmldecode', 'urldecode'); + + function pApiTree ($uuid) { + global $db, $cfg, $lang, $client, $auth; + + $this->db = new DB_ConLite; + $this->table = $cfg['tab']; + $this->lang = $lang; + $this->client = $client; + $this->bDebug = false; + + $this->uuid = $uuid; + + $this->user = new cApiUser($auth->auth["uid"]); + $this->loadTreeStatus(); + } + + /** + * + * @param mixed $parentId + * @param int $level + * @param boolean $bUseTreeStatus (if true use expand/collapsed status of the tree, otherwise not) + * @modified 27.10.2005 Willi Man + */ + function fetchTree ($parentId = false, $level = 0, $bUseTreeStatus = true) { + + // fetch current lang category + $sql = "SELECT + tree.idpica_alloc, tree.parentid, tree.sortorder + FROM + " . $this->table['pica_alloc'] . " as tree"; + + if ($parentId === false) { // fetch from root node + $sql .= " WHERE tree.parentid = '0'"; + } else { // fetch by given id + $sql .= " WHERE tree.parentid = " . Contenido_Security::toInteger($parentId); + } + + $sql .= " ORDER BY sortorder ASC"; + + $this->db->query($sql); + + $result_tmp = array(); // tmp result array + while ($this->db->next_record()) { // walk resultset + $item = $this->_fetchItemNameLang($this->db->f('idpica_alloc')); + + $itemStatus = 'expanded'; + + if ($bUseTreeStatus) # modified 27.10.2005 + { + if (is_array($this->treeStatus) && array_key_exists($this->db->f('idpica_alloc'), $this->treeStatus)) + { + $itemStatus = 'collapsed'; + } + } + + $rs = array ( + 'idpica_alloc' => $this->db->f('idpica_alloc'), + 'parentid' => ($this->db->f('parentid') == NULL) ? false : $this->db->f('parentid'), + 'sortorder' => $this->db->f('sortorder'), + 'name' => $this->_outFilter($item['name']), + 'idlang' => $item['idlang'], + 'level' => $level, + 'status' => $itemStatus, + 'online' => $item['online'] + ); + + array_push($result_tmp, $rs); // append recordset + } + + if (count($result_tmp) > 0) { + $result = array(); // result array + foreach ($result_tmp as $rs) { // run results + $children = $this->fetchTree($rs['idpica_alloc'], $level + 1, $bUseTreeStatus); + if ($children !== false && $rs['status'] == 'expanded') { + $rs['children'] = $children; + } + array_push($result, $rs); + } + return $result; + } else + { + return false; + } + } + + /** + * Fetch content allocation tree + * Consider offline/online status + * + * @created 21.11.2005 Willi Man + * + * @param mixed $parentId + * @param int $level + * @return array with content allocation id's + */ + function fetchTreeIds ($parentId = false, $level = 0, $showOffline = false) { + + // fetch current lang category + $sql = "SELECT + tree.idpica_alloc, tree.parentid, tree.sortorder + FROM + " . $this->table['pica_alloc'] . " as tree"; + + if ($parentId === false) { // fetch from root node + $sql .= " WHERE tree.parentid IS NULL"; + } else { // fetch by given id + $sql .= " WHERE tree.parentid = " . Contenido_Security::toInteger($parentId); + } + + $sql .= " ORDER BY sortorder ASC"; + + if ($this->bDebug) {print "";} + + $this->db->query($sql); + + $result_tmp = array(); // tmp result array + while ($this->db->next_record()) { // walk resultset + + $item = $this->_fetchItemNameLang($this->db->f('idpica_alloc')); + + if ($this->bDebug) {print "";} + + if ($showOffline OR $item['online'] == 1) + { + $rs = array ( + 'idpica_alloc' => $this->db->f('idpica_alloc') + ); + + array_push($result_tmp, $rs); // append recordset + } + } + + if (count($result_tmp) > 0) { + $result = array(); // result array + foreach ($result_tmp as $rs) { // run results + $children = $this->fetchTreeIds($rs['idpica_alloc'], $level + 1, $bUseTreeStatus); + if ($children !== false) { + $rs['children'] = $children; + } + array_push($result, $rs); + } + return $result; + } else + { + return false; + } + } + + function setTreeStatus($idpica_alloc) { + if (is_array($this->treeStatus) && array_key_exists($idpica_alloc, $this->treeStatus)) { // expand + unset($this->treeStatus[$idpica_alloc]); + } else { // collapse + $this->treeStatus[$idpica_alloc] = true; + } + $this->user->setProperty("expandstate", $this->_uuid, serialize($this->treeStatus)); + } + + function loadTreeStatus () { + $status = $this->user->getProperty("expandstate", $this->_uuid); + if ($status !== false) { + $this->treeStatus = unserialize($status); + } + } + + function fetchParent ($idpica_alloc) { + $sql = "SELECT idpica_alloc FROM ".$this->table['pica_alloc']." WHERE parentId = " . Contenido_Security::toInteger($idpica_alloc); + $this->db->query($sql); + + if ($this->db->next_record()) { + return $this->fetchItem($this->db->f('idpica_alloc')); + } else { + return false; + } + } + + function fetchParents () {} + + function fetchLevel ($parentId = false, $showOffline = false) { + // fetch current lang category + $sql = "SELECT + tree.idpica_alloc, tree.parentid, tree.sortorder + FROM + " . $this->table['pica_alloc'] . " as tree + LEFT JOIN ".$this->table['pica_lang']." as treelang USING (idpica_alloc)"; + + if ($parentId === false) { // fetch from root node + $sql .= " WHERE tree.parentid IS NULL"; + } else { // fetch by given id + $sql .= " WHERE tree.parentid = " . Contenido_Security::toInteger($parentId); + } + + if ($showOffline === false) { + $sql .= " AND treelang.online = 1"; + } + + $sql .= " ORDER BY sortorder ASC"; + + $this->db->query($sql); + + $result_tmp = array(); // tmp result array + while ($this->db->next_record()) { // walk resultset + $item = $this->_fetchItemNameLang($this->db->f('idpica_alloc')); + + $itemStatus = 'expanded'; + if (is_array($this->treeStatus) && array_key_exists($this->db->f('idpica_alloc'), $this->treeStatus)) { + $itemStatus = 'collapsed'; + } + + $rs = array ( + 'idpica_alloc' => $this->db->f('idpica_alloc'), + 'parentid' => ($this->db->f('parentid') == NULL) ? false : $this->db->f('parentid'), + 'sortorder' => $this->db->f('sortorder'), + 'name' => $this->_outFilter($item['name']), + 'idlang' => $item['idlang'], + 'level' => 0, + 'status' => $itemStatus, + 'online' => $item['online'] + ); + + array_push($result_tmp, $rs); // append recordset + } + + return $result_tmp; + } + + function storeItem ($treeItem) { + + if (!$treeItem['idpica_alloc']) { // insert + $treeItem['idpica_alloc'] = $this->db->nextid($this->table['pica_alloc']); + $treeItem['sortorder'] = $this->_fetchMaxOrder($treeItem['parentid']) + 1; + + if ($treeItem['parentid'] == 'root') { + $treeItem['parentid'] = 'NULL'; + } + + $treeItem['name'] = $this->_inFilter($treeItem['name']); + + $sql = "INSERT INTO " . $this->table['pica_alloc'] . " + (idpica_alloc, parentid, sortorder) + VALUES + (" . Contenido_Security::toInteger($treeItem['idpica_alloc']) . ", " . Contenido_Security::toInteger($treeItem['parentid']) . ", " . Contenido_Security::toInteger($treeItem['sortorder']) . ")"; + $this->db->query($sql); + + $sql = "INSERT INTO " . $this->table['pica_lang'] . " + (idpica_alloc, idlang, name) + VALUES + (" . Contenido_Security::toInteger($treeItem['idpica_alloc']) . ", " . Contenido_Security::toInteger($this->lang) . ", '" . Contenido_Security::escapeDB($treeItem['name'], $this->db) . "')"; + $this->db->query($sql); + + } else { // update + $treeItem['name'] = $this->_inFilter($treeItem['name']); + + $sql = "SELECT * FROM " . $this->table['pica_lang'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($treeItem['idpica_alloc']) . " AND idlang = " . Contenido_Security::toInteger($this->lang); + $this->db->query($sql); + + if ($this->db->num_rows() > 0) { + #Update existing translation + $sql = "UPDATE " . $this->table['pica_lang'] . " SET name = '" . Contenido_Security::escapeDB($treeItem['name'], $this->db) . "' WHERE idpica_alloc = " . Contenido_Security::toInteger($treeItem['idpica_alloc']) . " + AND idlang = " . Contenido_Security::toInteger($this->lang); + } else { + #Get current online status for item + $sql = "SELECT * FROM " . $this->table['pica_lang'] . " WHERE idpica_alloc = " . $treeItem['idpica_alloc'] . " ORDER BY idlang"; + $this->db->query($sql); + + if ($this->db->next_record()) { + $online_status = $this->db->f('online'); + } else { + $online_status = 0; + } + + #Insert new translation + $sql = "INSERT INTO " . $this->table['pica_lang'] . "(idpica_alloc, idlang, name, online) VALUES ( ".Contenido_Security::toInteger($treeItem['idpica_alloc']).", ".Contenido_Security::toInteger($this->lang).", + '".Contenido_Security::escapeDB($treeItem['name'], $this->db)."', ".Contenido_Security::toInteger($online_status).")"; + } + + $this->db->query($sql); + } + + return $treeItem; + } + + function setOnline ($idpica_alloc) { + $this->_switchOnOffline($idpica_alloc, 1); + } + + function setOffline ($idpica_alloc) { + $this->_switchOnOffline($idpica_alloc, 0); + } + + function _switchOnOffline ($idpica_alloc, $status) { + $sql = "UPDATE " . $this->table['pica_lang'] . " SET online = " . Contenido_Security::toInteger($status) . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc) . " + AND idlang = " . Contenido_Security::toInteger($this->lang); + $this->db->query($sql); + } + + function itemMoveUp ($idpica_alloc) { + $treeItem = $this->fetchItem($idpica_alloc); + $treeItem_old = $treeItem; + $treeItem['sortorder']--; + + if ($treeItem['sortorder'] < $treeItem_old['sortorder']) { + if ($treeItem['sortorder'] >= 1) { + $this->_decreaseOrder($treeItem['parentid'], $treeItem_old['sortorder']); + $this->_increaseOrder($treeItem['parentid'], $treeItem['sortorder']); + } else { + $treeItem['sortorder'] = $treeItem_old['sortorder']; + } + } + + $sql = "UPDATE " . $this->table['pica_alloc'] . " SET sortorder = " . $treeItem['sortorder'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc); + $this->db->query($sql); + } + + function itemMoveDown () {} + + function deleteItem ($idpica_alloc) { + $sql = "DELETE FROM " . $this->table['pica_alloc'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc); + $this->db->query($sql); + + $sql = "DELETE FROM " . $this->table['pica_lang'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc); + $this->db->query($sql); + + $sql = "DELETE FROM " . $this->table['pica_alloc_con'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc); + $this->db->query($sql); + } + + function fetchItem ($idpica_alloc) { + $sql = "SELECT parentid, sortorder FROM " . $this->table['pica_alloc'] . " WHERE idpica_alloc = " . $idpica_alloc; + $this->db->query($sql); + + $item = $this->_fetchItemNameLang($idpica_alloc); + + if ($this->db->next_record()) { + $row = array ( + 'idpica_alloc' => $idpica_alloc, + 'parentid' => ($this->db->f('parentid') == NULL) ? false : $this->db->f('parentid'), + 'sortorder' => $this->db->f('sortorder'), + 'name' => $item['name'], + 'idlang' => $item['idlang'], + 'online' => $item['online'] + ); + return $row; + } else { + return false; + } + } + + function _fetchItemNameLang ($idpica_alloc) { + $oDB = new DB_ConLite; // temp instance + + $sSQL = "SELECT name, idlang, online FROM " . $this->table['pica_lang'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc) . " AND idlang = " . Contenido_Security::toInteger($this->lang); + $oDB->query($sSQL); + + $aResult = array(); + if ($oDB->next_record()) { // item found for this language + + $aResult['name'] = $this->_outFilter($oDB->f('name')); + $aResult['idlang'] = $oDB->f('idlang'); + $aResult['online'] = $oDB->f('online'); + + } else { // no item in this language found + // fetch alternative language name + // HerrB, 2008-04-21: Get all translations, try to use defaultLang translation, use + // first available, otherwise. Only using defaultLang results in "ghost" elements, if + // created in a non-default language. See CON-110 for details. + + $sSQL = "SELECT name, idlang, online FROM " . $this->table['pica_lang'] . " WHERE idpica_alloc = " . Contenido_Security::toInteger($idpica_alloc) . " ORDER BY idlang"; + $oDB->query($sSQL); + + $aNames = array(); + while ($oDB->next_record()) { + $sKey = "k" . $oDB->f('idlang'); + + $aNames[$sKey] = array(); + $aNames[$sKey]['name'] = $this->_outFilter($oDB->f('name')); + $aNames[$sKey]['idlang'] = $oDB->f('idlang'); + $aNames[$sKey]['online'] = $oDB->f('online'); + } + + if ($aNames["k" . $this->defaultLang]) { + // defaultLang translation available + $aResult = $aNames["k" . $this->defaultLang]; + } else { + // no defaultLang translation available, use first in line (reset returns first element) + $aResult = reset($aNames); + } + } + unset ($oDB); + unset ($aNames); + + return $aResult; + } + + function _fetchMaxOrder ($parentId = false) { + + if ($parentId == 'root') { + $parentId = false; + } + + $sql = "SELECT MAX(sortorder) as max FROM " . $this->table['pica_alloc']; + if ($parentId === false) { + $sql .= " WHERE parentid = 0"; + } else { + $sql .= " WHERE parentid = " . Contenido_Security::toInteger($parentId); + } + $this->db->query($sql); + if ($this->db->next_record()) { + return $this->db->f('max'); + } else { + return 0; + } + } + + function _decreaseOrder ($parentId = false, $fromOrder) { + $sql = "UPDATE " . $this->table['pica_alloc'] . " SET sortorder = sortorder - 1 WHERE sortorder >= " . Contenido_Security::toInteger($fromOrder); + if ($parentId === false) { + $sql .= " AND parentid IS NULL"; + } else { + $sql .= " AND parentid = " . Contenido_Security::toInteger($parentId); + } + $this->db->query($sql); + } + + function _increaseOrder ($parentId = false, $fromOrder) { + $sql = "UPDATE " . $this->table['pica_alloc'] . " SET sortorder = sortorder + 1 WHERE sortorder >= " . Contenido_Security::toInteger($fromOrder); + if ($parentId === false) { + $sql .= " AND parentid IS NULL"; + } else { + $sql .= " AND parentid = " . Contenido_Security::toInteger($parentId); + } + $this->db->query($sql); + } + + function setFilters($arrInFilters = array(), $arrOutFilters = array()) + { + $this->_arrInFilters = $arrInFilters; + $this->_arrOutFilters = $arrOutFilters; + } + + function _inFilter($data) + { + foreach ($this->_arrInFilters as $_function) + { + if (function_exists($_function)) + { + $data = $_function($data); + } + } + + return $data; + } + + function _outFilter($data) + { + foreach ($this->_arrOutFilters as $_function) + { + if (function_exists($_function)) + { + $data = $_function($data); + } + } + + return $data; + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/classes/class.content_allocation_treeview.php b/conlite/plugins/content_allocation/classes/class.content_allocation_treeview.php new file mode 100644 index 0000000..f434910 --- /dev/null +++ b/conlite/plugins/content_allocation/classes/class.content_allocation_treeview.php @@ -0,0 +1,234 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-06-26, Timo Trautmann, changed post var from treeItem to treeItemPost (security issue) + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: class.content_allocation_treeview.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Todo + * - generalize this and papitree !!!! + * - Comments! + */ + +class pApiContentAllocationTreeView extends pApiTree { + + /** + * + */ + var $tpl = null; + + /** + * + */ + var $template = ''; + + /** + * + */ + function pApiContentAllocationTreeView ($uuid) { + global $cfg; + + parent::pApiTree($uuid); + $this->tpl = new Template; + $this->template = $cfg['pica']['treetemplate']; + } + + /** + * + */ + function _buildRenderTree ($tree) { + global $action, $frame, $area, $sess; + $result = array(); + foreach ($tree as $item_tmp) { + $item = array(); + + // update item + if ($_GET['step'] == 'rename' && $item_tmp['idpica_alloc'] == $_GET['idpica_alloc']) { + $item = array(); + + $item['ITEMNAME'] = ' + + + + + + + + + + + + +
      + + +
    + '; + } else { + if ($item_tmp['children'] || $item_tmp['status'] == 'collapsed') { + $expandCollapseImg = 'images/close_all.gif'; + if ($item_tmp['status'] == 'collapsed' ) { + $expandCollapseImg = 'images/open_all.gif'; + } + + $expandCollapse = ''; + } else { + $expandCollapseImg = 'images/spacer.gif'; + $expandCollapse = ''; + } + + $item['ITEMNAME'] = $expandCollapse . ' ' . $item_tmp['name']; + } + + $item['ITEMINDENT'] = $item_tmp['level'] * 15 + 3; + $item['ACTION_CREATE'] = ''.i18n('; + + $item['ACTION_RENAME'] = ''.i18n('; + $item['ACTION_MOVE_UP'] = (count($result) >= 1) ? ''.i18n(' : ''; + $item['ACTION_MOVE_DOWN'] = (count($result) >= 1) ? ''.i18n(' : ''; + $item['ACTION_MOVE_DOWN'] = ''; + + if ($item_tmp['online'] == 1) { // set offline + $item['ACTION_ONOFFLINE'] = ''.i18n('; + } else { + $item['ACTION_ONOFFLINE'] = ''.i18n('; + } + + if ($item_tmp['children']) { + $item['ACTION_DELETE'] = ''.i18n('; + } else { + $item['ACTION_DELETE'] = '
    '.str_replace("'", "\'", $item_tmp['name']).'","deleteCategory('.$item_tmp['idpica_alloc'].')");">'.i18n(
    '; + } + + array_push($result, $item); + + if ($item_tmp['children']) { + $children = $this->_buildRenderTree($item_tmp['children']); + $result = array_merge($result, $children); + } + + // add new item -> show formular + if ($_GET['step'] == 'add' && $item_tmp['idpica_alloc'] == $_GET['parentid']) { + $item = array(); + + $item['ITEMNAME'] = ' + + + + + + + + + + + + +
      + + +
    + '; + $item['ITEMINDENT'] = ($item_tmp['level'] + 1) * 15; + $item['ACTION_CREATE'] = ''; + $item['ACTION_RENAME'] = ''; + $item['ACTION_MOVE_UP'] = ''; + $item['ACTION_MOVE_DOWN'] = ''; + $item['ACTION_MOVE_DOWN'] = ''; + $item['ACTION_DELETE'] = ''; + $item['ACTION_ONOFFLINE'] = ''; + + array_push($result, $item); + } + } + return $result; + } + + /** + * + */ + function renderTree ($return = true) { + $this->tpl->reset(); + + $tree = $this->fetchTree(false, 0, true); # modified 27.10.2005 + + if ($tree === false) { + return false; + } + + $tree = $this->_buildRenderTree($tree); + + $even = true; + foreach ($tree as $item) { + $even = !$even; + $bgcolor = ($even) ? '#FFFFFF' : '#F1F1F1'; + $this->tpl->set('d', 'BACKGROUND_COLOR', $bgcolor); + foreach ($item as $key => $value) { + $this->tpl->set('d', $key, $value); + } + $this->tpl->next(); + } + + $this->tpl->set('s', 'CATEGORY', i18n("Category")); + $this->tpl->set('s', 'ACTIONS', i18n("Actions")); + + if ($return === true) { + return $this->tpl->generate($this->template, true); + } else { + $this->tpl->generate($this->template); + } + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/images/arrow.gif b/conlite/plugins/content_allocation/images/arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..5424e1d0ae5ae6c2184679f3b483ccf49b1ddb1b GIT binary patch literal 56 zcmZ?wbhEHbWMklFXkcXc|NsBWb%zvxvM@3*Ff!;c00Bsbfr;OxE@6fA-USoCY+W*= J`h^ICH2}eB5h(xw literal 0 HcmV?d00001 diff --git a/conlite/plugins/content_allocation/images/call_contentallocation.gif b/conlite/plugins/content_allocation/images/call_contentallocation.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f5165a3205e1151b8a4dbf141cc65a566eee058 GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?Jykg)Op|NjhNp!k!8k%57UK?lSG$ulr%i}cN0c9+q)OURLZ o-P!*9`jD%_iNR*G7G+L7_iJg8RFlTC)^+nXb3JC};9{@_03T8tEC2ui literal 0 HcmV?d00001 diff --git a/conlite/plugins/content_allocation/images/normal.gif b/conlite/plugins/content_allocation/images/normal.gif new file mode 100644 index 0000000000000000000000000000000000000000..035c42c0a4395fe2e4a4c6647a6b21a4197f7140 GIT binary patch literal 112 zcmZ?wbhEHb + * @copyright 2015 CL-Team + * @link http://www.conlite.org + * + * $Id: config.autoloader.php 368 2015-10-27 10:32:42Z oldperl $ + */ + +$sAutoloadClassPath = 'conlite/plugins/content_allocation/classes/'; +return array( + 'pApiContentAllocation' => $sAutoloadClassPath.'class.content_allocation.php', + 'pApiContentAllocationArticle' => $sAutoloadClassPath.'class.content_allocation_article.php', + 'pApiContentAllocationComplexList' => $sAutoloadClassPath.'class.content_allocation_complexlist.php', + 'pApiContentAllocationSelectBox' => $sAutoloadClassPath.'class.content_allocation_selectbox.php', + 'pApiTree' => $sAutoloadClassPath.'class.content_allocation_tree.php', + 'pApiContentAllocationTreeView' => $sAutoloadClassPath.'class.content_allocation_treeview.php' +); +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/includes/config.plugin.php b/conlite/plugins/content_allocation/includes/config.plugin.php new file mode 100644 index 0000000..d4d0ad4 --- /dev/null +++ b/conlite/plugins/content_allocation/includes/config.plugin.php @@ -0,0 +1,65 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: config.plugin.php 275 2013-09-11 12:49:00Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// plugin includes +plugin_include('content_allocation', 'classes/class.content_allocation_tree.php'); +plugin_include('content_allocation', 'classes/class.content_allocation_treeview.php'); +plugin_include('content_allocation', 'classes/class.content_allocation_article.php'); +plugin_include('content_allocation', 'classes/class.content_allocation.php'); +plugin_include('content_allocation', 'classes/class.content_allocation_complexlist.php'); + +// plugin_variables +$cfg['tab']['pica_alloc'] = $cfg['sql']['sqlprefix'].'_pica_alloc'; +$cfg['tab']['pica_alloc_con'] = $cfg['sql']['sqlprefix'].'_pica_alloc_con'; +$cfg['tab']['pica_lang'] = $cfg['sql']['sqlprefix'].'_pica_lang'; + +$cfg['pica']['logpath'] = $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'repository/log/data/'; +$cfg['pica']['loglevel'] = 'warn'; +$cfg['pica']['treetemplate'] = $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'content_allocation/templates/template.tree_structure.html'; +$cfg['pica']['treetemplate_article'] = $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'content_allocation/templates/template.tree_article.html'; +$cfg['pica']['treetemplate_complexlist'] = $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'content_allocation/templates/template.tree_complexlist.html'; + +$cfg['pica']['style_complexlist'] = $cfg['path']['contenido_fullhtml'] . $cfg['path']['plugins'] . 'content_allocation/style/complexlist.css'; +$cfg['pica']['script_complexlist'] = $cfg['path']['contenido_fullhtml'] . $cfg['path']['plugins'] . 'content_allocation/scripts/complexlist.js'; + +// administration > users > area translations +global $lngAct, $_cecRegistry; +$lngAct['con_contentallocation']['storeallocation'] = i18n("Store content allocations", "content_allocation"); + +plugin_include('content_allocation', 'includes/functions.chains.php'); + +$_cecRegistry->addChainFunction("Contenido.Article.RegisterCustomTab", "pica_RegisterCustomTab"); +$_cecRegistry->addChainFunction("Contenido.Article.GetCustomTabProperties", "pica_GetCustomTabProperties"); +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/includes/functions.chains.php b/conlite/plugins/content_allocation/includes/functions.chains.php new file mode 100644 index 0000000..9743b67 --- /dev/null +++ b/conlite/plugins/content_allocation/includes/functions.chains.php @@ -0,0 +1,67 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: functions.chains.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +function pica_RegisterCustomTab () +{ + return array("con_contentallocation"); +} + +function pica_GetCustomTabProperties ($sIntName) +{ + if ($sIntName == "con_contentallocation") + { + return array("con_contentallocation", "con_edit", ""); + } +} + +function pica_ArticleListActions ($aActions) +{ + $aTmpActions["con_contentallocation"] = "con_contentallocation"; + + return $aTmpActions + $aActions; +} + +function pica_RenderArticleAction ($idcat, $idart, $idartlang, $actionkey) +{ + global $sess; + + if ($actionkey == "con_contentallocation") + { + return ''; + + } else { + return ""; + } +} +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/includes/include.contentallocation_article.php b/conlite/plugins/content_allocation/includes/include.contentallocation_article.php new file mode 100644 index 0000000..e30a747 --- /dev/null +++ b/conlite/plugins/content_allocation/includes/include.contentallocation_article.php @@ -0,0 +1,130 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: include.contentallocation_article.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// check requests +Contenido_Security::checkRequests(); + +if(!($perm->have_perm_area_action($area, "storeallocation") || $perm->have_perm_area_action_item($area, "storeallocation", $idcat))) { + $notification->displayNotification("error", i18n("Permission denied")); + return; +} + +cInclude("includes", "functions.pathresolver.php"); + +function str_replace_recursive ($array) { + if (!is_array($array)) return false; + + $result = array(); + + foreach ($array as $value) { + $result[] = str_replace("e", "", $value); + } + + return $result; +} + +// fetch idartlang for idart +$sql = "SELECT idartlang FROM ".$cfg['tab']['art_lang']." WHERE idart=".Contenido_Security::toInteger($idart)." AND idlang=".Contenido_Security::toInteger($lang); +$db->query($sql); +$db->next_record(); +$this_idartlang = $db->f('idartlang'); + +$oPage = new cPage; +$oPage->setMargin(10); + +$oTree = new pApiContentAllocationComplexList('06bd456d-fe76-40cb-b041-b9ba90dc400a'); +$oAlloc = new pApiContentAllocation; + +if ($_POST['action'] == 'storeallocation') { + $oAlloc->storeAllocations($this_idartlang, $_POST['allocation']); +} +if ($_GET['step'] == 'collapse') { + $oTree->setTreeStatus($_GET['idpica_alloc']); +} + +#build category path +$catString = ''; +prCreateURLNameLocationString($idcat, '/', $catString); +$oArticle = new Article ($idart, $client, $lang); +$sArticleTitle = $oArticle->getField('title'); + +$sLocationString = "
    ".$catString.'/'.clHtmlSpecialChars($sArticleTitle)."
    "; + +// load allocations +$loadedAllocations = $oAlloc->loadAllocations($this_idartlang); + +$oTree->setChecked($loadedAllocations); +$result = $oTree->renderTree(true); + +if ($result == false) { + $result = $notification->returnNotification("warning", i18n('There is no Content Allocation tree.')); +} else { + if (!is_object($tpl)) { $tpl = new Template; } + $hiddenfields = ' + + + + + '; + $tpl->set('s', 'HIDDENFIELDS', $hiddenfields); + + + if (sizeof($loadedAllocations) > 0) { + $tpl->set('s', 'ARRAY_CHECKED_BOXES', 'var checkedBoxes = [' . implode(',', $loadedAllocations) . '];'); + } else { + $tpl->set('s', 'ARRAY_CHECKED_BOXES', 'var checkedBoxes = [];'); + } + + $oDiv = new cHTMLDiv; + $oDiv->updateAttributes(array('style' => 'text-align: right; padding: 5px; width: 730px; border: 1px #B3B3B3 solid; background-color: #FFFFFF;')); + $oDiv->setContent(''); + $tpl->set('s', 'DIV', '
    ' . $oDiv->render()); + + $tpl->set('s', 'TREE', $result); + + $tpl->set('s', 'REMOVE_ALL', i18n("Remove all")); + $tpl->set('s', 'REMOVE', i18n("Remove")); + + $result = $tpl->generate($cfg['pica']['treetemplate_complexlist'], true); + + $script = ' + '; + $oPage->addScript('style', $script); +} + + +$oPage->setContent($sLocationString.$result . markSubMenuItem(5, true)); +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/includes/include.left_bottom.php b/conlite/plugins/content_allocation/includes/include.left_bottom.php new file mode 100644 index 0000000..e69de29 diff --git a/conlite/plugins/content_allocation/includes/include.left_top.php b/conlite/plugins/content_allocation/includes/include.left_top.php new file mode 100644 index 0000000..7d06431 --- /dev/null +++ b/conlite/plugins/content_allocation/includes/include.left_top.php @@ -0,0 +1,39 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: include.left_top.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$oPage = new UI_Left_Top; + +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/includes/include.right_bottom.php b/conlite/plugins/content_allocation/includes/include.right_bottom.php new file mode 100644 index 0000000..3771185 --- /dev/null +++ b/conlite/plugins/content_allocation/includes/include.right_bottom.php @@ -0,0 +1,165 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created unknown + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: include.right_bottom.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +if (isset($_REQUEST['treeItem'])) { + die ('Illegal call!'); +} + +#added 24.06.08 timo.trautmann security fix filter submitted treeItemPost array before insertion, name also changed according to security fix +$aPostTreeItem = array(); +if (!is_object($db)) { + $db = new DB_ConLite(); +} + +if (isset($_REQUEST['treeItemPost']['idpica_alloc'])) { + $aPostTreeItem['idpica_alloc'] = (int) $_REQUEST['treeItemPost']['idpica_alloc']; +} + +if (isset($_REQUEST['treeItemPost']['parentid'])) { + $aPostTreeItem['parentid'] = (int) $_REQUEST['treeItemPost']['parentid']; +} + +if (isset($_REQUEST['treeItemPost']['name'])) { + $sName = stripslashes($_REQUEST['treeItemPost']['name']); + $sName =$db->escape($sName); + $aPostTreeItem['name'] = $sName; +} + +$_GET['idpica_alloc'] = (int) $_GET['idpica_alloc']; +#end added 24.06.08 timo.trautmann + +$oPage = new cPage(); +$oPage->setMargin(10); +$oPage->setMessageBox(); +$oTree = new pApiContentAllocationTreeView('f7771624-4874-4745-8b7e-21a49a71a447'); + +// store item +if ($_POST['step'] == 'store') { + $pNotify = '
    '; + $sMessage = sprintf(i18n("New Category %s successfully stored!"), $treeItem['name']); + $notification->displayNotification("info", $sMessage); + $pNotify .= '
    '; + $oTree->storeItem($aPostTreeItem); +} +// rename item +if ($_POST['step'] == 'storeRename') { + $pNotify = '
    '; + $sMessage = sprintf(i18n("Category %s successfully renamed!"), $treeItem['name']); + $notification->displayNotification("info", $sMessage); + $pNotify .= '
    '; + $oTree->storeItem($aPostTreeItem); +} +// rename item +if ($_GET['step'] == 'moveup') { + $oTree->itemMoveUp($_GET['idpica_alloc']); +} + +if ($_GET['step'] == 'deleteItem') { // delete item + $pNotify = '
    '; + $sMessage = i18n("Category successfully deleted!"); + $notification->displayNotification("info", $sMessage); + $pNotify .= '
    '; + $oTree->deleteItem($_GET['idpica_alloc']); +} +if ($_GET['step'] == 'collapse') { + $oTree->setTreeStatus($_GET['idpica_alloc']); +} +if ($_GET['step'] == 'online') { + $oTree->setOnline($_GET['idpica_alloc']); +} +if ($_GET['step'] == 'offline') { + $oTree->setOffline($_GET['idpica_alloc']); +} + +$oDiv = new cHTMLDiv; +$oDiv->updateAttributes(array('style' => 'padding: 5px; width: 400px; border: 1px #B3B3B3 solid; background-color: #FFFFFF;')); +$sTemp = ''; + +if ($_GET['step'] == 'createRoot') { // create new root item + $form = ' + + + + + + + + + + + + + + +
    '.i18n("Create new tree").'
      +
    + '; + $oDiv->setContent($form); + $sTemp = $oDiv->render(); +} else { + $newTree = ''.i18n("Create new tree").'
    '; +} + +$result = $oTree->renderTree(true); + +if ($result === false) { + $result = ' '; +} + +$js = ' +'; + +$oPage->addScript('deleteCategory', $js); + +$oPage->setContent($pNotify . $newTree . $sTemp. '
    ' . $result); +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/content_allocation/locale/content_allocation.pot b/conlite/plugins/content_allocation/locale/content_allocation.pot new file mode 100644 index 0000000..d7ac312 --- /dev/null +++ b/conlite/plugins/content_allocation/locale/content_allocation.pot @@ -0,0 +1,109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-18 10:55+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: includes/config.plugin.php:59 +msgid "Store content allocations" +msgstr "" + +#: includes/include.contentallocation_article.php:86 +msgid "There is no Content Allocation tree." +msgstr "" + +#: includes/include.contentallocation_article.php:111 +msgid "Remove all" +msgstr "" + +#: includes/include.contentallocation_article.php:112 +msgid "Remove" +msgstr "" + +#: includes/include.right_bottom.php:70 +#, php-format +msgid "New Category %s successfully stored!" +msgstr "" + +#: includes/include.right_bottom.php:78 +#, php-format +msgid "Category %s successfully renamed!" +msgstr "" + +#: includes/include.right_bottom.php:90 +msgid "Category successfully deleted!" +msgstr "" + +#: includes/include.right_bottom.php:119 includes/include.right_bottom.php:142 +msgid "Create new tree" +msgstr "" + +#: includes/include.right_bottom.php:132 +msgid "Please enter a category name." +msgstr "" + +#: includes/functions.chains.php:61 +msgid "Content Allocation" +msgstr "" + +#: classes/class.content_allocation_treeview.php:100 +#: classes/class.content_allocation_treeview.php:176 +msgid "Please enter a category name" +msgstr "" + +#: classes/class.content_allocation_treeview.php:124 +msgid "New category" +msgstr "" + +#: classes/class.content_allocation_treeview.php:126 +msgid "Rename category" +msgstr "" + +#: classes/class.content_allocation_treeview.php:127 +msgid "Move category up" +msgstr "" + +#: classes/class.content_allocation_treeview.php:128 +msgid "Move category down" +msgstr "" + +#: classes/class.content_allocation_treeview.php:132 +msgid "Set category offline" +msgstr "" + +#: classes/class.content_allocation_treeview.php:134 +msgid "Set category online" +msgstr "" + +#: classes/class.content_allocation_treeview.php:138 +msgid "One or more subcategories exist, unable to delete" +msgstr "" + +#: classes/class.content_allocation_treeview.php:140 +msgid "Delete category" +msgstr "" + +#: classes/class.content_allocation_treeview.php:140 +msgid "Are you sure to delete the following category" +msgstr "" + +#: classes/class.content_allocation_treeview.php:223 +#: classes/class.content_allocation_article.php:107 +msgid "Category" +msgstr "" + +#: classes/class.content_allocation_treeview.php:224 +msgid "Actions" +msgstr "" diff --git a/conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.mo b/conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.mo new file mode 100644 index 0000000000000000000000000000000000000000..d6dd69c951889e1caec376ef02b6cf64b086dbc7 GIT binary patch literal 2081 zcma)+zi%8x6vqchAU=M^K=>hkJWC-0C40GburOyJv11FO*w}IoLWlNt-|bCqZ|1Z! zn~N(%gM>r@1sx3qT||i}D4>OchAIW3;7>rJLww)fdhcvUh?Vv}d-LYK`M&S$?Cs4^d_jyq2u7OX2*FouP2$p_S|8IkjVEh;G z3U~*689WV>UIDj2S!WE&ypKVt`#Jb5_zfs}e*~r9JD}wK4T|L_aqnM}{~&JZ|5P=I zhH9ic=T1c%gv{mkpcqRVsU*bJ1QLw%2S3D41a*2;>HTK#Xr&e>OJzJ0~@Zc>a zoUzAKpQ&fF%#O85DULj+Hs4d14?oaL4ykd>&h?5c+oPOKG~{HVo_a7mDKBAbJR47| zSOevuMP1Gr<;n1ve9o-aCsOLgx9m->rBGtWMjad~M(SN8?~6R5&3T)PG?`Ra-8M`% zry)X++O5VlJK|f~`Eyj5sGH4rqjoZm923-YPElQnr1Ad@Hq|Z<(L@D`vJ8)sRu@s% z*w=r^_IjB%d}z>2#-tgFD;rU&veBtdpApfHjHRPCm))vWT1!E=Oku0Nv~;$$ z*lJ;7u*)~KEHs^WA!xlGgdv5mwl9QdTOsCcM$QMFJTfke&|#albB}kBcC;BVz2U0} z%3Mlfwxt)%gx^A&Q=KMJ~0JbV%GSozg0R_YRGtN$ zy%E~+e9NC7Wsx>36!)Xtv42xL8!Rs`LHl&F2AqSaxxr%|%s*r%!S;ieVS;o-ux5W;|si7Q<`>xd&kAI%!7DOxdVAK7)*GCHIcHJZ1==4Hvz;#APL_#f#*W-H6d0=g@XA ztTqtVT~CYyLpH(D9CAMg-jj1Ws4Y52Ghz)Hl=C#4=ugEuwWd8jLn*_a(r2k?rb6Vr z8d>IlPi(3U_(K~dpR2_U;Sz1=vL9bSw_q$ Szh)ZF(E!@-_F<4cRsRB_Do6+b literal 0 HcmV?d00001 diff --git a/conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.po b/conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.po new file mode 100644 index 0000000..943d23e --- /dev/null +++ b/conlite/plugins/content_allocation/locale/de_DE/LC_MESSAGES/content_allocation.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Contenido ContentAllocation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-18 10:55+0200\n" +"PO-Revision-Date: 2013-09-11 14:31+0100\n" +"Last-Translator: Ortwin Pinke \n" +"Language-Team: Ortwin Pinke \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: i18n\n" +"Language: de_DE\n" +"X-Generator: Poedit 1.5.7\n" + +#: includes/config.plugin.php:59 +msgid "Store content allocations" +msgstr "Content Allocation speichern" + +#: includes/include.contentallocation_article.php:86 +msgid "There is no Content Allocation tree." +msgstr "Es existiert kein Content Allocation Baum" + +#: includes/include.contentallocation_article.php:111 +msgid "Remove all" +msgstr "Alle entfernen" + +#: includes/include.contentallocation_article.php:112 +msgid "Remove" +msgstr "Entfernen" + +#: includes/include.right_bottom.php:70 +#, php-format +msgid "New Category %s successfully stored!" +msgstr "Neue Kategorie %s gespeichert!" + +#: includes/include.right_bottom.php:78 +#, php-format +msgid "Category %s successfully renamed!" +msgstr "Kategorie %s umbenannt!" + +#: includes/include.right_bottom.php:90 +msgid "Category successfully deleted!" +msgstr "Kategorie gelöscht!" + +#: includes/include.right_bottom.php:119 includes/include.right_bottom.php:142 +msgid "Create new tree" +msgstr "Neuen Baum erstellen" + +#: includes/include.right_bottom.php:132 +msgid "Please enter a category name." +msgstr "Bitte geben Sie einen Kategorienamen ein." + +#: includes/functions.chains.php:61 +msgid "Content Allocation" +msgstr "Content Allocation" + +#: classes/class.content_allocation_treeview.php:100 +#: classes/class.content_allocation_treeview.php:176 +msgid "Please enter a category name" +msgstr "Bitte geben Sie einen Kategorienamen ein" + +#: classes/class.content_allocation_treeview.php:124 +msgid "New category" +msgstr "Neue Kategorie" + +#: classes/class.content_allocation_treeview.php:126 +msgid "Rename category" +msgstr "Kategorie umbenennen" + +#: classes/class.content_allocation_treeview.php:127 +msgid "Move category up" +msgstr "Kategorie aufwärts bewegen" + +#: classes/class.content_allocation_treeview.php:128 +msgid "Move category down" +msgstr "Kategorie abwärts bewegen" + +#: classes/class.content_allocation_treeview.php:132 +msgid "Set category offline" +msgstr "Kategorie offline schalten" + +#: classes/class.content_allocation_treeview.php:134 +msgid "Set category online" +msgstr "Kategorie online schalten" + +#: classes/class.content_allocation_treeview.php:138 +msgid "One or more subcategories exist, unable to delete" +msgstr "" +"Es gibt eine oder mehrer Unterkategorien, Löschen nicht möglich" + +#: classes/class.content_allocation_treeview.php:140 +msgid "Delete category" +msgstr "Lösche Kategorie" + +#: classes/class.content_allocation_treeview.php:140 +msgid "Are you sure to delete the following category" +msgstr "Wollen Sie folgende Kategorien wirklich l&oeschen?" + +#: classes/class.content_allocation_treeview.php:223 +#: classes/class.content_allocation_article.php:107 +msgid "Category" +msgstr "Kategorie" + +#: classes/class.content_allocation_treeview.php:224 +msgid "Actions" +msgstr "Aktionen" diff --git a/conlite/plugins/content_allocation/locale/potfiles.txt b/conlite/plugins/content_allocation/locale/potfiles.txt new file mode 100644 index 0000000..f28d5fa --- /dev/null +++ b/conlite/plugins/content_allocation/locale/potfiles.txt @@ -0,0 +1,15 @@ +./includes/config.plugin.php +./includes/include.left_bottom.php +./includes/include.left_top.php +./includes/include.contentallocation_article.php +./includes/include.right_bottom.php +./includes/functions.chains.php +./templates/template.tree_structure.html +./templates/template.tree_complexlist.html +./templates/template.tree_article.html +./classes/class.content_allocation_tree.php +./classes/class.content_allocation_treeview.php +./classes/class.content_allocation.php +./classes/class.content_allocation_article.php +./classes/class.content_allocation_complexlist.php +./classes/class.content_allocation_selectbox.php diff --git a/conlite/plugins/content_allocation/scripts/complexlist.js b/conlite/plugins/content_allocation/scripts/complexlist.js new file mode 100644 index 0000000..21bfa4c --- /dev/null +++ b/conlite/plugins/content_allocation/scripts/complexlist.js @@ -0,0 +1,133 @@ +/* + * ul2finder + * written by Christian Heilmann (http://icant.co.uk) + * turns the nested list with the ID "finder" into a dynamic list + * uses the CSS classes defined in the variables + */ +function ul2finder() +{ + // Define variables used and classes to be applied/removed + var i,uls,als,finder; + var parentClass='parent'; + var showClass='shown'; + var hideClass='hidden'; + var openClass='open'; + + // check if our finder list exists, if not, stop all activities + finder=document.getElementById('finder'); + if(!finder){return;} + + // add the class domenabled to the body + cssjs('add',document.body,'domenabled') + + // loop through all lists inside finder, position and hide them + // by applying the class hidden + uls=document.getElementById('finder').getElementsByTagName('ul'); + for(i=0;i +{HIDDENFIELDS} + + + + + + + + + + + + +
    {CATEGORY} 
    {ITEMNAME}{CHECKBOX}
    +{DIV} + diff --git a/conlite/plugins/content_allocation/templates/template.tree_complexlist.html b/conlite/plugins/content_allocation/templates/template.tree_complexlist.html new file mode 100644 index 0000000..27df466 --- /dev/null +++ b/conlite/plugins/content_allocation/templates/template.tree_complexlist.html @@ -0,0 +1,76 @@ +
    +{HIDDENFIELDS} +
    + {TREE} +
    +
    +
      +
    +
    {REMOVE_ALL} +
    +{DIV} +
    + + diff --git a/conlite/plugins/content_allocation/templates/template.tree_structure.html b/conlite/plugins/content_allocation/templates/template.tree_structure.html new file mode 100644 index 0000000..76dc672 --- /dev/null +++ b/conlite/plugins/content_allocation/templates/template.tree_structure.html @@ -0,0 +1,13 @@ + + + + + + + + + + + + +
    {CATEGORY}{ACTIONS}
    {ITEMNAME}{ACTION_CREATE} {ACTION_RENAME} {ACTION_ONOFFLINE} {ACTION_MOVE_UP} {ACTION_MOVE_DOWN} {ACTION_DELETE}
    diff --git a/conlite/plugins/content_allocation/xml/content_allocation.xml b/conlite/plugins/content_allocation/xml/content_allocation.xml new file mode 100644 index 0000000..59f1e3b --- /dev/null +++ b/conlite/plugins/content_allocation/xml/content_allocation.xml @@ -0,0 +1,12 @@ + + +
    Content Allocation
    + + + + +
    + Content Allocation +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/content_allocation/xml/lang_de_DE.xml b/conlite/plugins/content_allocation/xml/lang_de_DE.xml new file mode 100644 index 0000000..eb8c1f2 --- /dev/null +++ b/conlite/plugins/content_allocation/xml/lang_de_DE.xml @@ -0,0 +1,11 @@ + + + + + + +
    Content Allocation
    +
    +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/content_allocation/xml/lang_en_EN.xml b/conlite/plugins/content_allocation/xml/lang_en_EN.xml new file mode 100644 index 0000000..eb8c1f2 --- /dev/null +++ b/conlite/plugins/content_allocation/xml/lang_en_EN.xml @@ -0,0 +1,11 @@ + + + + + + +
    Content Allocation
    +
    +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/content_allocation/xml/lang_en_US.xml b/conlite/plugins/content_allocation/xml/lang_en_US.xml new file mode 100644 index 0000000..eb8c1f2 --- /dev/null +++ b/conlite/plugins/content_allocation/xml/lang_en_US.xml @@ -0,0 +1,11 @@ + + + + + + +
    Content Allocation
    +
    +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/frontendlogic/category/category.php b/conlite/plugins/frontendlogic/category/category.php new file mode 100644 index 0000000..50378ce --- /dev/null +++ b/conlite/plugins/frontendlogic/category/category.php @@ -0,0 +1,82 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created + * modified 2008-08-06, Ingo van Peeren - replaced genericdb-code due to performance issues (ticket #) + * + * $Id: category.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +class frontendlogic_category extends FrontendLogic +{ + function getFriendlyName () + { + return i18n("Category", "frontendlogic_category"); + } + + function listActions () + { + $actions = array(); + $actions["access"] = i18n("Access category", "frontendlogic_category"); + + return ($actions); + } + + function listItems () + { + global $lang, $db, $cfg; + + if (!is_object($db)) { + $db = new DB_ConLite; + } + + $sSQL = "SELECT + b.idcatlang, + b.name, + c.level + FROM + ".$cfg['tab']['cat']." AS a, + ".$cfg['tab']['cat_lang']." AS b, + ".$cfg['tab']['cat_tree']." AS c + WHERE + a.idcat = b.idcat AND + a.idcat = c.idcat AND + b.idlang = ".$lang." AND + b.public = 0 + ORDER BY c.idtree ASC"; + + $db->query($sSQL); + while ($db->next_record()) { + $items[$db->f("idcatlang")] = + ''.htmldecode($db->f("name")).''; + + } + + return ($items); + } +} +?> \ No newline at end of file diff --git a/conlite/plugins/frontendlogic/category/docs/conlogo.gif b/conlite/plugins/frontendlogic/category/docs/conlogo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2237f61b3a0d247ddf07c9727b24dd994864adce GIT binary patch literal 5334 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 ANB{r; literal 0 HcmV?d00001 diff --git a/conlite/plugins/frontendlogic/category/docs/frontend.protectedcategories.html b/conlite/plugins/frontendlogic/category/docs/frontend.protectedcategories.html new file mode 100644 index 0000000..b44f241 --- /dev/null +++ b/conlite/plugins/frontendlogic/category/docs/frontend.protectedcategories.html @@ -0,0 +1,104 @@ + + + + + Contenido - Frontend Session Information + + + + + + + + + +
    Contenido +

    Protected frontend categories
    +

    + + + + + + + + + + + + + + + + + + + +
    AuthorTimo A. Hummel
    Created20th May 2005
    Audience
    +
    Site Integrators, Module Developers
    +
    Applies to
    +
    Contenido 4.6 or later
    +
    +
    +
    +

    Introduction

    +Contenido 4.6 introduces a updated concept for protecting frontend categories +and enabling access to them.
    +

    Installation and configuration

    +

    Download the plugin "Frontend Category Permissions" from the Contenido website. + Extract the archive to your plugins directory. Open (or create) the file config.plugin.php in the directory contenido/plugins/chains/includes/ + and add the necessary includes and chain entries (see below). Afterwards, open + the file config.local.php in your contenido/includes directory (create the + file + if it + doesn't exist) and add the following line at the end:

    +

    $cfg['plugins']['frontendlogic'][] += "category";

    +

    Example config.plugin.php:

    +

    <?php
    + global $_cecRegistry;
    + cInclude("plugins", "chains/includes/include.chain.frontend.cat_backendaccess.php");
    +cInclude("plugins", "chains/includes/include.chain.frontend.cat_access.php");

    +

    $_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess");
    + $_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess_Backend");
    + ?>

    +

    The chain Contenido.Frontend.CategoryAccess is + called everytime a protected category is accessed. If the chain functions return + true, access is granted. The function cecFrontendCategoryAccess validates + frontend users and their permissions, and cecFrontendCategoryAccess_Backend does + the same for the backend user counterparts. If you wish to disable backend + users for access frontend categories, remove the line which contains cecFrontendCategoryAccess_Backend. + You can also define chains for more custom checks, please refer to the chains + documentation for more information.

    +

     

    + + diff --git a/conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.mo b/conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.mo new file mode 100644 index 0000000000000000000000000000000000000000..47bc2f85e1f88816617cdc2588d03243aa629965 GIT binary patch literal 647 zcmYk3&2AGh5Xa4zg!Y2q!i9tH$n9>RD0QKt*#=ZKfv7|XsvvN^6R)dXdl`ER;XQag z4m<>BX45v?k$xI`W<36n{pZo$-;C@I@q~Cz+#@DLXWxhigd*+}--*As82d&3A@Sul zV~@#u@)Ty|HrDlI2UA(gIU z;sh>iS8){@r0ENh?ux;HXQ_O)^EA!UG?}On#T=Cjm5LrEAD#b0$45{ixWHeQfOz&= z`?_wOE&P^)xKD?iX_Wyn2UXK$)1&FQ*OP6fN$y<)N1aykK&dANv2qb^rhX literal 0 HcmV?d00001 diff --git a/conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.po b/conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.po new file mode 100644 index 0000000..f755f49 --- /dev/null +++ b/conlite/plugins/frontendlogic/category/locale/de_DE/LC_MESSAGES/frontendlogic_category.po @@ -0,0 +1,25 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2006-09-22 10:35+0100\n" +"Last-Translator: Bjrn Behrens \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Basepath: Z:\\development\\contenido_sources\\contenido\\plugins\\frontendlogic\n" +"X-Poedit-SourceCharset: iso-8859-1\n" +"X-Poedit-KeywordsList: i18n;trans\n" +"X-Poedit-SearchPath-0: category\n" + +#: category/category.php:11 +msgid "Category" +msgstr "Frontend-Berechtigungen" + +#: category/category.php:17 +msgid "Access category" +msgstr "Kategorie-Zugriff" + diff --git a/conlite/plugins/frontendlogic/includes/config.plugin.php b/conlite/plugins/frontendlogic/includes/config.plugin.php new file mode 100644 index 0000000..63300fa --- /dev/null +++ b/conlite/plugins/frontendlogic/includes/config.plugin.php @@ -0,0 +1,31 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created + * + * $Id: config.plugin.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +cInclude("includes", "functions.general.php"); + +scanPlugins("frontendlogic"); +?> \ No newline at end of file diff --git a/conlite/plugins/frontendusers/includes/config.plugin.php b/conlite/plugins/frontendusers/includes/config.plugin.php new file mode 100644 index 0000000..8d2eb81 --- /dev/null +++ b/conlite/plugins/frontendusers/includes/config.plugin.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/conlite/plugins/frontendusers/valid_from/valid_from.php b/conlite/plugins/frontendusers/valid_from/valid_from.php new file mode 100644 index 0000000..6bf73f5 --- /dev/null +++ b/conlite/plugins/frontendusers/valid_from/valid_from.php @@ -0,0 +1,66 @@ +get("valid_from"); + + if ($currentValue == '') { + $currentValue = '0000-00-00'; + } + $currentValue = str_replace('00:00:00', '', $currentValue); + + $sValidFrom = ' + + +'; + $sValidFrom .= ' '; + $sValidFrom .= ''; + + return sprintf($template,$sValidFrom); +} + +function frontendusers_valid_from_wantedVariables () +{ + return (array("valid_from")); +} + +/** + * check and store valid_from date/datetime + * + * @global FrontendUser $feuser + * @param array $variables + */ +function frontendusers_valid_from_store ($variables) { + global $feuser; + + if(Contenido_Security::isMySQLDate($variables["valid_from"], true) + || Contenido_Security::isMySQLDateTime($variables["valid_from"], true) + || empty($variables["valid_from"]) + || $variables["valid_from"] == "0000-00-00") { + + $feuser->set("valid_from", $variables["valid_from"], false); + } +} +?> diff --git a/conlite/plugins/frontendusers/valid_to/valid_to.php b/conlite/plugins/frontendusers/valid_to/valid_to.php new file mode 100644 index 0000000..b2936ef --- /dev/null +++ b/conlite/plugins/frontendusers/valid_to/valid_to.php @@ -0,0 +1,62 @@ +get("valid_to"); + + if ($currentValue == '') { + $currentValue = '0000-00-00'; + } + $currentValue = str_replace('00:00:00', '', $currentValue); + + // js-includes are defined in valid_from + $sValidFrom = ' '; + $sValidFrom .= ''; + + return sprintf($template,$sValidFrom); +} + +function frontendusers_valid_to_wantedVariables () +{ + return (array("valid_to")); +} + +/** + * check and store valid_to date/datetime + * + * @global FrontendUser $feuser + * @param array $variables + */ +function frontendusers_valid_to_store ($variables) { + global $feuser; + + if(Contenido_Security::isMySQLDate($variables["valid_to"], true) + || Contenido_Security::isMySQLDateTime($variables["valid_to"], true) + || empty($variables["valid_to"]) + || $variables["valid_to"] == "0000-00-00") { + + $feuser->set("valid_to", $variables["valid_to"], false); + } +} +?> diff --git a/conlite/plugins/index.php b/conlite/plugins/index.php new file mode 100644 index 0000000..ef8b776 --- /dev/null +++ b/conlite/plugins/index.php @@ -0,0 +1,4 @@ + diff --git a/conlite/plugins/linkchecker/includes/config.plugin.php b/conlite/plugins/linkchecker/includes/config.plugin.php new file mode 100644 index 0000000..f072dcb --- /dev/null +++ b/conlite/plugins/linkchecker/includes/config.plugin.php @@ -0,0 +1,47 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2007-08-08 + * modified 2007-12-13, 2008-05-15 + * + * $Id: config.plugin.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$plugin_name = "linkchecker"; +$cfg['plugins']['linkchecker'] = $cfg['path']['contenido'] . "plugins/" . $plugin_name . "/"; +$cfg['tab']['whitelist'] = $cfg['sql']['sqlprefix'] . '_pi_linkwhitelist'; + +// Templates +$cfg['templates']['linkchecker_test'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test.html"; +$cfg['templates']['linkchecker_test_errors'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test_errors.html"; +$cfg['templates']['linkchecker_test_errors_cat'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test_errors_cat.html"; +$cfg['templates']['linkchecker_test_nothing'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test_nothing.html"; +$cfg['templates']['linkchecker_noerrors'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_noerrors.html"; +$cfg['templates']['linkchecker_whitelist'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_whitelist.html"; +$cfg['templates']['linkchecker_whitelist_urls'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_whitelist_urls.html"; +?> \ No newline at end of file diff --git a/conlite/plugins/linkchecker/includes/include.checkperms.php b/conlite/plugins/linkchecker/includes/include.checkperms.php new file mode 100644 index 0000000..1957e0a --- /dev/null +++ b/conlite/plugins/linkchecker/includes/include.checkperms.php @@ -0,0 +1,89 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2006-06-08 + * modified 2007-11-07, Frederic Schneider, Linkchecker-Edition + * modified 2008-02-08, Andreas Lindner, Performance enhancements + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: include.checkperms.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +function cCatPerm($widcat, $db = null) +{ + global $cfg, $sess, $auth, $group_id, $_arrCatIDs_cCP; + + if (strpos($auth->auth['perm'], 'admin') !== FALSE) { + return true; + } + + if (is_null($db) || !is_object($db)) { + $db = new DB_ConLite; + } + + $group_ids = getGroupIDs($db); + $group_ids[] = Contenido_Security::escapeDB($auth->auth['uid'], $db); + + if (!is_array($_arrCatIDs_cCP)) { + $_arrCatIDs_cCP = array(); + + $sql_inc = " user_id='"; + $sql_inc .= implode("' OR user_id='", $group_ids) . "' "; + $sql = "SELECT idcat FROM ".$cfg['tab']['rights']." + WHERE idarea=6 AND idaction=359 AND ($sql_inc)"; + + $db->query($sql); + + while ($db->next_record()) { + $_arrCatIDs_cCP[$db->f('idcat')] = ''; + } + } + + return array_key_exists($widcat, $_arrCatIDs_cCP); +} + +function getGroupIDs(&$db) +{ + global $cfg, $sess, $auth, $group_id, $_arrGroupIDs_gGI; + + if (is_array($_arrGroupIDs_gGI)) { + return $_arrGroupIDs_gGI; + } + + $sql = "SELECT group_id FROM ".$cfg["tab"]["groupmembers"]." WHERE user_id='".Contenido_Security::escapeDB($auth->auth["uid"], $db)."'"; + $db->query($sql); + + $_arrGroupIDs_gGI = array(); + + while ($db->next_record()) + $_arrGroupIDs_gGI[] = $db->f('group_id'); + + return $_arrGroupIDs_gGI; +} + +?> \ No newline at end of file diff --git a/conlite/plugins/linkchecker/includes/include.linkchecker.php b/conlite/plugins/linkchecker/includes/include.linkchecker.php new file mode 100644 index 0000000..5f55a21 --- /dev/null +++ b/conlite/plugins/linkchecker/includes/include.linkchecker.php @@ -0,0 +1,413 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2007-08-08 + * modified 2008-02-08, Andread Lindner, performance enhancements + * modified 2008-04-05, Holger Librenz, fixed wrong include-path for + * PEAR cache module + * modified 2008-05-14, Frederic Schneider, new version + * modified 2008-06-21, Frederic Schneider, array initalization + * modified 2008-07-02, Frederic Schneider, add security fix + * modified 2008-07-07, Frederic Schneider, fixed wrong language var + * + * $Id: include.linkchecker.php 33 2012-01-09 17:43:55Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$plugin_name = "linkchecker"; +global $cfg; + +if(!$perm->have_perm_area_action($plugin_name, $plugin_name) && $cronjob != true) { + exit; +} + +if((int) $client == 0 && $cronjob != true) { + $notification->displayNotification("error", i18n("No Client selected")); + exit; +} + +// If no mode defined, use mode three +if(empty($_GET['mode'])) { + $_GET['mode'] = 3; +} + +// If no action definied +if(empty($_GET['action'])) { + $_GET['action'] = 'linkchecker'; + $action = "linkchecker"; +} + +plugin_include('linkchecker', 'includes/config.plugin.php'); +plugin_include('linkchecker', 'includes/include.checkperms.php'); +plugin_include('linkchecker', 'includes/include.linkchecker_tests.php'); +cInclude('pear', 'PEAR.php'); +cInclude('pear', 'Cache/Lite.php'); + + +// Initialization +$actionID = 500; +$aCats = array(); +$aSearchIDInfosArt = array(); +$aSearchIDInfosCatArt = array(); +$aSearchIDInfosNonID = array(); +$iWhitelist_timeout = 2592000; // 30 days + +// Var initialization +$aUrl = array('cms' => $cfgClient[$client]['path']['htmlpath'], 'contenido' => $cfg['path']['contenido_fullhtml']); + +// Template- and languagevars +if($cronjob != true) { + $tpl->set('s', 'FULLHTML', $aUrl['contenido']); + $tpl->set('s', 'MODE', intval($_GET['mode'])); + $tpl->set('s', 'URL', $aUrl['contenido']); + $tpl->set('s', 'SID', $sess->id); +} + +// Fill Subnav I +$sLink = $sess->url("main.php?area=linkchecker&frame=4&action=linkchecker") . '&mode='; + +// Fill Subnav II +$tpl->set('s', 'INTERNS_HREF', $sLink . '1'); +$tpl->set('s', 'INTERNS_LABEL', i18n("Interns")); +$tpl->set('s', 'EXTERNS_HREF', $sLink . '2'); +$tpl->set('s', 'EXTERNS_LABEL', i18n("Externs")); +$tpl->set('s', 'INTERNS_EXTERNS_HREF', $sLink . '3'); +$tpl->set('s', 'INTERNS_EXTERNS_LABEL', i18n("Intern/extern Links")); + +// Fill Subnav III +$tpl->set('s', 'UPDATE_HREF', $sLink . intval($_GET['mode']) . '&live=1'); + +// Cache options +$aCacheName = array('errors' => $sess->id, 'errorscount' => $aCacheName['errors'] . "ErrorsCountChecked"); +$oCache = new Cache_Lite(array('cacheDir' => $cfgClient[$client]['path']['frontend'] . "cache/", 'caching' => true, 'lifeTime' => 1209600, 'automaticCleaningFactor' => 1)); + +/* ********* +Program code +********* */ + +/* function linksort */ +function linksort($sErrors) { + + if($_GET['sort'] == "nameart") { + + foreach($sErrors as $key => $aRow) { + $aNameart[$key] = $aRow['nameart']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aNameart); + + } elseif($_GET['sort'] == "namecat") { + + foreach($sErrors as $key => $aRow) { + $aNamecat[$key] = $aRow['namecat']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aNamecat); + + } elseif($_GET['sort'] == "wronglink") { + + foreach($sErrors as $key => $aRow) { + $aWronglink[$key] = $aRow['url']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aWronglink); + + } elseif($_GET['sort'] == "error_type") { + + foreach($sErrors as $key => $aRow) { + $aError_type[$key] = $aRow['error_type']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aError_type); + + } + + return $sErrors; + +} + +// function url_is_image +function url_is_image($sUrl) { + + if(substr($sUrl, -3, 3) == "gif" + || substr($sUrl, -3, 3) == "jpg" + || substr($sUrl, -4, 4) == "jpeg" + || substr($sUrl, -3, 3) == "png" + || substr($sUrl, -3, 3) == "tif" + || substr($sUrl, -3, 3) == "psd" + || substr($sUrl, -3, 3) == "bmp") { + return true; + } else { + return false; + } + +} + +// function url_is_uri +function url_is_uri($sUrl) { + + if(substr($sUrl, 0, 4) == "file" + || substr($sUrl, 0, 3) == "ftp" + || substr($sUrl, 0, 4) == "http" + || substr($sUrl, 0, 2) == "ww") { + return true; + } else { + return false; + } + +} + +/* Check: Changes after last check? */ +$sql = "SELECT lastmodified FROM " . $cfg['tab']['content'] . " content + LEFT JOIN " . $cfg['tab']['art_lang'] . " art ON (art.idartlang = content.idartlang) + WHERE art.online = '1'"; + +/* Whitelist: Add */ +if(!empty($_GET['whitelist'])) { + $sql = "INSERT INTO " . $cfg['tab']['whitelist'] . " VALUES ('" . Contenido_Security::escapeDB(base64_decode($_GET['whitelist']), $db) . "', '" . time() . "')"; + $db->query($sql); +} + +/* Whitelist: Get */ +$sql = "SELECT url FROM " . $cfg['tab']['whitelist'] . " WHERE lastview < " . (time() + $iWhitelist_timeout) . " + AND lastview > " . (time() - $iWhitelist_timeout); +$db->query($sql); + +$aWhitelist = array(); +while($db->next_record()) { + $aWhitelist[] = $db->f("url"); +} + +/* Get all links */ +// Cache errors +$sCache_errors = $oCache->get($aCacheName['errors'], intval($_GET['mode'])); + +// Search if cache doesn't exist or we're in live mode +if($sCache_errors && $_GET['live'] != 1) { + $aErrors = unserialize($sCache_errors); +} else { // If no cache exists + + // Select all categorys + $sql = "SELECT idcat FROM " . $cfg['tab']['cat'] . " GROUP BY idcat"; + $db->query($sql); + + while($db->next_record()) { + + if($cronjob != true) { // Check userrights, if no cronjob + + $iCheck = cCatPerm($db->f("idcat"), $db2); + + if($iCheck == true) { + $aCats[] = Contenido_Security::toInteger($db->f("idcat")); + } + + } else { + $aCats[] = Contenido_Security::toInteger($db->f("idcat")); + } + + } + + // Use SQL-WHERE if lang is not zero + if($langart != 0) { + $sLang_where = "AND art.idlang = '" . Contenido_Security::toInteger($langart) . "' AND catName.idlang = '" . Contenido_Security::toInteger($langart) . "'"; + } elseif(!isset($langart)) { + $sLang_where = "AND art.idlang = '" . Contenido_Security::toInteger($lang) . "' AND catName.idlang = '" . Contenido_Security::toInteger($lang) . "'"; + } +if(!empty($aCats)) { + // How many articles exists? [Text] + $sql = "SELECT art.title, art.idlang, cat.idart, cat.idcat, catName.name AS namecat, con.value FROM " . $cfg['tab']['cat_art'] . " cat + LEFT JOIN " . $cfg['tab']['art_lang'] . " art ON (art.idart = cat.idart) + LEFT JOIN " . $cfg['tab']['cat_lang'] . " catName ON (catName.idcat = cat.idcat) + LEFT JOIN " . $cfg['tab']['content'] . " con ON (con.idartlang = art.idartlang) + WHERE (con.value LIKE '%action%' OR con.value LIKE '%data%' OR con.value LIKE '%href%' OR con.value LIKE '%src%') + AND cat.idcat IN (0, " . join(", ", $aCats) . ") AND cat.idcat != '0' " . $sLang_where . " + AND art.online = '1' AND art.redirect = '0'"; + $db->query($sql); + + while($db->next_record()) { + + // Text decode + $value = urldecode($db->f("value")); + + // Search the text + searchLinks($value, $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat"), $db->f("idlang")); + + // Search front_content.php-links + if($_GET['mode'] != 2) { + searchFrontContentLinks($value, $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat")); + } + + } + + // How many articles exists? [Redirects] + $sql = "SELECT art.title, art.redirect_url, art.idlang, cat.idart, cat.idcat, catName.name AS namecat FROM " . $cfg['tab']['cat_art'] . " cat + LEFT JOIN " . $cfg['tab']['art_lang'] . " art ON (art.idart = cat.idart) + LEFT JOIN " . $cfg['tab']['cat_lang'] . " catName ON (catName.idcat = cat.idcat) + WHERE cat.idcat IN (0, " . join(", ", $aCats) . ") AND cat.idcat != '0' " . $sLang_where . " + AND art.online = '1' AND art.redirect = '1'"; + $db->query($sql); + + while($db->next_record()) { + + // Search links + searchLinks($db->f("redirect_url"), $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat"), $db->f("idlang"), "Redirect"); + + // Search front_content.php-links + if($_GET['mode'] != 2) { + searchFrontContentLinks($db->f("redirect_url"), $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat")); + } + + } + + // Check the links + checkLinks(); + } +} + +/* Analysis of the errors */ +// Templateset +if($cronjob != true) { + $tpl->set('s', 'TITLE', i18n('Link analysis from ', $plugin_name) . strftime(i18n('%Y-%m-%d', $plugin_name), time())); +} + +// If no errors found, say that +if(empty($aErrors) && $cronjob != true) { + $tpl->set('s', 'NO_ERRORS', i18n("No errors were found.", $plugin_name)); + $tpl->generate($cfg['templates']['linkchecker_noerrors']); +} elseif(!empty($aErrors) && $cronjob != true) { + + $tpl->set('s', 'ERRORS_HEADLINE', i18n("Total checked links", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_ARTID', i18n("idart", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_ARTICLE', i18n("Article", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_CATID', i18n("idcat", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_CATNAME', i18n("Category", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_DESCRIPTION', i18n("Description", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINK', i18n("Linkerror", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINKS_ARTICLES', i18n("Links to articles", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINKS_CATEGORYS', i18n("Links to categories", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINKS_DOCIMAGES', i18n("Links to documents and images", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_OTHERS', i18n("Links to extern sites and not defined links", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_WHITELIST', "Whitelist"); + $tpl->set('s', 'ERRORS_HELP_ERRORS', i18n("Wrong links", $plugin_name)); + + // error_output initialization + $aError_output = array('art' => '', 'cat' => '', 'docimages' => '', 'others' => ''); + + foreach($aErrors as $sKey => $aRow) { + + $aRow = linksort($aRow); + + for($i = 0; $i < count($aRow); $i++) { + + $tpl2 = new Template; + $tpl2->reset(); + + $tpl2->set('s', 'ERRORS_ERROR_TYPE', $aRow[$i]['error_type']); + $tpl2->set('s', 'ERRORS_ARTID', $aRow[$i]['idart']); + $tpl2->set('s', 'ERRORS_ARTICLE', $aRow[$i]['nameart']); + $tpl2->set('s', 'ERRORS_ARTICLE_SHORT', substr($aRow[$i]['nameart'], 0, 20) . ((strlen($aRow[$i]['nameart']) > 20) ? ' ...' : '')); + $tpl2->set('s', 'ERRORS_CATID', $aRow[$i]['idcat']); + $tpl2->set('s', 'ERRORS_LINK', $aRow[$i]['url']); + $tpl2->set('s', 'ERRORS_LINK_ENCODE', base64_encode($aRow[$i]['url'])); + $tpl2->set('s', 'ERRORS_LINK_SHORT', substr($aRow[$i]['url'], 0, 55) . ((strlen($aRow[$i]['url']) > 55) ? ' ...' : '')); + $tpl2->set('s', 'ERRORS_CATNAME', $aRow[$i]['namecat']); + $tpl2->set('s', 'ERRORS_CATNAME_SHORT', substr($aRow[$i]['namecat'], 0, 20) . ((strlen($aRow[$i]['namecat']) > 20) ? ' ...' : '')); + $tpl2->set('s', 'MODE', $_GET['mode']); + $tpl2->set('s', 'URL', $aUrl['contenido']); + $tpl2->set('s', 'SID', $sess->id); + + if($aRow[$i]['error_type'] == "unknown") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("Unknown: articles, documents etc. do not exist.", $plugin_name)); + } elseif($aRow[$i]['error_type'] == "offline") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("Offline: article or category is offline.", $plugin_name)); + } elseif($aRow[$i]['error_type'] == "startart") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("Offline: article or category is offline.", $plugin_name)); + } elseif($aRow[$i]['error_type'] == "dbfs") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("dbfs: no matches found in the dbfs database.", $plugin_name)); + } + + if($sKey != "cat") { + $aError_output[$sKey] .= $tpl2->generate($cfg['templates']['linkchecker_test_errors'], 1); + } else { + $aError_output[$sKey] .= $tpl2->generate($cfg['templates']['linkchecker_test_errors_cat'], 1); // special template for idcats + } + + } + + } + + /* Counter */ + if($iCounter = $oCache->get($aCacheName['errorscount'], intval($_GET['mode']))) { // Cache exists? + $iErrors_count_checked = $iCounter; + } else { // Count searched links: idarts + idcats + idcatarts + others + $iErrors_count_checked = count($aSearchIDInfosArt) + count($aSearchIDInfosCat) + count($aSearchIDInfosCatArt) + count($aSearchIDInfosNonID); + } + + // Count errors + foreach($aErrors as $sKey => $aRow) { + $iErrors_counted += count($aErrors[$sKey]); + } + + $tpl->set('s', 'ERRORS_COUNT_CHECKED', $iErrors_count_checked); + $tpl->set('s', 'ERRORS_COUNT_ERRORS', $iErrors_counted); + $tpl->set('s', 'ERRORS_COUNT_ERRORS_PERCENT', round(($iErrors_counted * 100) / $iErrors_count_checked, 2)); + + /* Template output */ + foreach($aError_output as $sKey => $sValue) { + + if(empty($aError_output[$sKey])) { // Errors for this type? + $tpl2->set('s', 'ERRORS_NOTHING', i18n("No errors for this type.", $plugin_name)); + $aError_output[$sKey] = $tpl2->generate($cfg['templates']['linkchecker_test_nothing'], 1); + } + + $tpl->set('s', 'ERRORS_SHOW_' . strtoupper($sKey), $aError_output[$sKey]); + + if(count($aErrors[$sKey]) > 0) { + $tpl->set('s', 'ERRORS_COUNT_ERRORS_' . strtoupper($sKey), '' . count($aErrors[$sKey]) . ''); + } else { + $tpl->set('s', 'ERRORS_COUNT_ERRORS_' . strtoupper($sKey), count($aErrors[$key])); + } + + } + + $tpl->generate($cfg['templates']['linkchecker_test']); + + /* Cache */ + // Remove older cache + $oCache->remove($aCacheName['errors'], intval($_GET['mode'])); + + // Build new cache + $oCache->save(serialize($aErrors), $aCacheName['errors'], intval($_GET['mode'])); + $oCache->save($iErrors_count_checked, $aCacheName['errorscount'], intval($_GET['mode'])); + +} + +// Log +if($cronjob != true) { + $backend->log(0, 0, $client, $lang, $action); +} +?> \ No newline at end of file diff --git a/conlite/plugins/linkchecker/includes/include.linkchecker_tests.php b/conlite/plugins/linkchecker/includes/include.linkchecker_tests.php new file mode 100644 index 0000000..ace01f5 --- /dev/null +++ b/conlite/plugins/linkchecker/includes/include.linkchecker_tests.php @@ -0,0 +1,310 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2008-02-28 + * modified 2008-06-05, Frederic Schneider + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2010-01-07, Murat Purc, fixed usage of wrong variable, see [#CON-292] + * modified 2010-11-26, Dominik Ziegler, resetten array with redefinition of empty array instead of unsetting the variable [#CON-369] + * + * $Id: include.linkchecker_tests.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// Checks all links without front_content.php +function checkLinks() { + global $auth, $cfgClient, $client, $cfg, $cronjob, $db, $aErrors, $lang, $langart, $whitelist; + global $aSearchIDInfosArt, $aSearchIDInfosCat, $aSearchIDInfosCatArt, $aSearchIDInfosNonID; + + if(count($aSearchIDInfosArt) > 0) { // Checks idarts + + for($i = 0; $i < count($aSearchIDInfosArt); $i++) { + + if($i == 0) { + $sSearch = Contenido_Security::toInteger($aSearchIDInfosArt[$i]['id']); + } else { + $sSearch .= ", " . Contenido_Security::toInteger($aSearchIDInfosArt[$i]['id']); + } + + } + + // Check articles + $aFind = array(); + $sql = "SELECT idart, online FROM " . $cfg['tab']['art_lang'] . " WHERE idart IN (" . $sSearch . ")"; + $db->query($sql); + + while($db->next_record()) { + $aFind[$db->f("idart")] = array("online" => $db->f("online")); + } + + for($i = 0; $i < count($aSearchIDInfosArt); $i++) { + + if(isset($aFind[$aSearchIDInfosArt[$i]['id']]) && $aFind[$aSearchIDInfosArt[$i]['id']]['online'] == 0) { + $aErrors['art'][] = array_merge($aSearchIDInfosArt[$i], array("error_type" => "offline")); + } elseif(!isset($aFind[$aSearchIDInfosArt[$i]['id']])) { + $aErrors['art'][] = array_merge($aSearchIDInfosArt[$i], array("error_type" => "unknown")); + } + + } + + } + + if(count($aSearchIDInfosCat) > 0) { // Checks idcats + + for($i = 0; $i < count($aSearchIDInfosCat); $i++) { + + if($i == 0) { + $sSearch = $aSearchIDInfosCat[$i]['id']; + } else { + $sSearch .= ", " . $aSearchIDInfosCat[$i]['id']; + } + + } + + // Check categorys + $aFind = array(); + $sql = "SELECT idcat, startidartlang, visible FROM " . $cfg['tab']['cat_lang'] . " WHERE idcat IN (" . $sSearch . ") AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + while($db->next_record()) { + $aFind[$db->f("idcat")] = array("online" => $db->f("visible"), "startidart" => $db->f("startidartlang")); + } + + for($i = 0; $i < count($aSearchIDInfosCat); $i++) { + + if(is_array($aFind[$aSearchIDInfosCat[$i]['id']]) && $aFind[$aSearchIDInfosCat[$i]['id']]['startidart'] == 0) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "startart")); + } elseif(is_array($aFind[$aSearchIDInfosCat[$i]['id']]) && $aFind[$aSearchIDInfosCat[$i]['id']]['online'] == 0) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "offline")); + } elseif(!is_array($aFind[$aSearchIDInfosCat[$i]['id']])) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "unknown")); + } + + if(is_array($aFind[$aSearchIDInfosCat[$i]['id']]) && $aFind[$aSearchIDInfosCat[$i]['id']]['startidart'] != 0) { + + $sql = "SELECT idart FROM " . $cfg['tab']['art_lang'] . " WHERE idartlang = '" . $aFind[$aSearchIDInfosCat[$i]['id']]['startidart'] . "' AND online = '1'"; + $db->query($sql); + + if($db->num_rows() == 0) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "startart")); + } + + } + + } + + } + + if(count($aSearchIDInfosCatArt) > 0) { // Checks idcatarts + + for($i = 0; $i < count($aSearchIDInfosCatArt); $i++) { + + if($i == 0) { + $sSearch = Contenido_Security::toInteger($aSearchIDInfosCatArt[$i]['id']); + } else { + $sSearch .= ", " . Contenido_Security::toInteger($aSearchIDInfosCatArt[$i]['id']); + } + + } + + // Check articles + $aFind = array(); + $sql = "SELECT idcatart FROM " . $cfg['tab']['cat_art'] . " WHERE idcatart IN (" . $sSearch . ")"; + $db->query($sql); + + while($db->next_record()) { + $aFind[] = $db->f("idcatart"); + } + + for($i = 0; $i < count($aSearchIDInfosCatArt); $i++) { + + if(!in_array($aSearchIDInfosCatArt[$i]['id'], $aFind)) { + $aErrors['art'][] = array_merge($aSearchIDInfosCatArt[$i], array("error_type" => "unknown")); + } + + } + + } + + if(count($aSearchIDInfosNonID) != 0) { // Checks other links (e. g. http, www, dfbs) + + // Select userrights (is the user admin or sysadmin?) + $sql = "SELECT username FROM " . $cfg['tab']['phplib_auth_user_md5'] . " WHERE user_id='" . Contenido_Security::escapeDB($auth->auth['uid'], $db) . "' AND perms LIKE '%admin%'"; + $db->query($sql); + + if($db->num_rows() > 0 || $cronjob == true) { // User is admin when he is or when he run the cronjob + $iAdmin = true; + } + + for($i = 0; $i < count($aSearchIDInfosNonID); $i++) { + + if(url_is_uri($aSearchIDInfosNonID[$i]['url'])) { + + if(substr($aSearchIDInfosNonID[$i]['url'], 0, strlen($aSearchIDInfosNonID[$i]['url'])) == $cfgClient[$client]['path']['htmlpath']) { + $iPing = @file_exists(str_replace($cfgClient[$client]['path']['htmlpath'], $cfgClient[$client]['path']['frontend'], $aSearchIDInfosNonID[$i]['url'])); + } else { + $iPing = @fopen($aSearchIDInfosNonID[$i]['url'], 'r'); + } + + if(!$iPing) { + + if(url_is_image($aSearchIDInfosNonID[$i]['url'])) { + $aErrors['docimages'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } else { + $aErrors['others'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } + + } + + } elseif(substr($aSearchIDInfosNonID[$i]['url'], strlen($aSearchIDInfosNonID[$i]['url'])-5, 5) == ".html") { + + $iPing = @file_exists($cfgClient[$client]['path']['htmlpath'] . $aSearchIDInfosNonID[$i]['url']); + + if(!$iPing) { + $aErrors['art'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } + + } elseif(substr($aSearchIDInfosNonID[$i]['url'], 0, 20) == "dbfs.php?file=dbfs:/") { + + $sDBurl = substr($aSearchIDInfosNonID[$i]['url'], 20, strlen($aSearchIDInfosNonID[$i]['url'])); + + $iPos = strrpos($sDBurl, '/'); + $sDirname = substr($sDBurl, 0, $iPos); + $sFilename = substr($sDBurl, $iPos + 1); + + // Check categorys + $sql = "SELECT iddbfs FROM " . $cfg['tab']['dbfs'] . " WHERE dirname IN('" . $sDirname . "', '" . clHtmlEntityDecode($sDirname) . "', '" . urldecode($sDirname) . "') AND filename = '" . $sFilename . "'"; + $db->query($sql); + + if($db->num_rows() == 0) { + $aErrors['docimages'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "dbfs")); + } + + } else { + + if(!file_exists($cfgClient[$client]['path']['frontend'] . $aSearchIDInfosNonID[$i]['url'])) { + + if(url_is_image($aSearchIDInfosNonID[$i]['url'])) { + $aErrors['docimages'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } else { + $aErrors['others'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } + + } + + } + + } + + } + + return $aErrors; + +} + +// Searchs front_content.php-links +function searchFrontContentLinks($sValue, $iArt, $sArt, $iCat, $sCat) { + global $aSearchIDInfosArt, $aSearchIDInfosCat, $aSearchIDInfosCatArt, $aWhitelist; + + // detect urls with parameter idart + $matches = array(); + if (preg_match_all('/(?!file|ftp|http|ww)front_content.php\?idart=([0-9]*)/i', $sValue, $matches)) { + for ($i = 0; $i < count($matches[0]); $i++) { + if (!in_array($matches[0][$i], $aWhitelist)) { + $aSearchIDInfosArt[] = array( + "id" => $matches[1][$i], "url" => $matches[0][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "urltype" => "intern" + ); + } + } + } + + // detect urls with parameter idcat + $matches = array(); + if (preg_match_all('/(?!file|ftp|http|ww)front_content.php\?idcat=([0-9]*)/i', $sValue, $matches)) { + for ($i = 0; $i < count($matches[0]); $i++) { + if (!in_array($matches[0][$i], $aWhitelist)) { + $aSearchIDInfosCat[] = array( + "id" => $matches[1][$i], "url" => $matches[0][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "urltype" => "intern" + ); + } + } + } + + // detect urls with parameter idcatart + $matches = array(); + if (preg_match_all('/(?!file|ftp|http|ww)front_content.php\?idcatart=([0-9]*)/i', $sValue, $matches)) { // idcatart + for ($i = 0; $i < count($matches[0]); $i++) { + if (!in_array($matches[0][$i], $aWhitelist)) { + $aSearchIDInfosCatArt[] = array( + "id" => $matches[1][$i], "url" => $matches[0][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "urltype" => "intern" + ); + } + } + } +} + +// Searchs extern and intern links +function searchLinks($sValue, $iArt, $sArt, $iCat, $sCat, $iLang, $sFromtype = "") { + global $aUrl, $aSearchIDInfosNonID, $aWhitelist; + + // Extern URL + if(preg_match_all('~(?:(?:action|data|href|src)=["\']((?:file|ftp|http|ww)[^\s]*)["\'])~i', $sValue, $aMatches) && $_GET['mode'] != 1) { + + for($i = 0; $i < count($aMatches[1]); $i++) { + + if(!in_array($aMatches[1][$i], $aWhitelist)) { + $aSearchIDInfosNonID[] = array("url" => $aMatches[1][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "lang" => $iLang, "urltype" => "extern"); + } + + } + + } + + // Redirect + if($sFromtype == "Redirect" && (preg_match('!(' . preg_quote($aUrl['cms']) . '[^\s]*)!i', $sValue, $aMatches) + || (preg_match('~(?:file|ftp|http|ww)[^\s]*~i', $sValue, $aMatches) && $_GET['mode'] != 1)) + && (stripos($sValue, 'front_content.php') === false) + && !in_array($aMatches[0], $aWhitelist)) { + $aSearchIDInfosNonID[] = array("url" => $aMatches[0], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "lang" => $iLang, "urltype" => "unknown"); + } + + // Intern URL + if(preg_match_all('~(?:(?:action|data|href|src)=["\'])(?!file://)(?!ftp://)(?!http://)(?!https://)(?!ww)(?!mailto)(?!\#)(?!/\#)([^"\']+)(?:["\'])~i', $sValue, $aMatches) && $_GET['mode'] != 2) { + + for($i = 0; $i < count($aMatches[1]); $i++) { + + if(strpos($aMatches[1][$i], "front_content.php") === false && !in_array($aMatches[1][$i], $aWhitelist)) { + $aSearchIDInfosNonID[] = array("url" => $aMatches[1][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "lang" => $iLang, "urltype" => "intern"); + } + + } + + } + +} +?> \ No newline at end of file diff --git a/conlite/plugins/linkchecker/includes/include.linkchecker_whitelist.php b/conlite/plugins/linkchecker/includes/include.linkchecker_whitelist.php new file mode 100644 index 0000000..b85524d --- /dev/null +++ b/conlite/plugins/linkchecker/includes/include.linkchecker_whitelist.php @@ -0,0 +1,85 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2007-11-02 + * modified 2007-12-13, 2008-05-09, 2008-05-15, Frederic Schneider + * modified 2008-06-02, Frederic Schneider, add security fix + * + * $Id: include.linkchecker_whitelist.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$plugin_name = "linkchecker"; +$iWhitelist_timeout = 2592000; // 30 days +global $perm; + +if(!$perm->have_perm_area_action($plugin_name, $plugin_name)) { + exit; +} + +// Template-definition +$tpl->set('s', 'CONTENIDO_URL', $cfg['path']['contenido_fullhtml']); +$tpl->set('s', 'SID', $sess->id); + +/* Whitelist: Delete */ +if(!empty($_GET['url_to_delete'])) { + $sql = "DELETE FROM " . $cfg['tab']['whitelist'] . " WHERE url = '" . Contenido_Security::escapeDB(base64_decode($_GET['url_to_delete']), $db) . "'"; + $db->query($sql); +} + +// Get whitelist +$sql = "SELECT url, lastview FROM " . $cfg['tab']['whitelist'] . " WHERE lastview < " . (time() + $iWhitelist_timeout) . " + AND lastview > " . (time() - $iWhitelist_timeout) . " ORDER BY lastview DESC"; +$db->query($sql); + +while($db->next_record()) { + + $tpl2 = new Template; + $tpl2->reset(); + + $tpl2->set('s', 'CONTENIDO_URL', $cfg['path']['contenido_fullhtml']); + $tpl2->set('s', 'SID', $sess->id); + $tpl2->set('s', 'URL', $db->f("url")); + $tpl2->set('s', 'URL_ENCODE', base64_encode($db->f("url"))); + $tpl2->set('s', 'ENTRY', strftime(i18n('%Y-%m-%d, %I:%M%S %p', $plugin_name), $db->f("lastview"))); + + $aWhitelist .= $tpl2->generate($cfg['templates']['linkchecker_whitelist_urls'], 1); + +} + +// Template- and languagevars +$tpl->set('s', 'HEADLINE', i18n("Links at whitelist", $plugin_name)); +$tpl->set('s', 'HEADLINE_DELETE', i18n("Delete", $plugin_name)); +$tpl->set('s', 'HEADLINE_ENTRY', i18n("Entry", $plugin_name)); +$tpl->set('s', 'HEADLINE_URLS', i18n("URLs", $plugin_name)); +$tpl->set('s', 'HELP', i18n("This links are on the whitelist. Whitelist-links won't be check at linkchecker.", $plugin_name)); +$tpl->set('s', 'TITLE', "Whitelist"); +$tpl->set('s', 'WHITELIST', $aWhitelist); +$tpl->set('s', 'WHITELIST_COUNT', $db->num_rows()); + +$tpl->generate($cfg['templates']['linkchecker_whitelist']); +?> \ No newline at end of file diff --git a/conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.mo b/conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.mo new file mode 100644 index 0000000000000000000000000000000000000000..de8ef81b577fe18eb5f0e2a195ee3d0ccf0055b8 GIT binary patch literal 2139 zcmb7^J&YSg6vr0`A947~@hQZ|laMb+-0s;YAZ9N_$Ob zNBb4+Ewry6!3)n*kD`GW!56^=a1p!$J_&A@^GDzl=zj)Y0#opDP=go2GjIX?61)uF zEBoJpZ=nAp_$qiGdn^ac+L6Eh*lgG3LZ$w-?3A`KHia29$J+jMW=Y|p$kB2NRjL3wRt~K+8ZE!E;;&q#W+QBV@NT2oXw*89vHpRMq{$+ybVxTfC#*$G`*B~gz&Bk> z%dx;r$3A{9?FI>7$9~xx+ej)wnx_txfCyYj9XG-`#1kc4Xw$?}<99%Ye`tGJ&? z8@3+_qx@Fu{SWJh#Br7k84|jkLs;*_m=~a7|>+6y(u{8sxlXAvq2cu}%s%mUFlhEz-bvYF-LS#hT&(;3BgSk+YQMXiL zsinJWnA<3e2Ni<5tVg=|Oi>&1L#m2Ws#~gDCbkr#{OYJECjynaJR$Ik>+DCVE#;Q= oWmD$Y;L1s!?y?)nLGB}>g{YV@1TwkeAZBWHAEnp*3iD;>ZzXb65&!@I literal 0 HcmV?d00001 diff --git a/conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.po b/conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.po new file mode 100644 index 0000000..93aaaaf --- /dev/null +++ b/conlite/plugins/linkchecker/locale/de_DE/LC_MESSAGES/linkchecker.po @@ -0,0 +1,122 @@ +msgid "" +msgstr "" +"Project-Id-Version: Contenido Linkchecker\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2008-02-27 10:16+0100\n" +"Last-Translator: Frederic Schneider \n" +"Language-Team: Frederic Schneider \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Basepath: H:\\frederic.schneider\\\n" +"X-Poedit-KeywordsList: i18n\n" +"X-Poedit-SearchPath-0: H:\\frederic.schneider\\contenido\\plugins\\linkchecker\\includes\n" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:196 +#, fuzzy +msgid "Link analysis from " +msgstr "Link-Analyse vom " + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:196 +msgid "%Y-%m-%d" +msgstr "%d.%m.%Y" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:42 +msgid "No errors were found." +msgstr "Es wurden keine Fehler gefunden." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:227 +#, fuzzy +msgid "Total checked links" +msgstr "Insgesamt geprüfte Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:24 +msgid "idart" +msgstr "idart" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:30 +msgid "Article" +msgstr "Artikel" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:26 +msgid "idcat" +msgstr "idcat" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:31 +msgid "Category" +msgstr "Kategorie" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:47 +msgid "Description" +msgstr "Beschreibung" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:31 +msgid "Linkerror" +msgstr "Linkfehler" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:40 +msgid "Links to articles" +msgstr "Links auf Artikel" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:40 +msgid "Links to categories" +msgstr "Links auf Kategorien" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:51 +msgid "Links to documents and images" +msgstr "Links auf Bilder und Dokumente" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:237 +#, fuzzy +msgid "Links to extern sites and not defined links" +msgstr "Links auf externe Quellen und nicht zugewiesene Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:46 +msgid "Wrong links" +msgstr "Fehlerhafte Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:271 +msgid "Unknown: articles, documents etc. do not exist." +msgstr "Unknown: Artikel, Dokumente et cetera existieren nicht." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:273 +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:275 +msgid "Offline: article or category is offline." +msgstr "Offline: Artikel oder Kategorie ist offline." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:277 +msgid "dbfs: no matches found in the dbfs database." +msgstr "dbfs: In der dbfs-Datenbank ist die gesuchte Datei nicht vorhanden." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:67 +msgid "No errors for this type." +msgstr "Es wurden für diesen Linktyp keine Fehler gefunden." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:196 +msgid "%Y-%m-%d, %I:%M%S %p" +msgstr "%d.%m.%Y, %H:%M:%S" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:40 +msgid "Links at whitelist" +msgstr "Links auf der weißen Liste" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:41 +msgid "Delete" +msgstr "Entfernen" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:42 +msgid "Entry" +msgstr "Eintragung" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:43 +msgid "URLs" +msgstr "Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:45 +msgid "This links are on the whitelist. Whitelist-links won't be check at linkchecker." +msgstr "Diese Links befinden sich auf der weißen Liste und werden nicht vom Linkchecker überprüft." + +msgid "View whitelist" +msgstr "Whitelist anzeigen" \ No newline at end of file diff --git a/conlite/plugins/linkchecker/locale/linkchecker.pot b/conlite/plugins/linkchecker/locale/linkchecker.pot new file mode 100644 index 0000000..e32cbd6 --- /dev/null +++ b/conlite/plugins/linkchecker/locale/linkchecker.pot @@ -0,0 +1,135 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-18 10:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: includes/include.linkchecker.php:49 +msgid "No Client selected" +msgstr "" + +#: includes/include.linkchecker.php:95 +msgid "Interns" +msgstr "" + +#: includes/include.linkchecker.php:97 +msgid "Externs" +msgstr "" + +#: includes/include.linkchecker.php:99 +msgid "Intern/extern Links" +msgstr "" + +#: includes/include.linkchecker.php:294 +msgid "Link analysis from " +msgstr "" + +#: includes/include.linkchecker.php:294 +msgid "%Y-%m-%d" +msgstr "" + +#: includes/include.linkchecker.php:299 +msgid "No errors were found." +msgstr "" + +#: includes/include.linkchecker.php:303 +msgid "Total checked links" +msgstr "" + +#: includes/include.linkchecker.php:304 +msgid "idart" +msgstr "" + +#: includes/include.linkchecker.php:305 +msgid "Article" +msgstr "" + +#: includes/include.linkchecker.php:306 +msgid "idcat" +msgstr "" + +#: includes/include.linkchecker.php:307 +msgid "Category" +msgstr "" + +#: includes/include.linkchecker.php:308 +msgid "Description" +msgstr "" + +#: includes/include.linkchecker.php:309 +msgid "Linkerror" +msgstr "" + +#: includes/include.linkchecker.php:310 +msgid "Links to articles" +msgstr "" + +#: includes/include.linkchecker.php:311 +msgid "Links to categories" +msgstr "" + +#: includes/include.linkchecker.php:312 +msgid "Links to documents and images" +msgstr "" + +#: includes/include.linkchecker.php:313 +msgid "Links to extern sites and not defined links" +msgstr "" + +#: includes/include.linkchecker.php:315 +msgid "Wrong links" +msgstr "" + +#: includes/include.linkchecker.php:344 +msgid "Unknown: articles, documents etc. do not exist." +msgstr "" + +#: includes/include.linkchecker.php:346 includes/include.linkchecker.php:348 +msgid "Offline: article or category is offline." +msgstr "" + +#: includes/include.linkchecker.php:350 +msgid "dbfs: no matches found in the dbfs database." +msgstr "" + +#: includes/include.linkchecker.php:383 +msgid "No errors for this type." +msgstr "" + +#: includes/include.linkchecker_whitelist.php:68 +msgid "%Y-%m-%d, %I:%M%S %p" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:75 +msgid "Links at whitelist" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:76 +msgid "Delete" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:77 +msgid "Entry" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:78 +msgid "URLs" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:79 +msgid "" +"This links are on the whitelist. Whitelist-links won't be check at " +"linkchecker." +msgstr "" diff --git a/conlite/plugins/linkchecker/locale/potfiles.txt b/conlite/plugins/linkchecker/locale/potfiles.txt new file mode 100644 index 0000000..cc38e42 --- /dev/null +++ b/conlite/plugins/linkchecker/locale/potfiles.txt @@ -0,0 +1,12 @@ +./includes/include.checkperms.php +./includes/include.linkchecker.php +./includes/config.plugin.php +./includes/include.linkchecker_tests.php +./includes/include.linkchecker_whitelist.php +./templates/standard/template.linkchecker_test_errors_cat.html +./templates/standard/template.linkchecker_whitelist.html +./templates/standard/template.linkchecker_noerrors.html +./templates/standard/template.linkchecker_test_errors.html +./templates/standard/template.linkchecker_test.html +./templates/standard/template.linkchecker_test_nothing.html +./templates/standard/template.linkchecker_whitelist_urls.html diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_noerrors.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_noerrors.html new file mode 100644 index 0000000..82f29dc --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_noerrors.html @@ -0,0 +1,36 @@ + + + +Linkchecker + + + + + + + + + +
    + {INTERNS_LABEL} + {EXTERNS_LABEL} + {INTERNS_EXTERNS_LABEL} +
    + +
    + + + + + + + + + + + +

    {TITLE}

    + i18n('Refresh') + i18n('Refresh') +
    {NO_ERRORS}
    + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test.html new file mode 100644 index 0000000..c34d0d8 --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test.html @@ -0,0 +1,202 @@ + + + + Linkchecker + + + + + + + + + + + + + + + + + + + + + + +
    + {INTERNS_LABEL} + {EXTERNS_LABEL} + {INTERNS_EXTERNS_LABEL} +
    + +
    + + + + + + + + +

    {TITLE}

    + i18n('Refresh') + i18n('Refresh') +
    + + + + + + +
    {ERRORS_HEADLINE}:{ERRORS_COUNT_CHECKED} + {ERRORS_HELP_ERRORS}: {ERRORS_COUNT_ERRORS} ({ERRORS_COUNT_ERRORS_PERCENT} %)
    + + +
    + + + + + + + + + + +
    {ERRORS_HEADLINE_ARTICLE} (ID){ERRORS_HEADLINE_CATNAME} (ID){ERRORS_HEADLINE_LINK}{ERRORS_HEADLINE_DESCRIPTION}{ERRORS_HEADLINE_WHITELIST}
    + + +
    + + + + + +
    + + + + + + +
    + {ERRORS_HEADLINE_LINKS_ARTICLES} ({ERRORS_COUNT_ERRORS_ART}) + + +
    + + +
    + + + + + +
    + + + + + + +
    + {ERRORS_HEADLINE_LINKS_DOCIMAGES} ({ERRORS_COUNT_ERRORS_DOCIMAGES}) + + +
    + + +
    + + + + + +
    + + + + + + +
    + {ERRORS_HEADLINE_OTHERS} ({ERRORS_COUNT_ERRORS_OTHERS}) + + +
    + + +
    + + + + + + + + + + +
    {ERRORS_HEADLINE_CATNAME} (ID){ERRORS_HEADLINE_ARTICLE} (ID){ERRORS_HEADLINE_LINK}{ERRORS_HEADLINE_DESCRIPTION}{ERRORS_HEADLINE_WHITELIST}
    + + + + + +
    + + + + + + +
    + {ERRORS_HEADLINE_LINKS_CATEGORYS} ({ERRORS_COUNT_ERRORS_CAT}) + + +
    + + +
    + + + + + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors.html new file mode 100644 index 0000000..68ba173 --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors.html @@ -0,0 +1,7 @@ + + {ERRORS_ARTICLE_SHORT} ({ERRORS_ARTID}) + {ERRORS_CATNAME_SHORT} ({ERRORS_CATID}) + {ERRORS_LINK_SHORT} + {ERRORS_ERROR_TYPE} + + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors_cat.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors_cat.html new file mode 100644 index 0000000..1053ab0 --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_errors_cat.html @@ -0,0 +1,7 @@ + + {ERRORS_CATNAME_SHORT} ({ERRORS_CATID}) + {ERRORS_ARTICLE_SHORT} ({ERRORS_ARTID}) + {ERRORS_LINK_SHORT} + {ERRORS_ERROR_TYPE} + + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_nothing.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_nothing.html new file mode 100644 index 0000000..d04af58 --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_test_nothing.html @@ -0,0 +1,3 @@ + + {ERRORS_NOTHING} + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist.html new file mode 100644 index 0000000..5709541 --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist.html @@ -0,0 +1,51 @@ + + + + Linkchecker + + + + + + + + + + + + + + + + +

    {TITLE}

    {HELP}
    + +
    + + + + + + + + + +
    {HEADLINE_URLS} ({WHITELIST_COUNT}){HEADLINE_ENTRY}{HEADLINE_DELETE}
    + +
    + + + + {WHITELIST} + +
    + +
    + + + + + +
    + + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist_urls.html b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist_urls.html new file mode 100644 index 0000000..03b2aec --- /dev/null +++ b/conlite/plugins/linkchecker/templates/standard/template.linkchecker_whitelist_urls.html @@ -0,0 +1,5 @@ + + {URL} + {ENTRY} + + \ No newline at end of file diff --git a/conlite/plugins/linkchecker/xml/lang_de_DE.xml b/conlite/plugins/linkchecker/xml/lang_de_DE.xml new file mode 100644 index 0000000..6ccba5f --- /dev/null +++ b/conlite/plugins/linkchecker/xml/lang_de_DE.xml @@ -0,0 +1,14 @@ + + + + + + +
    Linkchecker
    + Linkanalyse + Whitelist + bersicht +
    +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/linkchecker/xml/lang_en_EN.xml b/conlite/plugins/linkchecker/xml/lang_en_EN.xml new file mode 100644 index 0000000..ff33301 --- /dev/null +++ b/conlite/plugins/linkchecker/xml/lang_en_EN.xml @@ -0,0 +1,14 @@ + + + + + + +
    Linkchecker
    + Link Analysis + Whitelist + Overview +
    +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/linkchecker/xml/lang_en_US.xml b/conlite/plugins/linkchecker/xml/lang_en_US.xml new file mode 100644 index 0000000..ff33301 --- /dev/null +++ b/conlite/plugins/linkchecker/xml/lang_en_US.xml @@ -0,0 +1,14 @@ + + + + + + +
    Linkchecker
    + Link Analysis + Whitelist + Overview +
    +
    +
    +
    \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewrite.php b/conlite/plugins/mod_rewrite/classes/class.modrewrite.php new file mode 100644 index 0000000..67bf45d --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewrite.php @@ -0,0 +1,1025 @@ + + * @copyright � www.polycoder.de + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2004-12-04 + * modified 2005-12-28 + * modified 2011-05-19 Murat Purc, fixed wrong code in function recreateArticlesAliases() + * + * $Id: class.modrewrite.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +/** + * Class to create websafe names + * + * @author Stefan Seifarth / stese + * @author Murat Purc + * @package Contenido Backend plugins + * @subpackage ModRewrite + */ +class ModRewrite extends ModRewriteBase +{ + + /** + * Database instance + * + * @var DB_ConLite + */ + private static $_db; + + + /** + * Initialization, is to call at least once, also possible to call multible + * times, if different client configuration is to load. + * + * Loads configuration of passed client and sets some properties. + * + * @param int $clientId Client id + */ + public static function initialize($clientId) + { + mr_loadConfiguration($clientId, true); + self::$_db = new DB_ConLite(); + } + + + /** + * Check categories on websafe name + * + * Check all categories in the main parent category on existing same websafe name + * + * @param string $sName Websafe name to check + * @param int $iCatId Current category id + * @param int $iLangId Current language id + * @return bool True if websafename already exists, false if not + */ + public static function isInCategories($sName = '', $iCatId = 0, $iLangId = 0) + { + global $cfg; + + $sName = self::$_db->escape($sName); + $iCatId = (int) $iCatId; + $iLangId = (int) $iLangId; + + // get parentid + $iParentId = 0; + $sql = "SELECT parentid FROM " . $cfg['tab']['cat'] . " WHERE idcat = '$iCatId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $iParentId = ($aData['parentid'] > 0 ) ? (int) $aData['parentid'] : 0; + } + + // check if websafe name is in this category + $sql = "SELECT count(cl.idcat) as numcats FROM " . $cfg['tab']['cat_lang'] . " cl " + . "LEFT JOIN " . $cfg['tab']['cat'] . " c ON cl.idcat = c.idcat WHERE " + . "c.parentid = '$iParentId' AND cl.idlang = '" . $iLangId . "' AND " + . "cl.urlname = '" . $sName . "' AND cl.idcat <> '$iCatId'"; + ModRewriteDebugger::log($sql, 'ModRewrite::isInCategories $sql'); + + if ($aData = mr_queryAndNextRecord($sql)) { + return ($aData['numcats'] > 0) ? true : false; + } + + return false; + } + + + /** + * Check articles on websafe name. + * + * Check all articles in the current category on existing same websafe name. + * + * @param string $sName Websafe name to check + * @param int $iArtId Current article id + * @param int $iLangId Current language id + * @param int $iCatId Category id + * @return bool True if websafename already exists, false if not + */ + public static function isInCatArticles($sName = '', $iArtId = 0, $iLangId = 0, $iCatId = 0) + { + global $cfg; + + $sName = self::$_db->escape($sName); + $iArtId = (int) $iArtId; + $iLangId = (int) $iLangId; + $iCatId = (int) $iCatId; + + // handle multipages + if ($iCatId == 0) { + // get category id if not set + $sql = "SELECT idcat FROM " . $cfg['tab']['cat_art'] . " WHERE idart = '$iArtId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $iCatId = ($aData['idcat'] > 0) ? (int) $aData['idcat'] : 0; + } + } + + // check if websafe name is in this category + $sql = "SELECT count(al.idart) as numcats FROM " . $cfg['tab']['art_lang'] . " al " + . "LEFT JOIN " . $cfg['tab']['cat_art'] . " ca ON al.idart = ca.idart WHERE " + . " ca.idcat='$iCatId' AND al.idlang='" . $iLangId . "' AND " + . "al.urlname='" . $sName . "' AND al.idart <> '$iArtId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + return ($aData['numcats'] > 0) ? true : false; + } + + return false; + } + + + /** + * Set websafe name in article list. + * + * Insert new websafe name in article list + * + * @param string $sName Original name (will be converted) + * @param int $iArtId Current article id + * @param int $iLangId Current language id + * @param int $iCatId Category id + * @return bool True if insert was successfully + */ + public static function setArtWebsafeName($sName = '', $iArtId = 0, $iLangId = 0, $iCatId = 0) + { + global $cfg; + + $iArtId = (int) $iArtId; + $iLangId = (int) $iLangId; + $iCatId = (int) $iCatId; + + // get websafe name + $sNewName = capiStrCleanURLCharacters(clHtmlEntityDecode($sName)); + + // remove double or more separators + $sNewName = mr_removeMultipleChars('-', $sNewName); + + $sNewName = self::$_db->escape($sNewName); + + // check if websafe name already exists + if (self::isInCatArticles($sNewName, $iArtId, $iLangId, $iCatId)) { + // create new websafe name if exists + $sNewName = $sNewName . $iArtId; + } + + // check again - and set name + if (!self::isInCatArticles($sNewName, $iArtId, $iLangId, $iCatId)) { + // insert websafe name in article list + $sql = "UPDATE " . $cfg['tab']['art_lang'] . " SET urlname = '$sNewName' " + . "WHERE idart = '$iArtId' AND idlang = '$iLangId'"; + return self::$_db->query($sql); + } else { + return false; + } + } + + + /** + * Set websafe name in category list. + * + * Insert new websafe name in category list. + * + * @param string $sName Original name (will be converted) or alias + * @param int $iCatId Category id + * @param int $iLangId Language id + * @return bool True if insert was successfully + */ + public static function setCatWebsafeName($sName = '', $iCatId = 0, $iLangId = 0) + { + global $cfg; + + $iCatId = (int) $iCatId; + $iLangId = (int) $iLangId; + + // create websafe name + $sNewName = capiStrCleanURLCharacters(clHtmlEntityDecode($sName)); + + // remove double or more separators + $sNewName = mr_removeMultipleChars('-', $sNewName); + + $sNewName = self::$_db->escape($sNewName); + + // check if websafe name already exists + if (self::isInCategories($sNewName, $iCatId, $iLangId)) { + // create new websafe name if exists + $sNewName = $sNewName . $iCatId; + } + + // check again - and set name + if (!self::isInCategories($sNewName, $iCatId, $iLangId)) { + // insert websafe name in article list + $sql = "UPDATE " . $cfg['tab']['cat_lang'] . " SET urlname = '$sNewName' " + . "WHERE idcat = '$iCatId' AND idlang = '$iLangId'"; + + ModRewriteDebugger::log(array( + 'sName' => $sName, + 'iCatId' => $iCatId, + 'iLangId' => $iLangId, + 'sNewName' => $sNewName + ), 'ModRewrite::setCatWebsafeName $data' + ); + + return self::$_db->query($sql); + + } else { + return false; + } + } + + + /** + * Set urlpath of category + * + * @param int $iCatId Category id + * @param int $iLangId Language id + * @return bool True if insert was successfully + */ + public static function setCatUrlPath($iCatId = 0, $iLangId = 0) + { + global $cfg; + + $sPath = self::buildRecursivPath($iCatId, $iLangId); + + $iCatId = (int) $iCatId; + $iLangId = (int) $iLangId; + + // insert websafe name in article list + $sql = "UPDATE " . $cfg['tab']['cat_lang'] . " SET urlpath = '$sPath' " + . "WHERE idcat = '$iCatId' AND idlang = '$iLangId'"; + + ModRewriteDebugger::log(array( + 'iCatId' => $iCatId, + 'iLangId' => $iLangId, + 'sPath' => $sPath + ), 'ModRewrite::setCatUrlPath $data' + ); + + return self::$_db->query($sql); + } + + + /** + * Get article id and language id from article language id + * + * @param int $iArtlangId Current article id + * @return array Array with idart and idlang of current article + */ + public static function getArtIdByArtlangId($iArtlangId = 0) + { + global $cfg; + + $iArtlangId = (int) $iArtlangId; + $sql = "SELECT idart, idlang FROM " . $cfg['tab']['art_lang'] . " WHERE idartlang = '$iArtlangId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + return $aData; + } + return array(); + } + + + /** + * Get article id by article websafe name + * + * @param string Websafe name + * @param int Category id + * @return int|null Recent article id or null + */ + public static function getArtIdByWebsafeName($sArtName = '', $iCatId = 0, $iLangId = 0) + { + global $cfg; + + $sArtName = self::$_db->escape($sArtName); + $iCatId = (int) $iCatId; + $iLangId = (int) $iLangId; + + $sWhere = ''; + if ($iLangId !== 0) { + $sWhere = ' AND al.idlang=' . $iLangId; + } + // only article name were given + if ($iCatId == 0) { + // get all basic category ids with parentid=0 + $aCatIds = array(); + $sql = "SELECT idcat FROM " . $cfg['tab']['cat'] . " WHERE parentid = '0'"; + self::$_db->query($sql); + while (self::$_db->next_record()) { + $aCatIds[] = "idcat = '" . self::$_db->f('idcat') . "'"; + } + $sWhere .= " AND ( " . join(" OR ", $aCatIds) . ")"; + } else { + $sWhere .= " AND ca.idcat = '$iCatId'"; + } + + $sql = "SELECT al.idart FROM " . $cfg['tab']['art_lang'] . " al " + . "LEFT JOIN " . $cfg['tab']['cat_art'] . " ca ON al.idart = ca.idart " + . "WHERE al.urlname = '$sArtName'" . $sWhere; + + if ($aData = mr_queryAndNextRecord($sql)) { + return $aData['idart']; + } else { + return null; + } + } + + + /** + * Get category name from category id and language id. + * + * @param int $iCatId Category id + * @param int $iLangId Language id + * @return string Category name + */ + public static function getCatName($iCatId = 0, $iLangId = 0) + { + global $cfg, $mr_statics; + + $iCatId = (int) $iCatId; + $iLangId = (int) $iLangId; + $key = 'catname_by_catid_idlang_' . $iCatId . '_' . $iLangId; + + if (isset($mr_statics[$key])) { + return $mr_statics[$key]; + } + + $sql = "SELECT name FROM " . $cfg['tab']['cat_lang'] . " WHERE idcat = '$iCatId' AND idlang = '$iLangId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $catName = $aData['name']; + } else { + $catName = ''; + } + + $mr_statics[$key] = $catName; + return $catName; + } + + + /** + * Funcion to return cat id by path. + * + * Caches the paths at first call to provode faster processing at further calls. + * + * @todo add support for more than one hit for idcat, happens if u have same name for different idcats + * maybe one can check for on or offline cat or redirect in start-article + * @param string $path Category path + * @return int Category id + */ + public static function getCatIdByUrlPath($path) + { + global $cfg, $client, $lang, $mr_statics; + + if (strpos($path, '/') === 0) { + $path = substr($path, 1); + } + if (strrpos($path, '/') === strlen($path)-1) { + $path = substr($path, 0, -1); + } + + $catSeperator = '/'; + $startFromRoot = parent::getConfig('startfromroot'); + $urls2lowercase = parent::getConfig('use_lowercase_uri'); + + $path = str_replace('/', parent::getConfig('category_seperator'), $path); + + $key = 'cat_ids_and_urlpath'; + + if (isset($mr_statics[$key])) { + $aPathsCache = $mr_statics[$key]; + } else { + $aPathsCache = array(); + } + + if (count($aPathsCache) == 0) { + $sql = "SELECT cl.idcat, cl.urlpath FROM " . $cfg['tab']['cat_lang'] + . " AS cl, " . $cfg['tab']['cat'] . " AS c WHERE c.idclient = " . $client + . " AND c.idcat = cl.idcat AND cl.idlang = " . $lang; + self::$_db->query($sql); + while (self::$_db->next_record()) { + $urlPath = self::$_db->f('urlpath'); + if ($startFromRoot == 0 && strpos($urlPath, $catSeperator) > 0) { + // paths are stored with prefixed main category, but created + // urls doesn't contain the main cat, remove it... + $urlPath = substr($urlPath, strpos($urlPath, $catSeperator)+1); + } + if ($urls2lowercase) { + $urlPath = strtolower($urlPath); + } + + // store path + $aPathsCache[self::$_db->f('idcat')] = $urlPath; + } + } + $mr_statics[$key] = $aPathsCache; + + // compare paths using the similar_text algorithm + $fPercent = 0; + $aResults = array(); + foreach ($aPathsCache as $id => $pathItem) { + similar_text($path, $pathItem, $fPercent); + $aResults[$id] = $fPercent; + } + + arsort($aResults, SORT_NUMERIC); + reset($aResults); + + ModRewriteDebugger::add($path, 'ModRewrite::getCatIdByUrlPath() $path'); + ModRewriteDebugger::add($aPathsCache, 'ModRewrite::getCatIdByUrlPath() $aPathsCache'); + ModRewriteDebugger::add($aResults, 'ModRewrite::getCatIdByUrlPath() $aResults'); + + $iMinPercentage = (int) parent::getConfig('category_resolve_min_percentage', 0); + $catId = key($aResults); + if ($iMinPercentage > 0 && $aResults[$catId] < $iMinPercentage) { + return 0; + } else { + return $catId; + } + } + + + /** + * Get article name from article id and language id + * + * @NOTE: seems to be not used??? + * + * @param int $iArtId Article id + * @param int $iLangId Language id + * @return string Article name + */ + public static function getArtTitle($iArtId = 0, $iLangId = 0) + { + global $cfg; + + $iArtId = (int) $iArtId; + $iLangId = (int) $iLangId; + + $sql = "SELECT title FROM " . $cfg['tab']['art_lang'] . " WHERE " + . "idart = '$iArtId' AND idlang = '$iLangId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + return $aData['title']; + } + return ''; + } + + + /** + * Get language ids from category id + * + * @param int $iCatId Category id + * @return array Used language ids + */ + public static function getCatLanguages($iCatId = 0) + { + global $cfg, $mr_statics; + + $iCatId = (int) $iCatId; + $key = 'cat_idlang_by_catid_' . $iCatId; + + if (isset($mr_statics[$key])) { + return $mr_statics[$key]; + } + + $aLanguages = array(); + + $sql = "SELECT idlang FROM " . $cfg['tab']['cat_lang'] . " WHERE idcat = '$iCatId'"; + self::$_db->query($sql); + while (self::$_db->next_record()) { + $aLanguages[] = self::$_db->f('idlang'); + } + + $mr_statics[$key] = $aLanguages; + return $aLanguages; + } + + + /** + * Get article urlname and language id + * + * @param int $iArtlangId idartlang + * @return array Urlname, idlang of empty array + */ + public static function getArtIds($iArtlangId = 0) + { + global $cfg; + + $iArtlangId = (int) $iArtlangId; + $sql = "SELECT urlname, idlang FROM " . $cfg['tab']['art_lang'] . " WHERE idartlang = '$iArtlangId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + return $aData; + } + return array(); + } + + + /** + * Build a recursiv path for mod_rewrite rule like server directories + * (dir1/dir2/dir3) + * + * @param int $iCatId Latest category id + * @param int $iLangId Language id + * @param int $iLastId Last category id + * @return string linkpath with correct uri + */ + public static function buildRecursivPath($iCatId = 0, $iLangId = 0, $iLastId = 0) + { + global $cfg; + + $aDirectories = array(); + $bFinish = false; + $iTmpCatId = (int) $iCatId; + $iLangId = (int) $iLangId; + $iLastId = (int) $iLastId; + + while ($bFinish == false) { + $sql = "SELECT cl.urlname, c.parentid FROM " . $cfg['tab']['cat_lang'] . " cl " + . "LEFT JOIN " . $cfg['tab']['cat'] . " c ON cl.idcat = c.idcat " + . "WHERE cl.idcat = '$iTmpCatId' AND cl.idlang = '$iLangId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $aDirectories[] = $aData['urlname']; + $iTmpCatId = (int) $aData['parentid']; + + if ($aData['parentid'] == 0 || $aData['parentid'] == $iLastId) { + $bFinish = true; + } + } else { + $bFinish = true; + } + } + + // reverse array entries and create directory string + $sPath = join('/', array_reverse($aDirectories)); + + return $sPath; + } + + + /** + * Return full contenido url from single anchor + * + * @param array $aMatches [0] = complete anchor, [1] = pre arguments, [2] = anchor name, [3] = post arguments + * @return string New anchor + */ + public static function rewriteHtmlAnchor(array $aMatches = array()) + { + global $artname, $sess, $idart, $idcat, $client, $lang; + + // set article name + $sArtParam = ''; + if (isset($artname) && strlen($artname) > 0) { + $sArtParam = '&idart=' . (int) $idart; + } + + // check for additional parameter in url + $aParamsToIgnore = array ('idcat', 'idart', 'lang', 'client', 'idcatart', 'changelang', 'changeclient', 'idartlang', 'parts', 'artname'); + $sOtherParams = ''; + + if (isset($_GET) && count($_GET) > 0) { + foreach ($_GET as $key => $value) { + if (!in_array($key, $aParamsToIgnore) && strlen(trim($value)) > 0) { + $aNoAnchor = explode('#', $value); + $sOtherParams .= '&' . urlencode(urldecode($key)) . '=' . urlencode(urldecode($value)); + } + } + } + + $url = $sess->url( + 'front_content.php?' . 'idcat=' . (int) $idcat . '&client=' . (int) $client . + '&changelang=' . (int) $lang . $sArtParam . $sOtherParams . '#' . $aMatches[2] + ); + + $sNewUrl = ''; + + return $sNewUrl; + } + + + /** + * Return full contenido url from single anchor + * + * @param array $aMatches [0] = complete anchor, [1] = pre arguments, [2] = anchor name, [3] = post arguments + * @return string New anchor + */ + public static function contenidoHtmlAnchor(array $aMatches = array(), $bXHTML = true) + { + global $artname, $sess; + + $aParams = array(); + $sAmpersand = $bXHTML ? '&' : '&'; + + foreach ($_GET as $key => $value) { + $aNoAnchor = explode('#', $value); + $aParams[] = urlencode(urldecode($key)) . '=' . urlencode(urldecode($aNoAnchor[0])); + } + + $url = $sess->url( 'front_content.php?' . implode($sAmpersand, $aParams) . '#' . $aMatches[2]); + $sNewUrl = ''; + + return $sNewUrl; + } + + + /** + * Get article websafe name from article id and language id. + * + * @param int $iArtId Article id + * @param int $iLangId Language id + * @return string Article websafe name + */ + public static function getArtWebsafeName($iArtId = 0, $iLangId = 0) + { + global $cfg; + + $iArtId = (int) $iArtId; + $iLangId = (int) $iLangId; + $sql = "SELECT urlname FROM " . $cfg['tab']['art_lang'] . " WHERE " + . "idart = '" . $iArtId . "' AND idlang = '" . $iLangId . "'"; + if ($aData = mr_queryAndNextRecord($sql)) { + return urldecode($aData['urlname']); + } + return null; + } + + + /** + * Get article websafe name from idartlang. + * + * @param int $iArtLangId idartlang + * @return string Article websafe name + */ + public static function getArtLangWebsafeName($iArtLangId = 0) + { + global $cfg; + + $iArtLangId = (int) $iArtLangId; + $sql = "SELECT urlname FROM " . $cfg['tab']['art_lang'] . " WHERE idartlang = '". $iArtLangId . "'"; + if ($aData = mr_queryAndNextRecord($sql)) { + return urldecode($aData['urlname']); + } + return null; + } + + + /** + * Get name of client by id. + * + * @param int $clientId Client id + * @return string Client name + */ + public static function getClientName($clientId = 0) + { + global $cfg, $mr_statics; + + $clientId = (int) $clientId; + $key = 'clientname_by_clientid_' . $clientId; + + if (isset($mr_statics[$key])) { + return $mr_statics[$key]; + } + + $sql = "SELECT name FROM " . $cfg['tab']['clients'] . " WHERE idclient = '$clientId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $clientName = $aData['name']; + } else { + $clientName = ''; + } + + $mr_statics[$key] = $clientName; + return $clientName; + } + + + /** + * Get client id from client name + * + * @param string Client name + * @return integer Client id + */ + public static function getClientId($sClientName = '') + { + global $cfg, $mr_statics; + + $sClientName = self::$_db->escape($sClientName); + $key = 'clientid_by_name_' . $sClientName; + + if (isset($mr_statics[$key])) { + return $mr_statics[$key]; + } + + $sql = "SELECT idclient FROM " . $cfg['tab']['clients'] . " WHERE name = '" . urldecode($sClientName) . "'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $clientId = $aData['idclient']; + } else { + $clientId = false; + } + + $mr_statics[$key] = $clientId; + return $clientId; + } + + + /** + * Returns name of language by id. + * + * @param int $languageId Language id + * @return string Lanuage name + */ + public static function getLanguageName($languageId = 0) + { + global $cfg, $mr_statics; + + $languageId = (int) $languageId; + $key = 'languagename_by_id_' . $languageId; + + if (isset($mr_statics[$key])) { + return $mr_statics[$key]; + } + + $sql = "SELECT name FROM " . $cfg['tab']['lang'] . " WHERE idlang = '$languageId'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $languageName = $aData['name']; + } else { + $languageName = ''; + } + + $mr_statics[$key] = $languageName; + return $languageName; + } + + + /** + * Get language id from language name thanks to Nicolas Dickinson for multi + * Client/Language BugFix + * + * @param string $sLanguageName Language name + * @param int $iClientId Client id + * @return integer Language id + */ + public static function getLanguageId($sLanguageName = '', $iClientId = 1) + { + global $cfg, $mr_statics; + + $sLanguageName = self::$_db->escape($sLanguageName); + $iClientId = (int) $iClientId; + $key = 'langid_by_langname_clientid_' . $sLanguageName . '_' . $iClientId; + + if (isset($mr_statics[$key])) { + return $mr_statics[$key]; + } + + $sql = "SELECT l.idlang FROM " . $cfg['tab']['lang'] . " as l " + . "LEFT JOIN " . $cfg['tab']['clients_lang'] . " AS cl ON l.idlang = cl.idlang " + . "WHERE cl.idclient = '". $iClientId . "' AND l.name = '" . urldecode($sLanguageName) . "'"; + if ($aData = mr_queryAndNextRecord($sql)) { + $languageId = $aData['idlang']; + } else { + $languageId = false; + } + + $mr_statics[$key] = $languageId; + return $languageId; + } + + + /** + * Splits passed argument into scheme://host and path/query. + * + * Example: + * input = http://host/front_content.php?idcat=123 + * return = array('htmlpath' => 'http://host', 'url' => 'front_content.php?idcat=123') + * + * @param string $url URL to split + * @return array Assoziative array including the two parts: + * - array('htmlpath' => $path, 'url' => $url) + */ + public static function getClientFullUrlParts($url) + { + global $cfg, $cfgClient; + + $clientPath = $cfgClient[$client]['path']['htmlpath']; + + if (stristr($url, $clientPath) !== false) { + // url includes full html path (scheme host path, etc.) + $url = str_replace($clientPath, '', $url); + $htmlPath = $clientPath; + $aComp = parse_url($htmlPath); + + // check if path matches to defined rootdir from mod_rewrite conf + if (isset($aComp['path']) && $aComp['path'] !== parent::getConfig('rootdir')) { + // replace not matching path agaings configured one + // this will replace e. g. "http://host/cms/" against "http://host/" + $htmlPath = str_replace($aComp['path'], parent::getConfig('rootdir'), $htmlPath); + if (substr($htmlPath, strlen($htmlPath)-1) == '/') { + // remove last slash + $htmlPath = substr($htmlPath, 0, strlen($htmlPath)-1); + } + } + } else { + $htmlPath = ''; + } + return array('htmlpath' => $htmlPath, 'url' => $url); + } + + + /** + * Function to preclean a url. + * + * Removes absolute path declaration '/front_content.php' or relative path + * definition to actual dir './front_content.php', ampersand entities '&' + * and returns a url like 'front_content.php?idart=12&idlang=1' + * + * @param string $url Url to clean + * @return string Cleaned Url + */ + public static function urlPreClean($url) + { + // some preparation of different front_content.php occurence + if (strpos($url, './front_content.php') === 0) { + $url = str_replace('./front_content.php', 'front_content.php', $url); + } elseif (strpos($url, '/front_content.php') === 0) { + $url = str_replace('/front_content.php', 'front_content.php', $url); + } + $url = str_replace('&', '&', $url); + return $url; + } + + + /** + * Method to reset all aliases in categories. + * + * Clears all urlname entries in cat_lang table, and sets the value for all + * existing entries. + * + * @deprecated see ModRewrite::recreateCategoriesAliases(); + */ + public static function resetCategoriesAliases() + { + self::recreateCategoriesAliases(); + } + + + /** + * Recreates all or only empty aliases in categories table. + * + * @param bool $bOnlyEmpty Flag to reset only empty items + */ + public static function recreateCategoriesAliases($bOnlyEmpty = false) + { + global $cfg; + + $db = new DB_ConLite(); + + $aCats = array(); + + // get all or only empty categories + $sql = "SELECT name, idcat, idlang FROM " . $cfg['tab']['cat_lang']; + if ($bOnlyEmpty === true) { + $sql .= " WHERE urlname IS NULL OR urlname = '' OR urlpath IS NULL OR urlpath = ''"; + } + + $db->query($sql); + while ($db->next_record()) { + //set new alias + self::setCatWebsafeName($db->f('name'), $db->f('idcat'), $db->f('idlang')); + $aCats[] = array('idcat' => $db->f('idcat'), 'idlang' => $db->f('idlang')); + } + + foreach ($aCats as $p => $item) { + self::setCatUrlPath($item['idcat'], $item['idlang']); + } + + unset($db, $aCats); + } + + + /** + * Method to reset all aliases in articles. + * + * Clears all urlname entries in art_lang table, and sets the value for all + * existing entries. + * + * @deprecated see ModRewrite::recreateArticlesAliases(); + */ + public static function resetArticlesAliases() + { + self::recreateArticlesAliases(); + } + + + /** + * Recreates all or only empty urlname entries in art_lang table. + * + * @param bool $bOnlyEmpty Flag to reset only empty items + */ + public static function recreateArticlesAliases($bOnlyEmpty = false) + { + global $cfg; + + $db = new DB_ConLite(); + + // get all or only empty articles + $sql = "SELECT title, idart, idlang FROM " . $cfg['tab']['art_lang']; + if ($bOnlyEmpty === true) { + $sql .= " WHERE urlname IS NULL OR urlname = ''"; + } + $db->query($sql); + + while ($db->next_record()) { + //set new alias + self::setArtWebsafeName($db->f('title'), $db->f('idart'), $db->f('idlang')); + } + + unset ($db); + } + + + /** + * Method to reset all aliases (categories and articles). + * + * Shortcut to recreateCategoriesAliases() and recreateArticlesAliases() + */ + public static function resetAliases() + { + self::recreateCategoriesAliases(); + self::recreateArticlesAliases(); + } + + + /** + * Recreate all or only empty aliases (categories and articles). + * + * Shortcut to recreateCategoriesAliases() and recreateArticlesAliases() + * + * @param bool $bOnlyEmpty Flag to reset only empty items + */ + public static function recreateAliases($bOnlyEmpty = false) + { + self::recreateCategoriesAliases($bOnlyEmpty); + self::recreateArticlesAliases($bOnlyEmpty); + } + + + /** + * Used to postprocess resolved path + * + * Error site handling if category not found + * + * if percentage == 100 and there is no 100 percentage result value, + * error site will be shown - can be adjust by user settings for + * smooth similar effects - 80 to 95 will be best but have to check by user + * + * @deprecated Is no more used + * + * @param array $results Pathresolver results array + * @return mixed Categoryid or false + */ + public static function getIdFromPathresolverResult($results) + { + $iMinPercentage = (int) parent::getConfig('category_resolve_min_percentage', 0); + $catId = key($results); + if ($iMinPercentage > 0 && $results[$catId] < $iMinPercentage) { + return false; + } else { + return $catId; + } + } + + /** + * Returns .htaccess related assoziative info array + * + * @return array + */ + public static function getHtaccessInfo() + { + global $cfg, $client, $cfgClient; + + $arr = array( + 'contenido_full_path' => str_replace('\\', '/', realpath($cfg['path']['contenido'] . '../') . '/'), + 'client_full_path' => $cfgClient[$client]['path']['frontend'], + ); + $arr['in_contenido_path'] = is_file($arr['contenido_full_path'] . '.htaccess'); + $arr['in_client_path'] = is_file($arr['client_full_path'] . '.htaccess'); + $arr['has_htaccess'] = ($arr['in_contenido_path'] || $arr['in_client_path']); + + return $arr; + } +} diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewritebase.php b/conlite/plugins/mod_rewrite/classes/class.modrewritebase.php new file mode 100644 index 0000000..c35b556 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewritebase.php @@ -0,0 +1,99 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-09-24 + * + * $Id: class.modrewritebase.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +/** + * Abstract base mod rewrite class. + * + * Provides some common features such as common debugging, globals/configuration + * access for childs. + * + * @author Murat Purc + * @package Contenido Backend plugins + * @subpackage ModRewrite + */ +abstract class ModRewriteBase +{ + + /** + * Returns enabled state of mod rewrite plugin + * + * @return bool + */ + public static function isEnabled() + { + return (self::getConfig('use', 0) == 1) ? true : false; + } + + /** + * Sets the enabled state of mod rewrite plugin + * + * @pparam bool $bEnabled + */ + public static function setEnabled($bEnabled) + { + self::setConfig('use', (bool) $bEnabled); + } + + + /** + * Returns configuration of mod rewrite, content of gobal $cfg['mod_rewrite'] + * + * @param string $key Name of configuration key + * @return mixed Desired value mr configuration, either the full configuration + * or one of the desired subpart + */ + public static function getConfig($key=null, $default=null) + { + global $cfg; + if ($key == null) { + return $cfg['mod_rewrite']; + } elseif ((string) $key !== '') { + return (isset($cfg['mod_rewrite'][$key])) ? $cfg['mod_rewrite'][$key] : $default; + } else { + return $default; + } + } + + /** + * Sets the configuration of mod rewrite, content of gobal $cfg['mod_rewrite'] + * + * @param string $key Name of configuration key + * @param mixed $value The value to set + */ + public static function setConfig($key, $value) + { + global $cfg; + $cfg['mod_rewrite'][$key] = $value; + } + +} diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewritecontroller.php b/conlite/plugins/mod_rewrite/classes/class.modrewritecontroller.php new file mode 100644 index 0000000..9d5a022 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewritecontroller.php @@ -0,0 +1,634 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-04-16 + * + * $Id: class.modrewritecontroller.php 211 2013-01-25 09:30:14Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +/** + * Mod Rewrite controller class. Extracts url parts and sets some necessary globals like: + * - $idart + * - $idcat + * - $client + * - $changeclient + * - $lang + * - $changelang + * + * @author Murat Purc + * @package Contenido Backend plugins + * @subpackage ModRewrite + */ +class ModRewriteController extends ModRewriteBase +{ + + /** + * Extracted request uri path parts by path separator '/' + * + * @var array + */ + private $_aParts; + + /** + * Extracted article name from request uri + * + * @var string + */ + private $_sArtName; + + /** + * Remaining path for path resolver (see $GLOBALS['path']) + * + * @var string + */ + private $_sPath; + + /** + * Incomming URL + * + * @var string + */ + private $_sIncommingUrl; + + /** + * Resolved URL + * + * @var string + */ + private $_sResolvedUrl; + + /** + * Client id used by this class + * + * @var int + */ + private $_iClientMR; + + /** + * Flag about occured errors + * + * @var bool + */ + private $_bError = false; + + /** + * Flag about found routing definition + * + * @var bool + */ + private $_bRoutingFound = false; + + + /** + * Constructor, sets several properties. + * + * @param string $incommingUrl Incomming URL + */ + public function __construct($incommingUrl) + { + $this->_sIncommingUrl = $incommingUrl; + $this->_aParts = array(); + } + + + /** + * Getter for overwritten client id (see $GLOBALS['client']) + * + * @return int Client id + */ + public function getClient() + { + return $GLOBALS['client']; + } + + + /** + * Getter for overwritten change client id (see $GLOBALS['changeclient']) + * + * @return int Change client id + */ + public function getChangeClient() + { + return $GLOBALS['changeclient']; + } + + + /** + * Getter for article id (see $GLOBALS['idart']) + * + * @return int Article id + */ + public function getIdArt() + { + return $GLOBALS['idart']; + } + + + /** + * Getter for category id (see $GLOBALS['idcat']) + * + * @return int Category id + */ + public function getIdCat() + { + return $GLOBALS['idcat']; + } + + + /** + * Getter for language id (see $GLOBALS['lang']) + * + * @return int Language id + */ + public function getLang() + { + return $GLOBALS['lang']; + } + + + /** + * Getter for change language id (see $GLOBALS['change_lang']) + * + * @return int Change language id + */ + public function getChangeLang() + { + return $GLOBALS['change_lang']; + } + + + /** + * Getter for path (see $GLOBALS['path']) + * + * @return string Path, used by path resolver + */ + public function getPath() + { + return $this->_sPath; + } + + + /** + * Getter for resolved url + * + * @return string Resolved url + */ + public function getResolvedUrl() + { + return $this->_sResolvedUrl; + } + + + /** + * Returns a flag about found routing definition + * + * return bool Flag about found routing + */ + public function getRoutingFoundState() + { + return $this->_bRoutingFound; + } + + + /** + * Getter for occured error state + * + * @return bool Flag for occured error + */ + public function errorOccured() + { + return $this->_bError; + } + + + /** + * Main function to call for mod rewrite related preprocessing jobs. + * + * Executes some private functions to extract request URI and to set needed membervariables + * (client, language, article id, category id, etc.) + */ + public function execute() + { + if (parent::isEnabled() == false) { + return; + } + + $this->_extractRequestUri(); + + $this->_initializeClientId(); + + $this->_setClientId(); + + mr_loadConfiguration($this->_iClientMR); + + $this->_setLanguageId(); + + // second call after setting client and language + $this->_extractRequestUri(true); + + $this->_setPathresolverSetting(); + + $this->_setIdart(); + + ModRewriteDebugger::add($this->_aParts, 'ModRewriteController::execute() _setIdart'); + + $this->_postValidation(); + } + + + /** + * Extracts request URI and sets member variables $this->_sArtName and $this->_aParts + * + * @param bool $secondCall Flag about second call of this function, is needed + * to re extract url if a routing definition was found + */ + private function _extractRequestUri($secondCall = false) + { + global $client; + + // check for defined rootdir + if (parent::getConfig('rootdir') !== '/' && strpos($_SERVER['REQUEST_URI'], $this->_sIncommingUrl) === 0) { + $this->_sIncommingUrl = str_replace(parent::getConfig('rootdir'), '/', $this->_sIncommingUrl); + } + + $aUrlComponents = $this->_parseUrl($this->_sIncommingUrl); + if (isset($aUrlComponents['path'])) { + if (parent::getConfig('rootdir') !== '/' && strpos($aUrlComponents['path'], parent::getConfig('rootdir')) === 0) { + $aUrlComponents['path'] = str_replace(parent::getConfig('rootdir'), '/', $aUrlComponents['path']); + } + + if ($secondCall == true) { + + // @todo: implement real redirect of old front_content.php style urls + + // check for routing definition + $routings = parent::getConfig('routing'); + if (is_array($routings) && isset($routings[$aUrlComponents['path']])) { + $aUrlComponents['path'] = $routings[$aUrlComponents['path']]; + if (strpos($aUrlComponents['path'], 'front_content.php') !== false) { + // routing destination contains front_content.php + + $this->_bRoutingFound = true; + + // set client language, if not set before + mr_setClientLanguageId($client); + + //rebuild URL + $url = mr_buildNewUrl($aUrlComponents['path']); + + $aUrlComponents = $this->_parseUrl($url); + + // add query parameter to superglobal _GET + if (isset($aUrlComponents['query'])) { + parse_str($aUrlComponents['query'], $vars); + $_GET = array_merge($_GET, $vars); + } + + $this->_aParts = array(); + } + } else { + return; + } + } + $sPath = (parent::getConfig('use_lowercase_uri') == true)?strtolower($aUrlComponents['path']):$aUrlComponents['path']; + $aPaths = explode('/', $aUrlComponents['path']); + foreach ($aPaths as $p => $item) { + if (!empty($item)) { + // pathinfo would also work + $arr = explode('.', $item); + $count = count($arr); + if ($count > 0 && '.' . strtolower($arr[$count-1]) == parent::getConfig('file_extension')) { + array_pop($arr); + $this->_sArtName = implode('.', $arr); + } else { + $this->_aParts[] = $item; + } + } + } + + if ($secondCall == true) { + // reprocess extracting client and language + $this->_setClientId(); + mr_loadConfiguration($this->_iClientMR); + $this->_setLanguageId(); + } + + } + ModRewriteDebugger::add($this->_aParts, 'ModRewriteController::_extractRequestUri() $this->_aParts'); + + // loop parts array and remove existing 'front_content.php' + if ($this->_hasPartArrayItems()) { + foreach($this->_aParts as $p => $item) { + if ($item == 'front_content.php') { + unset($this->_aParts[$p]); + } + } + } + + // set parts property top null, if needed + if ($this->_hasPartArrayItems() == false) { + $this->_aParts = null; + } + + // set artname to null if needed + if (!isset($this->_sArtName) || empty($this->_sArtName) || strlen($this->_sArtName) == 0) { + $this->_sArtName = null; + } + + } + + + /** + * Tries to initialize the client id + */ + private function _initializeClientId() + { + global $client, $changeclient, $load_client; + + $iClient = (isset($client) && (int) $client > 0) ? $client : 0; + $iChangeClient = (isset($changeclient) && (int) $changeclient > 0) ? $changeclient : 0; + $iLoadClient = (isset($load_client) && (int) $load_client > 0) ? $load_client : 0; + + $this->_iClientMR = 0; + if ($iClient > 0 && $iChangeClient == 0) { + $this->_iClientMR = $iClient; + } elseif ($iChangeClient > 0) { + $this->_iClientMR = $iChangeClient; + } else { + $this->_iClientMR = $iLoadClient; + } + + if ((int) $this->_iClientMR > 0) { + // set global client variable + $client = (int) $this->_iClientMR; + } + } + + + /** + * Sets client id + */ + private function _setClientId() + { + global $client, $changeclient, $load_client; + + if ($this->_hasPartArrayItems() == false || parent::getConfig('use_client') !== 1) { + return; + } + + $iClient = (isset($client) && (int) $client > 0) ? $client : 0; + $iLoadClient = (isset($load_client) && (int) $load_client > 0) ? $load_client : 0; + + if (parent::getConfig('use_client_name') == 1) { + $changeclient = ModRewrite::getClientId(array_shift($this->_aParts)); + $this->_iClientMR = $changeclient; + } else { + $changeclient = (int) array_shift($this->_aParts); + $this->_iClientMR = $changeclient; + } + + if (empty($changeclient) || (int) $changeclient <= 0) { + $changeclient = $iLoadClient; + } + if ($iClient > 0 && $changeclient !== $iClient) { + // overwrite existing client variable + $this->_iClientMR = $changeclient; + $client = $changeclient; + } + } + + + /** + * Sets language id + */ + private function _setLanguageId() + { + global $lang, $changelang; + + if ($this->_hasPartArrayItems() == false || parent::getConfig('use_language') !== 1) { + return; + } + + if (parent::getConfig('use_language_name') == 1) { + // thanks to Nicolas Dickinson for multi Client/Language BugFix + $changelang = ModRewrite::getLanguageId(array_shift($this->_aParts) , $this->_iClientMR); + } else { + $changelang = (int) array_shift($this->_aParts); + } + + if ((int) $changelang > 0) { + $lang = $changelang; + $changelang = $changelang; + } + } + + + /** + * Sets path resolver and category id + */ + private function _setPathresolverSetting() + { + global $client, $lang, $load_lang, $idcat; + + if ($this->_hasPartArrayItems() == false) { + return; + } + + $this->_sPath = '/' . implode('/', $this->_aParts) . '/'; + + if (!isset($lang) || (int) $lang <= 0) { + if ((int) $load_lang > 0) { + // load_client is set in frontend/config.php + $lang = (int) $load_lang; + } else { + // get client id from table + cInclude('classes', 'contenido/class.clientslang.php'); + $clCol = new cApiClientLanguageCollection(); + $clCol->setWhere('idclient', $client); + $clCol->query(); + if ($clItem = $clCol->next()) { + $lang = $clItem->get('idlang'); + } + } + } + + $idcat = (int) ModRewrite::getCatIdByUrlPath($this->_sPath); + + if ($idcat == 0) { + // category couldn't resolved + $this->_bError = true; + $idcat = null; + } else { + // unset $this->_sPath if $idcat could set, otherwhise it would be resolved again. + unset($this->_sPath); + } + + ModRewriteDebugger::add($idcat, 'ModRewriteController->_setPathresolverSetting $idcat'); + ModRewriteDebugger::add($this->_sPath, 'ModRewriteController->_setPathresolverSetting $this->_sPath'); + } + + + /** + * Sets article id + */ + private function _setIdart() + { + global $idcat, $idart, $lang; + + // startarticle name in url + if (parent::getConfig('add_startart_name_to_url') && isset($this->_sArtName)) { + if ($this->_sArtName == parent::getConfig('default_startart_name')) { + // stored articlename is the default one, remove it ModRewrite::getArtIdByWebsafeName() + // will find the real article name + $this->_sArtName = null; + } + } + + $idcat = (isset($idcat) && (int) $idcat > 0) ? $idcat : null; + $idart = (isset($idart) && (int) $idart > 0) ? $idart : null; + + if ($idcat !== null && $this->_sArtName && $idart == null) { + // existing idcat with article name and no idart + $idart = ModRewrite::getArtIdByWebsafeName($this->_sArtName, $idcat, $lang); + } elseif ($idcat > 0 && $this->_sArtName == null && $idart == null) { + + if (parent::getConfig('add_startart_name_to_url') && parent::getConfig('default_startart_name') == '') { + + // existing idcat without article name and idart + cInclude('classes', 'class.article.php'); + $artColl = new ArticleCollection(array('idcat' => $idcat, 'start' => 1)); + if ($artItem = $artColl->startArticle()) { + $idart = $artItem->get('idart'); + } + + } + + } elseif ($idcat == null && $idart == null && isset($this->_sArtName)) { + // no idcat and idart but article name + $idart = ModRewrite::getArtIdByWebsafeName($this->_sArtName); + } + + if ($idart !== null && (!$idart || (int) $idart == 0)) { + if (parent::getConfig('redirect_invalid_article_to_errorsite') == 1) { + $this->_bError = true; + $idart = null; + } + } + + ModRewriteDebugger::add($idart, 'ModRewriteController->_setIdart $idart'); + } + + + /** + * Does post validation of the extracted data. + * + * One main goal of this function is to prevent duplicated content, which could happen, if + * the configuration 'startfromroot' is activated. + */ + private function _postValidation() + { + global $idcat, $idart, $client; + + if ($this->_bError || $this->_bRoutingFound || !$this->_hasPartArrayItems()) { + return; + } + + if (parent::getConfig('startfromroot') == 1 && parent::getConfig('prevent_duplicated_content') == 1) { + + // prevention of duplicated content if '/firstcat/' is directly requested! + + $idcat = (isset($idcat) && (int) $idcat > 0) ? $idcat : null; + $idart = (isset($idart) && (int) $idart > 0) ? $idart : null; + + // compose new parameter + $param = ''; + if ($idcat) { + $param .= 'idcat=' . (int) $idcat; + } + if ($idart) { + $param .= ($param !== '') ? '&idart=' . (int) $idart : 'idart=' . (int) $idart; + } + + if ($param == '') { + return; + } + + // set client language, if not set before + mr_setClientLanguageId($client); + + //rebuild url + $url = mr_buildNewUrl('front_content.php?' . $param); + + $aUrlComponents = @parse_url($this->_sIncommingUrl); + $incommingUrl = (isset($aUrlComponents['path'])) ? $aUrlComponents['path'] : ''; + + ModRewriteDebugger::add($url, 'ModRewriteController->_postValidation validate url'); + ModRewriteDebugger::add($incommingUrl, 'ModRewriteController->_postValidation incommingUrl'); + + // now the new generated uri should be identical with the request uri + if ($incommingUrl !== $url) { + $this->_bError = true; + $idcat = null; + } + } + } + + + /** + * Parses the url using defined separators + * + * @param string $url Incoming url + * @return string Parsed url + */ + private function _parseUrl($url) + { + $this->_sResolvedUrl = $url; + + $oMrUrlUtil = ModRewriteUrlUtil::getInstance(); + $url = $oMrUrlUtil->toContenidoUrl($url); + + return @parse_url($url); + } + + + /** + * Returns state of parts property. + * + * @return bool True if $this->_aParts propery is an array and contains items + * @access private + */ + function _hasPartArrayItems() + { + if (is_array($this->_aParts) && count($this->_aParts) > 0) { + return true; + } else { + return false; + } + } + +} \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewritedebugger.php b/conlite/plugins/mod_rewrite/classes/class.modrewritedebugger.php new file mode 100644 index 0000000..e14228e --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewritedebugger.php @@ -0,0 +1,74 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: class.modrewritedebugger.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +class ModRewriteDebugger +{ + protected static $_bEnabled = false; + + + public static function setEnabled($bEnabled) + { + self::$_bEnabled = (bool) $bEnabled; + } + + public static function add($mVar, $sLabel = '') + { + if (!self::$_bEnabled) { + return; + } + $oDebugger = DebuggerFactory::getDebugger('visible_adv'); + $oDebugger->add($mVar, $sLabel); + } + + public static function getAll() + { + if (!self::$_bEnabled) { + return ''; + } + $oDebugger = DebuggerFactory::getDebugger('visible_adv'); + ob_start(); + $oDebugger->showAll(); + $sOutput = ob_get_contents(); + ob_end_clean(); + return $sOutput; + } + + public static function log($mVar, $sLabel = '') + { + if (!self::$_bEnabled) { + return; + } + $oDebugger = DebuggerFactory::getDebugger('file'); + $oDebugger->show($mVar, $sLabel); + } +} diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewritetest.php b/conlite/plugins/mod_rewrite/classes/class.modrewritetest.php new file mode 100644 index 0000000..a612309 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewritetest.php @@ -0,0 +1,325 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-05-xx + * + * $Id: class.modrewritetest.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +class ModRewriteTest +{ + + /** + * @var array Global $cfg array + */ + protected $_aCfg; + + /** + * @var array Global $cfg['tab'] array + */ + protected $_aCfgTab; + + + /** + * @var int Max items to process + */ + protected $_iMaxItems; + + /** + * @var string Actual resolved url + */ + protected $_sResolvedUrl; + + + /** + * @var bool Routing found flag + */ + protected $_bRoutingFound = false; + + + /** + * Constuctor + */ + public function __construct($maxItems) + { + global $cfg; + $this->_aCfg = & $cfg; + $this->_aCfgTab = & $cfg['tab']; + $this->_iMaxItems = $maxItems; + } + + + /** + * Returns resolved URL + * + * @return bool Resolved URL + */ + public function getResolvedUrl() + { + return $this->_sResolvedUrl; + } + + + /** + * Returns flagz about found routing + * + * @return bool + */ + public function getRoutingFoundState() + { + return $this->_bRoutingFound; + } + + + /** + * Fetchs full structure of the installation (categories and articles) and returns it back. + * + * @param int $idclient Client id + * @param int $idlang Language id + * @return array Full structure as follows + * + * $arr[idcat] = Category dataset + * $arr[idcat]['articles'][idart] = Article dataset + * + */ + public function fetchFullStructure($idclient = null, $idlang = null) + { + global $client, $lang; + + $db = new DB_ConLite(); + $db2 = new DB_ConLite(); + + if (!$idclient || (int) $idclient == 0) { + $idclient = $client; + } + if (!$idlang || (int) $idlang == 0) { + $idlang = $lang; + } + + $aTab = $this->_aCfgTab; + + $aStruct = array(); + + $sql = "SELECT + * + FROM + " . $aTab['cat_tree'] . " AS a, + " . $aTab['cat_lang'] . " AS b, + " . $aTab['cat'] . " AS c + WHERE + a.idcat = b.idcat AND + c.idcat = a.idcat AND + c.idclient = '".$idclient."' AND + b.idlang = '".$idlang."' + ORDER BY + a.idtree"; + + $db->query($sql); + + $loop = false; + $counter = 0; + + while ($db->next_record()) { + + if (++$counter == $this->_iMaxItems) { + break; // break this loop + } + + $idcat = $db->f('idcat'); + $aStruct[$idcat] = $db->Record; + $aStruct[$idcat]['articles'] = array(); + + if ($this->_aCfg['is_start_compatible'] == true) { + $compStatement = ' a.is_start DESC, '; + } else { + $compStatement = ''; + } + + $sql2 = "SELECT + * + FROM + ".$aTab['cat_art']." AS a, + ".$aTab['art']." AS b, + ".$aTab['art_lang']." AS c + WHERE + a.idcat = '".$idcat."' AND + b.idart = a.idart AND + c.idart = a.idart AND + c.idlang = '".$idlang."' AND + b.idclient = '".$idclient."' + ORDER BY + " . $compStatement . " + c.title ASC"; + + $db2->query($sql2); + + while ($db2->next_record()) { + $idart = $db2->f('idart'); + $aStruct[$idcat]['articles'][$idart] = $db2->Record; + if (++$counter == $this->_iMaxItems) { + break 2; // break this and also superior loop + } + } + } + + return $aStruct; + } + + + /** + * Creates an URL using passed data. + * + * The result is used to generate seo urls... + * + * @param array $arr Assoziative array with some data as follows: + * + * $arr['idcat'] + * $arr['idart'] + * $arr['idcatart'] + * $arr['idartlang'] + * + * @param string $type Either 'c' or 'a' (category or article). If set to + * 'c' only the parameter idcat will be added to the URL + */ + public function composeURL($arr, $type) + { + $type = ($type == 'a') ? 'a' : 'c'; + + $param = array(); + + if ($type == 'c') { + $param[] = 'idcat=' . $arr['idcat']; + } else { + if (mr_getRequest('idart')) { + $param[] = 'idart=' . $arr['idart']; + } + if (mr_getRequest('idcat')) { + $param[] = 'idcat=' . $arr['idcat']; + } + if (mr_getRequest('idcatart')) { + $param[] = 'idcatart=' . $arr['idcatart']; + } + if (mr_getRequest('idartlang')) { + $param[] = 'idartlang=' . $arr['idartlang']; + } + } + $param[] = 'foo=bar'; + return 'front_content.php?' . implode('&', $param); + } + + + /** + * Resolves variables of an page (idcat, idart, idclient, idlang, etc.) by + * processing passed url using ModRewriteController + * + * @param string $url Url to resolve + * @return array Assoziative array with resolved data + */ + public function resolveUrl($url) + { + // some globals to reset + $aGlobs = array( + 'mr_preprocessedPageError', 'idart', 'idcat' + ); + foreach ($aGlobs as $p => $k) { + if (isset($GLOBALS[$k])) { unset($GLOBALS[$k]); } + } + + $aReturn = array(); + + // create an mod rewrite controller instance and execute processing + $oMRController = new ModRewriteController($url); + $oMRController->execute(); + + if ($oMRController->errorOccured()) { + + // an error occured (idcat and or idart couldn't catched by controller) + $aReturn['mr_preprocessedPageError'] = 1; + + $this->_sResolvedUrl = ''; + $this->_bRoutingFound = false; + + } else { + + // set some global variables + + $this->_sResolvedUrl = $oMRController->getResolvedUrl(); + $this->_bRoutingFound = $oMRController->getRoutingFoundState(); + + if ($oMRController->getClient()) { + $aReturn['client'] = $oMRController->getClient(); + } + + if ($oMRController->getChangeClient()) { + $aReturn['changeclient'] = $oMRController->getChangeClient(); + } + + if ($oMRController->getLang()) { + $aReturn['lang'] = $oMRController->getLang(); + } + + if ($oMRController->getChangeLang()) { + $aReturn['changelang'] = $oMRController->getChangeLang(); + } + + if ($oMRController->getIdArt()) { + $aReturn['idart'] = $oMRController->getIdArt(); + } + + if ($oMRController->getIdCat()) { + $aReturn['idcat'] = $oMRController->getIdCat(); + } + + if ($oMRController->getPath()) { + $aReturn['path'] = $oMRController->getPath(); + } + + } + + return $aReturn; + } + + + /** + * Creates a readable string from passed resolved data array. + * + * @param array Assoziative array with resolved data + * @return string Readable resolved data + */ + public function getReadableResolvedData(array $data) + { + // compose resolved string + $ret = ''; + foreach ($data as $k => $v) { + $ret .= $k . '=' . $v . '; '; + } + $ret = substr($ret, 0, strlen($ret)-2); + return $ret; + } + +} diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewriteurlstack.php b/conlite/plugins/mod_rewrite/classes/class.modrewriteurlstack.php new file mode 100644 index 0000000..4b3b16e --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewriteurlstack.php @@ -0,0 +1,343 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-09-10 + * + * $Id: class.modrewriteurlstack.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +/** + * Mod rewrite url stack class. Provides features to collect urls and to get the + * pretty path and names of categories/articles at one go. + * + * Main goal of this class is to collect urls and to get the urlpath and urlname + * of the related categories/articles at one go. This will reduce the queries + * against the database. + * Therefore the full advantage will be taken by rewriting the urls at codeoutput + * in front_content.php, where you will be able to collect all urls at once... + * + * Usage: + * + * // get the instance + * $oMRUrlStack = ModRewriteUrlStack::getInstance(); + * + * // add several urls to fill the stack + * $oMRUrlStack->add('front_content.php?idcat=123'); + * $oMRUrlStack->add('front_content.php?idart=321'); + * $oMRUrlStack->add('front_content.php?idcatart=213'); + * $oMRUrlStack->add('front_content.php?idcatlang=213'); + * $oMRUrlStack->add('front_content.php?idartlang=312'); + * + * // now the first call will get the pretty path and names from database at one go + * $aPrettyParts = $oMRUrlStack->getPrettyUrlParts('front_content.php?idcat=123'); + * echo $aPrettyParts['urlpath']; // something like 'Main-category-name/Category-name/Another-category-name/' + * echo $aPrettyParts['urlname']; // something like 'Name-of-an-article' + * + * + * @author Murat Purc + * @package Contenido Backend plugins + * @subpackage ModRewrite + */ +class ModRewriteUrlStack +{ + + /** + * Self instance + * + * @var ModRewriteUrlStack + */ + private static $_instance; + + /** + * Database object + * + * @var DB_ConLite + */ + private $_oDb; + + /** + * Array for urls + * + * @var array + */ + private $_aUrls = array(); + + /** + * Url stack array + * + * @var array + */ + private $_aStack = array(); + + /** + * Contenido related parameter array + * + * @var array + */ + private $_aConParams = array( + 'idcat' => 1, 'idart' => 1, 'lang' => 1, 'idcatlang' => 1, 'idcatart' => 1, 'idartlang' => 1 + ); + + /** + * Database tables array + * + * @var array + */ + private $_aTab; + + /** + * Language id + * + * @var int + */ + private $_idLang; + + + /** + * Constructor, sets some properties. + */ + private function __construct() + { + global $cfg, $lang; + $this->_oDb = new DB_ConLite(); + $this->_aTab = $cfg['tab']; + $this->_idLang = $lang; + } + + + /** + * Returns a instance of ModRewriteUrlStack (singleton implementation) + * + * @return ModRewriteUrlStack + */ + public static function getInstance() + { + if (self::$_instance == null) { + self::$_instance = new ModRewriteUrlStack(); + } + return self::$_instance; + } + + + /** + * Adds an url to the stack + * + * @param string Url, like front_content.php?idcat=123... + */ + public function add($url) + { + $url = ModRewrite::urlPreClean($url); + if (isset($this->_aUrls[$url])) { + return; + } + + $aUrl = $this->_extractUrl($url); + + // cleanup parameter + foreach ($aUrl['params'] as $p => $v) { + if (!isset($this->_aConParams[$p])) { + unset($aUrl['params'][$p]); + } else { + $aUrl['params'][$p] = (int) $v; + } + } + + // add language id, if not available + if ((int) mr_arrayValue($aUrl['params'], 'lang') == 0) { + $aUrl['params']['lang'] = $this->_idLang; + } + + $sStackId = $this->_makeStackId($aUrl['params']); + $this->_aUrls[$url] = $sStackId; + $this->_aStack[$sStackId] = array('params' => $aUrl['params']); + } + + + /** + * Returns the pretty urlparts (only category path an article name) of the + * desired url. + * + * @param string Url, like front_content.php?idcat=123... + * @return array Assoziative array like + * + * $arr['urlpath'] + * $arr['urlname'] + * + */ + public function getPrettyUrlParts($url) + { + $url = ModRewrite::urlPreClean($url); + if (!isset($this->_aUrls[$url])) { + $this->add($url); + } + + $sStackId = $this->_aUrls[$url]; + if (!isset($this->_aStack[$sStackId]['urlpath'])) { + $this->_chunkSetPrettyUrlParts(); + } + $aPretty = array( + 'urlpath' => $this->_aStack[$sStackId]['urlpath'], + 'urlname' => $this->_aStack[$sStackId]['urlname'] + ); + return $aPretty; + } + + + /** + * Extracts passed url using parse_urla and adds also the 'params' array to it + * + * @param string Url, like front_content.php?idcat=123... + * @return array Components containing result of parse_url with additional + * 'params' array + */ + private function _extractUrl($url) + { + $aUrl = @parse_url($url); + if (isset($aUrl['query'])) { + $aUrl['query'] = str_replace('&', '&', $aUrl['query']); + parse_str($aUrl['query'], $aUrl['params']); + } + if (!isset($aUrl['params']) && !is_array($aUrl['params'])) { + $aUrl['params'] = array(); + } + return $aUrl; + } + + + /** + * Extracts article or category related parameter from passed params array + * and generates an identifier. + * + * @param array $aParams Parameter array + * @return string Composed stack id + */ + private function _makeStackId(array $aParams) + { + # idcatart + if ((int) mr_arrayValue($aParams, 'idart') > 0) { + $sStackId = 'idart_' . $aParams['idart'] . '_lang_' . $aParams['lang']; + } elseif ((int) mr_arrayValue($aParams, 'idartlang') > 0) { + $sStackId = 'idartlang_' . $aParams['idartlang']; + } elseif ((int) mr_arrayValue($aParams, 'idcatart') > 0) { + $sStackId = 'idcatart_' . $aParams['idcatart'] . '_lang_' . $aParams['lang']; + } elseif ((int) mr_arrayValue($aParams, 'idcat') > 0) { + $sStackId = 'idcat_' . $aParams['idcat'] . '_lang_' . $aParams['lang']; + } elseif ((int) mr_arrayValue($aParams, 'idcatlang') > 0) { + $sStackId = 'idcatlang_' . $aParams['idcatlang']; + } else { + $sStackId = 'lang_' . $aParams['lang']; + } + return $sStackId; + } + + + /** + * Main function to get the urlparts of urls. + * + * Composes the query by looping thru stored but non processed urls, executes + * the query and adds the (urlpath and urlname) result to the stack. + */ + private function _chunkSetPrettyUrlParts() + { + // collect stack parameter to get urlpath and urlname + $aStack = array(); + foreach ($this->_aStack as $stackId => $item) { + if (!isset($item['urlpath'])) { + // pretty url is to create + $aStack[$stackId] = $item; + } + } + + // now, it's time to compose the where clause of the query + $sWhere = ''; + foreach ($aStack as $stackId => $item) { + $aP = $item['params']; + if ((int) mr_arrayValue($aP, 'idart') > 0) { + $sWhere .= '(al.idart = ' . $aP['idart'] . ' AND al.idlang = ' . $aP['lang'] . ') OR '; + } elseif ((int) mr_arrayValue($aP, 'idartlang') > 0) { + $sWhere .= '(al.idartlang = ' . $aP['idartlang'] . ') OR '; + } elseif ((int) mr_arrayValue($aP, 'idcat') > 0) { + $sWhere .= '(cl.idcat = ' . $aP['idcat'] . ' AND cl.idlang = ' . $aP['lang'] . ' AND cl.startidartlang = al.idartlang) OR '; + } elseif ((int) mr_arrayValue($aP, 'idcatart') > 0) { + $sWhere .= '(ca.idcatart = ' . $aP['idcatart'] . ' AND ca.idart = al.idart AND al.idlang = ' . $aP['lang'] . ') OR '; + } elseif ((int) mr_arrayValue($aP, 'idcatlang') > 0) { + $sWhere .= '(cl.idcatlang = ' . $aP['idcatlang'] . ' AND cl.startidartlang = al.idartlang) OR '; + } + } + if ($sWhere == '') { + return; + } + $sWhere = substr($sWhere, 0, -4); + $sWhere = str_replace(' OR ', " OR \n", $sWhere); + + // compose query and execute it + $sql = <<_aTab['art_lang']} AS al, {$this->_aTab['cat_lang']} AS cl, {$this->_aTab['cat_art']} AS ca +WHERE + al.idart = ca.idart AND + ca.idcat = cl.idcat AND + al.idlang = cl.idlang AND + ( $sWhere ) +SQL; + ModRewriteDebugger::add($sql, 'ModRewriteUrlStack->_chunkSetPrettyUrlParts() $sql'); + + $aNewStack = array(); + + // create array of fields, which are to reduce step by step from record set below + $aFields = array('', 'idart', 'idartlang', 'idcatart', 'idcat'); + + $this->_oDb->query($sql); + while ($this->_oDb->next_record()) { + $aRS = $this->_oDb->Record; + + // loop thru fields array + foreach ($aFields as $field) { + if (isset($aRS[$field])) { + // reduce existing field + unset($aRS[$field]); + } + $rsStackID = $this->_makeStackId($aRS); + if (isset($aStack[$rsStackID])) { + // matching stack entry found, add urlpath and urlname to the new stack + $aNewStack[$rsStackID]['urlpath'] = $aRS['urlpath']; + $aNewStack[$rsStackID]['urlname'] = $aRS['urlname']; + break; + } + } + } + ModRewriteDebugger::add($aNewStack, 'ModRewriteUrlStack->_chunkSetPrettyUrlParts() $aNewStack'); + + // merge stack data + $this->_aStack = array_merge($this->_aStack, $aNewStack); + } + +} diff --git a/conlite/plugins/mod_rewrite/classes/class.modrewriteurlutil.php b/conlite/plugins/mod_rewrite/classes/class.modrewriteurlutil.php new file mode 100644 index 0000000..a1bcc13 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/class.modrewriteurlutil.php @@ -0,0 +1,342 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-05-xx + * + * $Id: class.modrewriteurlutil.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +/** + * Mod Rewrite url utility class. Handles convertion of Urls from contenido core + * based url composition pattern to AMR (Advanced Mod Rewrite) url composition + * pattern and vice versa. + * + * @author Murat Purc + * @package Contenido Backend plugins + * @subpackage ModRewrite + */ +class ModRewriteUrlUtil extends ModRewriteBase +{ + + /** + * Self instance (singleton implementation) + * @var ModRewriteUrlUtil + */ + private static $_instance; + + /** + * Contenido category word separator + * @var string + */ + private $_catWordSep = '-'; + + /** + * AMR category word separator + * @var string + */ + private $_mrCatWordSep; + + /** + * Contenido category separator + * @var string + */ + private $_catSep = '/'; + + /** + * AMR category separator + * @var string + */ + private $_mrCatSep; + + /** + * Contenido article separator + * @var string + */ + private $_artSep = '/'; + + /** + * AMR article separator + * @var string + */ + private $_mrArtSep; + + /** + * Contenido article word separator + * @var string + */ + private $_artWordSep = '-'; + + /** + * AMR article word separator + * @var string + */ + private $_mrArtWordSep; + + /** + * AMR extension used for articlenames (e. g. .html) + * @var string + */ + private $_mrExt; + + + /** + * Constructor, sets some AMR configuration related properties + */ + private function __construct() + { + $aCfg = parent::getConfig(); + $this->_mrCatWordSep = $aCfg['category_word_seperator']; + $this->_mrCatSep = $aCfg['category_seperator']; + $this->_mrArtSep = $aCfg['article_seperator']; + $this->_mrArtWordSep = $aCfg['article_word_seperator']; + $this->_mrExt = $aCfg['file_extension']; + } + + private function __clone() + { + } + + /** + * Returns self instance (singleton pattern) + * @return ModRewriteUrlUtil + */ + public static function getInstance() + { + if (self::$_instance == null) { + self::$_instance = new ModRewriteUrlUtil(); + } + return self::$_instance; + } + + + /** + * Converts passed AMR url path to Contenido url path. + * + * @param string $urlPath AMR url path + * @return string Contenido url path + */ + public function toContenidoUrlPath($urlPath) + { + $newUrlPath = $this->_toUrlPath( + $urlPath, $this->_mrCatSep, $this->_catSep, $this->_mrCatWordSep, $this->_catWordSep, + $this->_mrArtSep, $this->_artSep + ); + return $newUrlPath; + } + + /** + * Converts passed Contenido url path to AMR url path. + * + * @param string $urlPath Contenido url path + * @return string AMR url path + */ + public function toModRewriteUrlPath($urlPath) + { + $newUrlPath = $this->_toUrlPath( + $urlPath, $this->_catSep, $this->_mrCatSep, $this->_catWordSep, $this->_mrCatWordSep, + $this->_artSep, $this->_mrArtSep + ); + return $newUrlPath; + } + + + /** + * Converts passed url path to a another url path (Contenido to AMR and vice versa). + * + * @param string $urlPath Source url path + * @param string $fromCatSep Source category seperator + * @param string $toCatSep Destination category seperator + * @param string $fromCatWordSep Source category word seperator + * @param string $toCatWordSep Destination category word seperator + * @param string $fromArtSep Source article seperator + * @param string $toArtSep Destination article seperator + * @return string Destination url path + */ + private function _toUrlPath($urlPath, $fromCatSep, $toCatSep, $fromCatWordSep, $toCatWordSep, + $fromArtSep, $toArtSep) + { + if ((string) $urlPath == '') { + return $urlPath; + } + + if (substr($urlPath, -1) == $fromArtSep) { + $urlPath = substr($urlPath, 0, -1) . '{TAS}'; + } + + // pre replace category word seperator and category seperator + $urlPath = str_replace($fromCatWordSep, '{CWS}', $urlPath); + $urlPath = str_replace($fromCatSep, '{CS}', $urlPath); + + // replace category word seperator + $urlPath = str_replace('{CWS}', $toCatWordSep, $urlPath); + $urlPath = str_replace('{CS}', $toCatSep, $urlPath); + + $urlPath = str_replace('{TAS}', $toArtSep, $urlPath); + + return $urlPath; + } + + + /** + * Converts passed AMR url name to Contenido url name. + * + * @param string $urlName AMR url name + * @return string Contenido url name + */ + public function toContenidoUrlName($urlName) + { + $newUrlName = $this->_toUrlName($urlName, $this->_mrArtWordSep, $this->_artWordSep); + return $newUrlName; + } + + + /** + * Converts passed Contenido url name to AMR url name. + * + * @param string $urlName Contenido url name + * @return string AMR url name + */ + public function toModRewriteUrlName($urlName) + { + $newUrlName = $this->_toUrlName($urlName, $this->_artWordSep, $this->_mrArtWordSep); + return $newUrlName; + } + + + /** + * Converts passed url name to a another url name (Contenido to AMR and vice versa). + * + * @param string $urlName Source url name + * @param string $fromArtWordSep Source article word seperator + * @param string $toArtWordSep Destination article word seperator + * @return string Destination url name + */ + private function _toUrlName($urlName, $fromArtWordSep, $toArtWordSep) + { + if ((string) $urlName == '') { + return $urlName; + } + + $urlName = str_replace($this->_mrExt, '{EXT}', $urlName); + + // replace article word seperator + $urlName = str_replace($fromArtWordSep, $toArtWordSep, $urlName); + + $urlName = str_replace('{EXT}', $this->_mrExt, $urlName); + + return $urlName; + } + + + /** + * Converts passed AMR url to Contenido url. + * + * @param string $url AMR url + * @return string Contenido url + */ + public function toContenidoUrl($url) + { + if (strpos($url, $this->_mrExt) === false) { + $newUrl = $this->toContenidoUrlPath($url); + } else { + // replace category word and article word seperator + $path = substr($url, 0, strrpos($url, $this->_mrArtSep) + 1); + $name = substr($url, strrpos($url, $this->_mrArtSep) + 1); + $newUrl = $this->toContenidoUrlPath($path) . $this->toContenidoUrlName($name); + } + return $newUrl; + } + + + /** + * Converts passed AMR url to Contenido url. + * + * @param string $url AMR url + * @return string Contenido url + */ + public function toModRewriteUrl($url) + { + if (strpos($url, $this->_mrExt) === false) { + $newUrl = $this->toModRewriteUrlPath($url); + } else { + // replace category word and article word seperator + $path = substr($url, 0, strrpos($url, $this->_artSep) + 1); + $name = substr($url, strrpos($url, $this->_artSep) + 1); + $newUrl = $this->toModRewriteUrlPath($path) . $this->toModRewriteUrlName($name); + } + return $newUrl; + } + + + /** + * Converts passed url to a another url (Contenido to AMR and vice versa). + * + * @param string $urlPath Source url path + * @param string $fromCatSep Source category seperator + * @param string $toCatSep Destination category seperator + * @param string $fromCatWordSep Source category word seperator + * @param string $toCatWordSep Destination category word seperator + * @param string $fromArtSep Source article seperator + * @param string $toArtSep Destination article seperator + * @param string $fromArtWordSep Source article word seperator + * @param string $toArtWordSep Destination article word seperator + * @return string Destination url + * + * @deprecated No more used, is to delete + */ + private function _toUrl($url, $fromCatSep, $toCatSep, $fromCatWordSep, $toCatWordSep, + $fromArtSep, $toArtSep, $fromArtWordSep, $toArtWordSep) + { + if ((string) $url == '') { + return $url; + } + + $url = str_replace($this->_mrExt, '{EXT}', $url); + + // replace category seperator + $url = str_replace($fromCatSep, $toCatSep, $url); + + // replace article seperator + $url = str_replace($fromArtSep, $toArtSep, $url); + + $url = str_replace('{EXT}', $this->_mrExt, $url); + + if (strpos($url, $this->_mrExt) === false) { + // no articlename, replace category word seperator + $url = str_replace($fromCatWordSep, $toCatWordSep, $url); + } else { + // replace category word and article word seperator + $path = str_replace($fromCatWordSep, $toCatWordSep, substr($url, 0, strrpos($url, $toArtSep) + 1)); + $file = str_replace($fromArtWordSep, $toArtWordSep, substr($url, strrpos($url, $toArtSep) + 1)); + $url = $path . $file; + } + + return $url; + } + +} \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_content_controller.php b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_content_controller.php new file mode 100644 index 0000000..871b1e0 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_content_controller.php @@ -0,0 +1,407 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: class.modrewrite_content_controller.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +plugin_include( + 'mod_rewrite', 'classes/controller/class.modrewrite_controller_abstract.php' +); + + +class ModRewrite_ContentController extends ModRewrite_ControllerAbstract +{ + + public function indexAction() + { + // donut + } + + public function saveAction() + { + $bDebug = $this->getProperty('bDebug'); + $aSeparator = $this->getProperty('aSeparator'); + $aWordSeparator = $this->getProperty('aWordSeparator'); + $routingSeparator = $this->getProperty('routingSeparator'); + + $bError = false; + $aMR = array(); + + $request = (count($_POST) > 0) ? $_POST : $_GET; + mr_requestCleanup($request); + + // use mod_rewrite + if (mr_arrayValue($request, 'use') == 1) { + $this->_oView->use_chk = ' checked="checked"'; + $aMR['mod_rewrite']['use'] = 1; + } else { + $this->_oView->use_chk = ''; + $aMR['mod_rewrite']['use'] = 0; + } + + // root dir + if (mr_arrayValue($request, 'rootdir', '') !== '') { + if (!preg_match('/^[a-zA-Z0-9\-_\/\.]*$/', $request['rootdir'])) { + $sMsg = i18n('The root directory has a invalid format, alowed are the chars [a-zA-Z0-9\-_\/\.]', 'mod_rewrite'); + $this->_oView->rootdir_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } elseif (!is_dir($_SERVER['DOCUMENT_ROOT'] . $request['rootdir'])) { + + if (mr_arrayValue($request, 'checkrootdir') == 1) { + // root dir check is enabled, this results in error + $sMsg = i18n('The specified directory "%s" does not exists', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $_SERVER['DOCUMENT_ROOT'] . $request['rootdir']); + $this->_oView->rootdir_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } else { + // root dir check ist disabled, take over the setting and + // output a warning. + $sMsg = i18n('The specified directory "%s" does not exists in DOCUMENT_ROOT "%s". this could happen, if clients DOCUMENT_ROOT differs from Contenido backends DOCUMENT_ROOT. However, the setting will be taken over because of disabled check.', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $request['rootdir'], $_SERVER['DOCUMENT_ROOT']); + $this->_oView->rootdir_error = $this->_notifyBox('warning', $sMsg); + } + } + $this->_oView->rootdir = clHtmlEntities($request['rootdir']); + $aMR['mod_rewrite']['rootdir'] = $request['rootdir']; + } + + // root dir check + if (mr_arrayValue($request, 'checkrootdir') == 1) { + $this->_oView->checkrootdir_chk = ' checked="checked"'; + $aMR['mod_rewrite']['checkrootdir'] = 1; + } else { + $this->_oView->checkrootdir_chk = ''; + $aMR['mod_rewrite']['checkrootdir'] = 0; + } + + // start from root + if (mr_arrayValue($request, 'startfromroot') == 1) { + $this->_oView->startfromroot_chk = ' checked="checked"'; + $aMR['mod_rewrite']['startfromroot'] = 1; + } else { + $this->_oView->startfromroot_chk = ''; + $aMR['mod_rewrite']['startfromroot'] = 0; + } + + // prevent duplicated content + if (mr_arrayValue($request, 'prevent_duplicated_content') == 1) { + $this->_oView->prevent_duplicated_content_chk = ' checked="checked"'; + $aMR['mod_rewrite']['prevent_duplicated_content'] = 1; + } else { + $this->_oView->prevent_duplicated_content_chk = ''; + $aMR['mod_rewrite']['prevent_duplicated_content'] = 0; + } + + // language settings + if (mr_arrayValue($request, 'use_language') == 1) { + $this->_oView->use_language_chk = ' checked="checked"'; + $this->_oView->use_language_name_disabled = ''; + $aMR['mod_rewrite']['use_language'] = 1; + if (mr_arrayValue($request, 'use_language_name') == 1) { + $this->_oView->use_language_name_chk = ' checked="checked"'; + $aMR['mod_rewrite']['use_language_name'] = 1; + } else { + $this->_oView->use_language_name_chk = ''; + $aMR['mod_rewrite']['use_language_name'] = 0; + } + } else { + $this->_oView->use_language_chk = ''; + $this->_oView->use_language_name_chk = ''; + $this->_oView->use_language_name_disabled = ' disabled="disabled"'; + $aMR['mod_rewrite']['use_language'] = 0; + $aMR['mod_rewrite']['use_language_name'] = 0; + } + + // client settings + if (mr_arrayValue($request, 'use_client') == 1) { + $this->_oView->use_client_chk = ' checked="checked"'; + $this->_oView->use_client_name_disabled = ''; + $aMR['mod_rewrite']['use_client'] = 1; + if (mr_arrayValue($request, 'use_client_name') == 1) { + $this->_oView->use_client_name_chk = ' checked="checked"'; + $aMR['mod_rewrite']['use_client_name'] = 1; + } else { + $this->_oView->use_client_name_chk = ''; + $aMR['mod_rewrite']['use_client_name'] = 0; + } + } else { + $this->_oView->use_client_chk = ''; + $this->_oView->use_client_name_chk = ''; + $this->_oView->use_client_name_disabled = ' disabled="disabled"'; + $aMR['mod_rewrite']['use_client'] = 0; + $aMR['mod_rewrite']['use_client_name'] = 0; + } + + // use lowercase uri + if (mr_arrayValue($request, 'use_lowercase_uri') == 1) { + $this->_oView->use_lowercase_uri_chk = ' checked="checked"'; + $aMR['mod_rewrite']['use_lowercase_uri'] = 1; + } else { + $this->_oView->use_lowercase_uri_chk = ''; + $aMR['mod_rewrite']['use_lowercase_uri'] = 0; + } + + $this->_oView->category_separator_attrib = ''; + $this->_oView->category_word_separator_attrib = ''; + $this->_oView->article_separator_attrib = ''; + $this->_oView->article_word_separator_attrib = ''; + + $separatorPattern = $aSeparator['pattern']; + $separatorInfo = $aSeparator['info']; + + $wordSeparatorPattern = $aSeparator['pattern']; + $wordSeparatorInfo = $aSeparator['info']; + + $categorySeperator = mr_arrayValue($request, 'category_seperator', ''); + $categoryWordSeperator = mr_arrayValue($request, 'category_word_seperator', ''); + $articleSeperator = mr_arrayValue($request, 'article_seperator', ''); + $articleWordSeperator = mr_arrayValue($request, 'article_word_seperator', ''); + + // category seperator + if ($categorySeperator == '') { + $sMsg = i18n('Please specify separator (%s) for category', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $separatorInfo); + $this->_oView->category_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } elseif (!preg_match($separatorPattern, $categorySeperator)) { + $sMsg = i18n('Invalid separator for category, allowed one of following characters: %s', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $separatorInfo); + $this->_oView->category_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + + // category word seperator + } elseif ($categoryWordSeperator == '') { + $sMsg = i18n('Please specify separator (%s) for category words', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $wordSeparatorInfo); + $this->_oView->category_word_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } elseif (!preg_match($wordSeparatorPattern, $categoryWordSeperator)) { + $sMsg = i18n('Invalid separator for category words, allowed one of following characters: %s', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $wordSeparatorInfo); + $this->_oView->category_word_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + + // article seperator + } elseif ($articleSeperator == '') { + $sMsg = i18n('Please specify separator (%s) for article', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $separatorInfo); + $this->_oView->article_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } elseif (!preg_match($separatorPattern, $articleSeperator)) { + $sMsg = i18n('Invalid separator for article, allowed is one of following characters: %s', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $separatorInfo); + $this->_oView->article_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + + // article word seperator + } elseif ($articleWordSeperator == '') { + $sMsg = i18n('Please specify separator (%s) for article words', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $wordSeparatorInfo); + $this->_oView->article_word_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } elseif (!preg_match($wordSeparatorPattern, $articleWordSeperator)) { + $sMsg = i18n('Invalid separator for article words, allowed is one of following characters: %s', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $wordSeparatorInfo); + $this->_oView->article_word_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + + // category_seperator - category_word_seperator + } elseif ($categorySeperator == $categoryWordSeperator) { + $sMsg = i18n('Separator for category and category words must not be identical', 'mod_rewrite'); + $this->_oView->category_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + // category_seperator - article_word_seperator + } elseif ($categorySeperator == $articleWordSeperator) { + $sMsg = i18n('Separator for category and article words must not be identical', 'mod_rewrite'); + $this->_oView->category_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + // article_seperator - article_word_seperator + } elseif ($articleSeperator == $articleWordSeperator) { + $sMsg = i18n('Separator for category-article and article words must not be identical', 'mod_rewrite'); + $this->_oView->article_separator_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } + + $this->_oView->category_separator = clHtmlEntities($categorySeperator); + $aMR['mod_rewrite']['category_seperator'] = $categorySeperator; + $this->_oView->category_word_separator = clHtmlEntities($categoryWordSeperator); + $aMR['mod_rewrite']['category_word_seperator'] = $categoryWordSeperator; + $this->_oView->article_separator = clHtmlEntities($articleSeperator); + $aMR['mod_rewrite']['article_seperator'] = $articleSeperator; + $this->_oView->article_word_separator = clHtmlEntities($articleWordSeperator); + $aMR['mod_rewrite']['article_word_seperator'] = $articleWordSeperator; + + // file extension + if (mr_arrayValue($request, 'file_extension', '') !== '') { + if (!preg_match('/^\.([a-zA-Z0-9\-_\/])*$/', $request['file_extension'])) { + $sMsg = i18n('The file extension has a invalid format, allowed are the chars \.([a-zA-Z0-9\-_\/])', 'mod_rewrite'); + $this->_oView->file_extension_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } + $this->_oView->file_extension = clHtmlEntities($request['file_extension']); + $aMR['mod_rewrite']['file_extension'] = $request['file_extension']; + } else { + $this->_oView->file_extension = '.html'; + $aMR['mod_rewrite']['file_extension'] = '.html'; + } + + // category resolve min percentage + if (isset($request['category_resolve_min_percentage'])) { + if (!is_numeric($request['category_resolve_min_percentage'])) { + $sMsg = i18n('Value has to be numeric.', 'mod_rewrite'); + $this->_oView->category_resolve_min_percentage_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } elseif ($request['category_resolve_min_percentage'] < 0 || $request['category_resolve_min_percentage'] > 100) { + $sMsg = i18n('Value has to be between 0 an 100.', 'mod_rewrite'); + $this->_oView->category_resolve_min_percentage_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } + $this->_oView->category_resolve_min_percentage = $request['category_resolve_min_percentage']; + $aMR['mod_rewrite']['category_resolve_min_percentage'] = $request['category_resolve_min_percentage']; + } else { + $this->_oView->category_resolve_min_percentage = '75'; + $aMR['mod_rewrite']['category_resolve_min_percentage'] = '75'; + } + + // add start article name to url + if (mr_arrayValue($request, 'add_startart_name_to_url') == 1) { + $this->_oView->add_startart_name_to_url_chk = ' checked="checked"'; + $aMR['mod_rewrite']['add_startart_name_to_url'] = 1; + if (mr_arrayValue($request, 'add_startart_name_to_url', '') !== '') { + if (!preg_match('/^[a-zA-Z0-9\-_\/\.]*$/', $request['default_startart_name'])) { + $sMsg = i18n('The article name has a invalid format, allowed are the chars /^[a-zA-Z0-9\-_\/\.]*$/', 'mod_rewrite'); + $this->_oView->add_startart_name_to_url_error = $this->_notifyBox('error', $sMsg); + $bError = true; + } + $this->_oView->default_startart_name = clHtmlEntities($request['default_startart_name']); + $aMR['mod_rewrite']['default_startart_name'] = $request['default_startart_name']; + } else { + $this->_oView->default_startart_name = ''; + $aMR['mod_rewrite']['default_startart_name'] = ''; + } + } else { + $this->_oView->add_startart_name_to_url_chk = ''; + $aMR['mod_rewrite']['add_startart_name_to_url'] = 0; + $this->_oView->default_startart_name = ''; + $aMR['mod_rewrite']['default_startart_name'] = ''; + } + + // rewrite urls at + if (mr_arrayValue($request, 'rewrite_urls_at') == 'congeneratecode') { + $this->_oView->rewrite_urls_at_congeneratecode_chk = ' checked="checked"'; + $this->_oView->rewrite_urls_at_front_content_output_chk = ''; + $aMR['mod_rewrite']['rewrite_urls_at_congeneratecode'] = 1; + $aMR['mod_rewrite']['rewrite_urls_at_front_content_output'] = 0; + } else { + $this->_oView->rewrite_urls_at_congeneratecode_chk = ''; + $this->_oView->rewrite_urls_at_front_content_output_chk = ' checked="checked"'; + $aMR['mod_rewrite']['rewrite_urls_at_congeneratecode'] = 0; + $aMR['mod_rewrite']['rewrite_urls_at_front_content_output'] = 1; + } + + // routing + if (isset($request['rewrite_routing'])) { + $aRouting = array(); + $items = explode("\n", $request['rewrite_routing']); + foreach ($items as $p => $v) { + $routingDef = explode($routingSeparator, $v); + if (count($routingDef) !== 2) { + continue; + } + $routingDef[0] = trim($routingDef[0]); + $routingDef[1] = trim($routingDef[1]); + if ($routingDef[0] == '') { + continue; + } + $aRouting[$routingDef[0]] = $routingDef[1]; + } + $this->_oView->rewrite_routing = clHtmlEntities($request['rewrite_routing']); + $aMR['mod_rewrite']['routing'] = $aRouting; + } else { + $this->_oView->rewrite_routing = ''; + $aMR['mod_rewrite']['routing'] = array(); + } + + // redirect invalid article to errorsite + if (isset($request['redirect_invalid_article_to_errorsite'])) { + $this->_oView->redirect_invalid_article_to_errorsite_chk = ' checked="checked"'; + $aMR['mod_rewrite']['redirect_invalid_article_to_errorsite'] = 1; + } else { + $this->_oView->redirect_invalid_article_to_errorsite_chk = ''; + $aMR['mod_rewrite']['redirect_invalid_article_to_errorsite'] = 0; + } + + if ($bError) { + $sMsg = i18n('Please check your input', 'mod_rewrite'); + $this->_oView->content_before = $this->_notifyBox('error', $sMsg); + return; + } + + if ($bDebug == true) { + echo $this->_notifyBox('info', 'Debug'); + echo '
    ';print_r($aMR['mod_rewrite']);echo '
    '; + $sMsg = i18n('Configuration has not been saved, because of enabled debugging', 'mod_rewrite'); + echo $this->_notifyBox('info', $sMsg); + return; + } + + $bSeparatorModified = $this->_separatorModified($aMR['mod_rewrite']); + + if (mr_setConfiguration($this->_client, $aMR)) { + $sMsg = 'Configuration has been saved'; + if ($bSeparatorModified) { + mr_loadConfiguration($this->_client, true); + } + $this->_oView->content_before = $this->_notifyBox('info', $sMsg); + } else { + $sMsg = i18n('Configuration could not saved. Please check write permissions for %s ', 'mod_rewrite'); + $sMsg = sprintf($sMsg, $options['key']); + $this->_oView->content_before = $this->_notifyBox('error', $sMsg); + } + } + + + protected function _separatorModified($aNewCfg) + { + $aCfg = ModRewrite::getConfig(); + + if ($aCfg['category_seperator'] != $aNewCfg['category_seperator']) { + return true; + } elseif ($aCfg['category_word_seperator'] != $aNewCfg['category_word_seperator']) { + return true; + } elseif ($aCfg['article_seperator'] != $aNewCfg['article_seperator']) { + return true; + } elseif ($aCfg['article_word_seperator'] != $aNewCfg['article_word_seperator']) { + return true; + } + return false; + } + +} diff --git a/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contentexpert_controller.php b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contentexpert_controller.php new file mode 100644 index 0000000..1acece9 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contentexpert_controller.php @@ -0,0 +1,137 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: class.modrewrite_contentexpert_controller.php 209 2013-01-24 12:31:00Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +plugin_include('mod_rewrite', 'classes/controller/class.modrewrite_controller_abstract.php'); + + +class ModRewrite_ContentExpertController extends ModRewrite_ControllerAbstract +{ + protected $_htaccessRestrictive = ''; + protected $_htaccessSimple = ''; + + public function init() + { + $this->_oView->content_before = ''; + + $pluginPath = $this->_cfg['path']['contenido'] . $this->_cfg['path']['plugins'] . 'mod_rewrite/'; + $this->_htaccessRestrictive = $pluginPath . 'files/htaccess_restrictive.txt'; + $this->_htaccessSimple = $pluginPath . 'files/htaccess_simple.txt'; + } + + /** + * Execute index action + */ + public function indexAction() + { + } + + + public function copyHtaccessAction() + { + $type = $this->_getParam('htaccesstype'); + $copy = $this->_getParam('copy'); + + if ($type != 'restrictive' && $type != 'simple') { + return; + } elseif ($copy != 'contenido' && $copy != 'cms') { + return; + } + + $aInfo = $this->getProperty('htaccessInfo'); + + if ($aInfo['has_htaccess']) { + $this->_oView->content_before = $this->_notifyBox(Contenido_Notification::LEVEL_WARNING, 'Die .htaccess existiert bereits im Contenido-/ oder Mandantenverzeichnis, daher wird es nicht kopiert'); + return; + } + + if ($type == 'restrictive') { + $source = $this->_htaccessRestrictive; + } else { + $source = $this->_htaccessSimple; + } + + if ($copy == 'contenido') { + $dest = $aInfo['contenido_full_path'] . '.htaccess'; + } else { + $dest = $aInfo['client_full_path'] . '.htaccess'; + } + + if (!$result = @copy($source, $dest)) { + $this->_oView->content_before = $this->_notifyBox(Contenido_Notification::LEVEL_WARNING, 'Die .htaccess konnte nicht von ' . $source . ' nach ' . $dest . ' kopiert werden!'); + return; + } + + $msg = 'Die .htaccess wurde erfolgreich nach ' . str_replace('.htaccess', '', $dest) . ' kopiert'; + $this->_oView->content_before = $this->_notifyBox(Contenido_Notification::LEVEL_INFO, $msg); + } + + + public function downloadHtaccessAction() + { + $type = $this->_getParam('htaccesstype'); + + if ($type != 'restrictive' && $type != 'simple') { + return; + } + + if ($type == 'restrictive') { + $source = $this->_htaccessRestrictive; + } else { + $source = $this->_htaccessSimple; + } + + $this->_oView->content = file_get_contents($source); + + header('Content-Type: text/plain'); + header('Etag: ' . md5(mt_rand())); + header('Content-Disposition: attachment; filename="' . $type . '.htaccess"'); + $this->render('{CONTENT}'); + } + + + public function resetAction() + { + // recreate all aliases + ModRewrite::recreateAliases(false); + $this->_oView->content_before = $this->_notifyBox('info', 'Alle Aliase wurden zurückgesetzt'); + } + + + public function resetEmptyAction() + { + // recreate only empty aliases + ModRewrite::recreateAliases(true); + $this->_oView->content_before = $this->_notifyBox('info', 'Nur leere Aliase wurden zurückgesetzt'); + } + +} diff --git a/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contenttest_controller.php b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contenttest_controller.php new file mode 100644 index 0000000..90b2da4 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_contenttest_controller.php @@ -0,0 +1,161 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: class.modrewrite_contenttest_controller.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +plugin_include('mod_rewrite', 'classes/class.modrewritetest.php'); +plugin_include('mod_rewrite', 'classes/controller/class.modrewrite_controller_abstract.php'); + + +class ModRewrite_ContentTestController extends ModRewrite_ControllerAbstract +{ + protected $_iMaxItems = 0; + + public function init() + { + $this->_oView->content = ''; + $this->_oView->form_idart_chk = ($this->_getParam('idart')) ? ' checked="checked"' : ''; + $this->_oView->form_idcat_chk = ($this->_getParam('idcat')) ? ' checked="checked"' : ''; + $this->_oView->form_idcatart_chk = ($this->_getParam('idcatart')) ? ' checked="checked"' : ''; + $this->_oView->form_idartlang_chk = ($this->_getParam('idartlang')) ? ' checked="checked"' : ''; + $this->_oView->form_maxitems = (int) $this->_getParam('maxitems', 200); + $this->_iMaxItems = $this->_oView->form_maxitems; + } + + /** + * Execute index action + */ + public function indexAction() + { + $this->_oView->content = ''; + + } + + /** + * Execute test action + */ + public function testAction() + { + $this->_oView->content = ''; + + // Array for testcases + $aTests = array(); + + // Instance of mr test + $oMRTest = new ModRewriteTest($this->_iMaxItems); + + $startTime = getmicrotime(); + + // Fetch complete Contenido page structure + $aStruct = $oMRTest->fetchFullStructure(); + ModRewriteDebugger::add($aStruct, 'mr_test.php $aStruct'); + + // Loop through the structure and compose testcases + foreach ($aStruct as $idcat => $aCat) { + // category + $aTests[] = array( + 'url' => $oMRTest->composeURL($aCat, 'c'), + 'level' => $aCat['level'], + 'name' => $aCat['name'] + ); + + foreach ($aCat['articles'] as $idart => $aArt) { + // articles + $aTests[] = array( + 'url' => $oMRTest->composeURL($aArt, 'a'), + 'level' => $aCat['level'], + 'name' => $aCat['name'] . ' :: ' . $aArt['title'] + ); + } + } + + // compose content + $this->_oView->content = '
    ';
    +
    +        $oMRUrlStack = ModRewriteUrlStack::getInstance();
    +
    +        // first loop to add urls to mr url stack
    +        foreach ($aTests as $p => $v) {
    +            $oMRUrlStack->add($v['url']);
    +        }
    +
    +        $successCounter = 0;
    +        $failCounter    = 0;
    +
    +        // second loop to do the rest
    +        foreach ($aTests as $p => $v) {
    +            $url    = mr_buildNewUrl($v['url']);
    +            $arr    = $oMRTest->resolveUrl($url);
    +            $resUrl = $oMRTest->getResolvedUrl();
    +            $color  = 'green';
    +
    +            if ($url !== $resUrl) {
    +                if ($oMRTest->getRoutingFoundState()) {
    +                    $successCounter++;
    +                    $resUrl = 'route to -> ' . $resUrl;
    +                } else {
    +                    $color = 'red';
    +                    $failCounter++;
    +                }
    +            } else {
    +                $successCounter++;
    +            }
    +
    +            $pref   = str_repeat('    ', $v['level']);
    +
    +            // render resolve information for current item
    +            $itemTpl = $this->_oView->lng_result_item_tpl;
    +            $itemTpl = str_replace('{pref}', $pref, $itemTpl);
    +            $itemTpl = str_replace('{name}', $v['name'], $itemTpl);
    +            $itemTpl = str_replace('{url_in}', $v['url'], $itemTpl);
    +            $itemTpl = str_replace('{url_out}', $url, $itemTpl);
    +            $itemTpl = str_replace('{color}', $color, $itemTpl);
    +            $itemTpl = str_replace('{url_res}', $resUrl, $itemTpl);
    +            $itemTpl = str_replace('{data}', $oMRTest->getReadableResolvedData($arr), $itemTpl);
    +
    +            $this->_oView->content .= "\n" . $itemTpl . "\n";
    +        }
    +        $this->_oView->content .= '
    '; + + $totalTime = sprintf('%.4f', (getmicrotime() - $startTime)); + + // render information about current test + $msg = $this->_oView->lng_result_message_tpl; + $msg = str_replace('{time}', $totalTime, $msg); + $msg = str_replace('{num_urls}', ($successCounter + $failCounter), $msg); + $msg = str_replace('{num_success}', $successCounter, $msg); + $msg = str_replace('{num_fail}', $failCounter, $msg); + + $this->_oView->content = $msg . $this->_oView->content; + + } + +} diff --git a/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_controller_abstract.php b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_controller_abstract.php new file mode 100644 index 0000000..00c31f9 --- /dev/null +++ b/conlite/plugins/mod_rewrite/classes/controller/class.modrewrite_controller_abstract.php @@ -0,0 +1,148 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: class.modrewrite_controller_abstract.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +abstract class ModRewrite_ControllerAbstract +{ + + protected $_oView; + + protected $_cfg; + + protected $_client; + + protected $_area; + + protected $_action; + + protected $_frame; + + protected $_contenido; + + protected $_template = null; + + protected $_properties = array(); + + protected $_debug = false; + + public function __construct() + { + global $cfg, $client, $area, $action, $frame, $contenido, $sess; + + $this->_oView = new stdClass(); + $this->_cfg = $cfg; + $this->_area = $area; + $this->_action = $action; + $this->_frame = $frame; + $this->_client = $client; + $this->_contenido = $contenido; + + $this->_oView->area = $this->_area; + $this->_oView->frame = $this->_frame; + $this->_oView->contenido = $this->_contenido; + $this->_oView->sessid = $sess->id; + $this->_oView->lng_more_informations = i18n('More informations', 'mod_rewrite'); + + $this->init(); + } + + public function init() + { + } + + public function setView($oView) + { + if (is_object($oView)) { + $this->_oView = $oView; + } + } + + public function getView() + { + return $this->_oView; + } + + public function setProperty($key, $value) + { + $this->_properties[$key] = $value; + } + + public function getProperty($key, $default = null) + { + return (isset($this->_properties[$key])) ? $this->_properties[$key] : $default; + } + + public function setTemplate($sTemplate) + { + $this->_template = $sTemplate; + } + + public function getTemplate() + { + return $this->_template; + } + + public function render($template = null) + { + if ($template == null) { + $template = $this->_template; + } + + if ($template == null) { + throw new Exception('Missing template to render.'); + } + + $oTpl = new Template(); + foreach ($this->_oView as $k => $v) { + $oTpl->set('s', strtoupper($k), $v); + } + $oTpl->generate($template, 0, 0); + } + + protected function _getParam($key, $default = null) + { + if (isset($_GET[$key])) { + return $_GET[$key]; + } elseif (isset($_POST[$key])) { + return $_POST[$key]; + } else { + return $default; + } + } + + protected function _notifyBox($type, $msg) + { + global $notification; + return $notification->returnNotification($type, $msg) . '
    '; + } + +} diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/css/atooltip.css b/conlite/plugins/mod_rewrite/external/aToolTip/css/atooltip.css new file mode 100644 index 0000000..e469226 --- /dev/null +++ b/conlite/plugins/mod_rewrite/external/aToolTip/css/atooltip.css @@ -0,0 +1,43 @@ +/* +Node structure +-------------- +.aToolTip + .aToolTipInner + .aToolTipContent + .aToolTipCloseBtn + +*/ + +.aToolTip { margin:2px 0 0 2px; } + +.aToolTipInner { + border-left:1px solid #b3b3b3; + border-top:1px solid #666; + border-right:2px solid #b3b3b3; + border-bottom:2px solid #b3b3b3; + background:#f1f1f1; + color:#000; + margin:0; + padding:4px 12px 6px 24px; + margin:-2px 0 0 -2px; +} + +.aToolTipInner .aToolTipContent { + position:relative; + margin:0; + padding:0; +} + +a.aToolTipCloseBtn { + display:block; + height:16px; + width:16px; + background:url(../images/infoBtn.gif) no-repeat; + text-indent:-9999px; + outline:none; + position:absolute; + top:1px; + left:1px; + margin:1px 2px 2px 1px; + padding:0px; +} diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/css/style.css b/conlite/plugins/mod_rewrite/external/aToolTip/css/style.css new file mode 100644 index 0000000..9f009cc --- /dev/null +++ b/conlite/plugins/mod_rewrite/external/aToolTip/css/style.css @@ -0,0 +1,174 @@ +/* Eric Meyer's Reset Reloaded */ +/* http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, a, abbr, acronym, address, big, cite, code,del, dfn, em, +font, img, ins, kbd, q, s, samp,small, strike, strong, sub, +sup, tt, var,b, u, i, center,dl, dt, dd, ol, ul, li, +fieldset, form, label, legend,table, caption, tbody, tfoot, +thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +ol, ul {list-style: none;} +blockquote, q {quotes: none;} +table {border-collapse: collapse;border-spacing: 0;} + +.clearfix:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} +/* IE6 */ +* html .clearfix {height: 1%;} +/* IE7 */ +*:first-child+html .clearfix {min-height: 1px;} + + +body { + background: #282828 url(../images/bg.png) repeat-x; + color: #999999; + font-size: 12px; + line-height: 20px; + font-family: Arial, helvetica; +} + +a, +a:link, +a:visited { + color: #FEC92C; + text-decoration: none; + +} + +a:hover, +a:active, +a:focus { + text-decoration: underline; +} + + +a.exampleTip { + color: #FEC92C; +} + +a.exampleTip:hover{ + text-decoration: underline; +} + +.section { + text-align: left; + padding-bottom: 18px; + border-bottom: 1px solid #333; + margin-bottom: 18px; +} + +p { + margin: 0 0 18px; +} + +h2 { + color: #fff; + font-size: 22px; + line-height: 24px; + margin: 0 0 24px; + padding: 0; + font-weight: normal; +} + +h3{ + color: #ddd; + font-size: 14px; + line-height: 18px; + margin: 0 0 18px; +} + + +h1.logo { + display: block; + height: 80px; + width: 260px; + margin: 40px auto 0; +} + + h1.logo a{ + display: block; + height: 80px; + width: 260px; + text-indent: -9999px; + background: url(../images/logo.png) no-repeat; + } + + +ul.demos { + list-style-type: none; + +} + +ul.demos li{ + margin: 0 0 10px 0; +} + + +.primaryWrapper { + margin: 0 auto; + width: 960px; + text-align: center; +} + +.branding{ + text-align: center; + display: block; + height: 120px; +} + + +.ctaBtns {border: none; text-align: center;} + +.ctaBtns p { + width: 263px; + margin: 0 auto; +} + + +.ctaBtns a{ + display: block; + height: 37px; + width: 122px; + text-indent: -9999px; +} + +a.dloadBtn { + background: url(../images/dload-btn.png) no-repeat top left; + float: left; + margin-right: 18px; +} + +a.demoBtn { + background: url(../images/demo-btn.png) no-repeat top left; + float: left; +} + +a.dloadBtn:hover, +a.demoBtn:hover { + background-position: bottom left; +} + + + +.usage p { + margin-bottom: 2px; +} + +ul.quickFacts { + list-style-position: inside; + list-style-type: disc; +} + +p.license, +p.copyright { + font-size: 11px; +} + + + diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/demos.html b/conlite/plugins/mod_rewrite/external/aToolTip/demos.html new file mode 100644 index 0000000..fbfe36f --- /dev/null +++ b/conlite/plugins/mod_rewrite/external/aToolTip/demos.html @@ -0,0 +1,81 @@ + + + + + aToolTip Demos + + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    aToolTip

    +
    + + + + + +
    +

    Demos

    + +
      +
    • Normal Tooltip - This is a normal tooltip with default settings.
    • +
    • Fixed Tooltip - This is a fixed tooltip that doesnt follow the mouse.
    • +
    • On Click Tooltip - This is a click activated tooltip with content passed in from 'tipContent' param
    • +
    + +
    + + + + + + +

    +Creative Commons License
    This work is licensed under a Creative Commons Attribution 3.0 Unported License. +

    + + +
    + + + + \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/images/bg.png b/conlite/plugins/mod_rewrite/external/aToolTip/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..35d844bb7170cfd7fa492fca7f4f2b6465ff769a GIT binary patch literal 1218 zcmV;z1U>tSP)pEOG|?z}&w{a)lP55qvq+m5_=A0pm!hpflpGUoeq&G%C` zD+hTo&-3>6ylkR^2>S_;^Npi|&Bt_7p+(3C6Wjau*lfSnPjAe9pYp`DzU}q2lHx@M zh`hm!pSAvjjzs`^<%uuija%;oB+Lz0y>*9?{@Z{5`N_^e_I4d!yg;JCPo#W%y4c zwvGGC(l&mZ~tmMhUb47@gzh7q0v_-!LO&e&3Rkc(lZ!<|U0hQLij& zT>W?S$*|}EZ?sh(tZ5_^;^ku%r~1hyH}Jb%Wqr)J!0d+&5;SiLavv?6c$Wt+nk-ur zobtiR4_jYyN`R@qQu9to(B2nve@!SgzZm=Y0IYuc2k-Z-OJ9KhXiAUYiLx&kv@%aCt6CQvcGXy!yoMkH6<{`|QvD?9cw}&;IPs{_M~G?9cw} g&;IP|_fLQU00A?kT&QvP%m4rY07*qoM6N<$g8amQ1^@s6 literal 0 HcmV?d00001 diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/images/infoBtn.gif b/conlite/plugins/mod_rewrite/external/aToolTip/images/infoBtn.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f8629e962a5ddf25582ec9694fa4843dea54d84 GIT binary patch literal 90 zcmZ?wbhEHb6krfwSj57>kg)Op|No5}Zq%*6!GHu5f3h$#Ft9M_fW$y*8JOigHr!dO icgi!8W9!{BEe}o`G#p@?B{OTKsQ1p4KNDP-7_0$)${WQ1 literal 0 HcmV?d00001 diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.jquery.js b/conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.jquery.js new file mode 100644 index 0000000..0145ace --- /dev/null +++ b/conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.jquery.js @@ -0,0 +1,118 @@ +/* + jQuery Version: jQuery 1.3.2 + Plugin Name: aToolTip V 1.0 + Plugin by: Ara Abcarians: http://ara-abcarians.com + License: aToolTip is licensed under a Creative Commons Attribution 3.0 Unported License + Read more about this license at --> http://creativecommons.org/licenses/by/3.0/ + Modified: Murat Purc , 2010-01-28: Position clickable tooltip on right side, + remove previous opened tooltip + +Creates following node: +----------------------- +
    +
    +

    + Content + close +
    +
    + +*/ +(function($) { + $.fn.aToolTip = function(options) { + + // setup default settings + var defaults = { + clickIt: false, + closeTipBtn: 'aToolTipCloseBtn', + fixed: false, + inSpeed: 400, + outSpeed: 100, + tipContent: '', + toolTipClass: 'aToolTip', + xOffset: 0, + yOffset: 0 + }, + + // This makes it so the users custom options overrides the default ones + settings = $.extend({}, defaults, options); + + return this.each(function() { + var obj = $(this); + // Decide weather to use a title attr as the tooltip content + if (obj.attr('title') && !settings.tipContent) { + // set the tooltip content/text to be the obj title attribute + var tipContent = obj.attr('title'); + } else { + // if no title attribute set it to the tipContent option in settings + var tipContent = settings.tipContent; + } + + // check if obj has a title attribute and if click feature is off + if(tipContent && !settings.clickIt){ + // Activate on hover + obj.hover(function(el){ + obj.attr({title: ''}); + $('body').append("

    "+ tipContent +"

    "); + $('.' + settings.toolTipClass).css({ + position: 'absolute', + display: 'none', + zIndex: '50000', + top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px', + left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px' + }) + .stop().fadeIn(settings.inSpeed); + }, + function(){ + // Fade out + $('.' + settings.toolTipClass).stop().fadeOut(settings.outSpeed, function(){$(this).remove();}); + }); + } + + // Follow mouse if fixed is false and click is false + if(!settings.fixed && !settings.clickIt){ + obj.mousemove(function(el){ + $('.' + settings.toolTipClass).css({ + top: (el.pageY - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset), + left: (el.pageX + settings.xOffset) + }) + }); + } + + // check if click feature is enabled + if(tipContent && settings.clickIt){ + // Activate on click + obj.click(function(el){ + if (!settings.tipContent) { + obj.attr({title: ''}); + } + +// $('.' + settings.toolTipClass).remove(); + $('.' + settings.toolTipClass).stop().fadeOut(settings.outSpeed, function(){$(this).remove();}); + + $('body').append("

    "+ tipContent +"

    close
    "); + $('.' + settings.toolTipClass).css({ + position: 'absolute', + display: 'none', + zIndex: '50000', +// top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px', +// left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px' + top: (obj.offset().top - settings.yOffset) + 'px', + left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px' + }) + .fadeIn(settings.inSpeed); + // Click to close tooltip + $('.' + settings.closeTipBtn).click(function(){ + $('.' + settings.toolTipClass).fadeOut(settings.outSpeed, function(){$(this).remove();}); + return false; + }); + return false; + }); + } + + }); // END: return this + + // returns the jQuery object to allow for chainability. + return this; + }; +})(jQuery); \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.min.jquery.js b/conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.min.jquery.js new file mode 100644 index 0000000..c6a8c46 --- /dev/null +++ b/conlite/plugins/mod_rewrite/external/aToolTip/js/atooltip.min.jquery.js @@ -0,0 +1,2 @@ +/*Plugin by: Ara Abcarians: http://ara-abcarians.com License: http://creativecommons.org/licenses/by/3.0/ */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(2($){$.O.w=2(d){8 e={9:f,q:\'P\',x:f,r:Q,s:R,y:\'\',1:\'w\',g:5,h:5},0=$.S({},e,d);i 3.T(2(){8 b=$(3);j(b.k(\'l\')){8 c=b.k(\'l\')}U{8 c=0.y}j(c&&!0.9){b.V(2(a){b.k({l:\'\'});$(\'z\').t("

    "+c+"

    ");$(\'.\'+0.1).u({B:\'C\',D:\'E\',F:\'G\',6:(b.n().6-$(\'.\'+0.1).v()-0.h)+\'o\',7:(b.n().7+b.H()+0.g)+\'o\'}).I().J(0.r)},2(){$(\'.\'+0.1).I().K(0.s,2(){$(3).L()})})}j(!0.x&&!0.9){b.W(2(a){$(\'.\'+0.1).u({6:(a.X-$(\'.\'+0.1).v()-0.h),7:(a.Y+0.g)})})}j(c&&0.9){b.M(2(a){b.k({l:\'\'});$(\'z\').t("

    "+c+"

    ");$(\'.\'+0.1).t("N");$(\'.\'+0.1).u({B:\'C\',D:\'E\',F:\'G\',6:(b.n().6-$(\'.\'+0.1).v()-0.h)+\'o\',7:(b.n().7+b.H()+0.g)+\'o\'}).J(0.r);$(\'.\'+0.q).M(2(){$(\'.\'+0.1).K(0.s,2(){$(3).L()});i f});i f})}});i 3}})(11);',62,64,'settings|toolTipClass|function|this|class||top|left|var|clickIt||||||false|xOffset|yOffset|return|if|attr|title|div|offset|px||closeTipBtn|inSpeed|outSpeed|append|css|outerHeight|aToolTip|fixed|tipContent|body|aToolTipContent|position|absolute|display|none|zIndex|50000|outerWidth|stop|fadeIn|fadeOut|remove|click|close|fn|aToolTipCloseBtn|400|100|extend|each|else|hover|mousemove|pageY|pageX|href|alt|jQuery'.split('|'),0,{})) \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/external/aToolTip/js/jquery.min.js b/conlite/plugins/mod_rewrite/external/aToolTip/js/jquery.min.js new file mode 100644 index 0000000..b1ae21d --- /dev/null +++ b/conlite/plugins/mod_rewrite/external/aToolTip/js/jquery.min.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/files/htaccess_restrictive.txt b/conlite/plugins/mod_rewrite/files/htaccess_restrictive.txt new file mode 100644 index 0000000..d2eeede --- /dev/null +++ b/conlite/plugins/mod_rewrite/files/htaccess_restrictive.txt @@ -0,0 +1,71 @@ +################################################################################ +# Contenido AMR plugin restrictive rewrite rules set. +# +# Contains strict rules, each rewrite exclusion must be set manually. +# - Exclude requests to directories usage/, contenido/, setup/, cms/upload/ +# - Exclude requests to cms/front_content.php +# - Pass thru requests to common ressources (pictures, movies, js, css, pdf) +# +# @version 0.0.1 +# @author Murat Purc +# @copyright four for business AG +# @license http://www.contenido.org/license/LIZENZ.txt +# @link http://www.4fb.de +# @link http://www.contenido.org +# @since file available since Contenido release 4.8.15 +# +# $Id: htaccess_restrictive.txt 447 2016-07-08 14:04:12Z oldperl $ +################################################################################ + + +# Enable following lines to run PHP5 on 1und1.de (1and1.com) +#AddType x-mapp-php5 .php +#AddHandler x-mapp-php5 .php + + + + # Enable rewrite engine + RewriteEngine on + + + # Specify a base URL-path for the rules + RewriteBase /cms + + + # Catch some common exploits in query string to get rid of them. + # NOTE: Conditions to prevent protocols (ftp, http[s]) in query string could + # be a disadvantage in some cases. + RewriteCond %{QUERY_STRING} contenido_path=.*$ [NC,OR] + RewriteCond %{QUERY_STRING} cfg\[path\]=.*$ [NC,OR] + RewriteCond %{QUERY_STRING} _PHPLIB\[libdir\]=.*$ [NC,OR] + RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] + RewriteCond %{QUERY_STRING} ftp://.*$ [NC,OR] + RewriteCond %{QUERY_STRING} http[s]*://.*$ [NC] + RewriteRule ^.* - [F,L] # all matching conditions from above will end in nirvana + + + # Exclude some files and directories from rewriting + RewriteRule ^usage/.*$ - [L] + RewriteRule ^conlite/.*$ - [L] + RewriteRule ^setup/.*$ - [L] + RewriteRule ^cms/upload/.*$ - [L] + RewriteRule ^cms/test/.*$ - [L] + RewriteRule ^cms/front_content.php.*$ - [L] + + + # One RewriteRule to rule them all. + # Exclude common extensions from rewriting and pass remaining requests to + # front_content.php. + RewriteRule !\.(avi|css|doc|flv|gif|gzip|ico|jpeg|jpg|js|mov|mp3|pdf|png|ppt|rar|txt|wav|wmv|xml|zip)$ front_content.php [NC,QSA,L] + + + + +# Some rules to compress files. +# NOTE: Following settings are not mod rewrite specific, but enabling mod_deflate +# for some file types can help to reduce bandwith. + + + SetOutputFilter DEFLATE + + diff --git a/conlite/plugins/mod_rewrite/files/htaccess_simple.txt b/conlite/plugins/mod_rewrite/files/htaccess_simple.txt new file mode 100644 index 0000000..5c22ca9 --- /dev/null +++ b/conlite/plugins/mod_rewrite/files/htaccess_simple.txt @@ -0,0 +1,69 @@ +################################################################################ +# Contenido AMR plugin simple rewrite rules set. +# +# Contains few easy to handle rewrite rules. +# +# @version 0.0.1 +# @author Murat Purc +# @copyright four for business AG +# @license http://www.contenido.org/license/LIZENZ.txt +# @link http://www.4fb.de +# @link http://www.contenido.org +# @since file available since Contenido release 4.8.15 +# +# $Id: htaccess_simple.txt 2 2011-07-20 12:00:48Z oldperl $ +################################################################################ + + +# Enable following lines to run PHP5 on 1und1.de (1and1.com) +#AddType x-mapp-php5 .php +#AddHandler x-mapp-php5 .php + + + + # Enable rewrite engine + RewriteEngine on + + + # Specify a base URL-path for the rules + RewriteBase /cms + + + # Catch some common exploits in query string to get rid of them + # NOTE: Conditions to prevent protocols (ftp, http[s]) in query string could + # be a disadvantage in some cases + RewriteCond %{QUERY_STRING} contenido_path=.*$ [NC,OR] + RewriteCond %{QUERY_STRING} cfg\[path\]=.*$ [NC,OR] + RewriteCond %{QUERY_STRING} _PHPLIB\[libdir\]=.*$ [NC,OR] + RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] + RewriteCond %{QUERY_STRING} ftp://.*$ [NC,OR] + RewriteCond %{QUERY_STRING} http[s]*://.*$ [NC] + RewriteRule ^.* - [F,L] # all matching conditions from above will end in nirvana + + + # Rewrite request to root to front_content.php + RewriteRule ^$ front_content.php [QSA,L] + + + # Exclude following request from rewriting + # tests for valid symlinks (-s), not empty files (-l) and folders (-d) + RewriteCond %{REQUEST_FILENAME} -s [OR] + RewriteCond %{REQUEST_FILENAME} -l [OR] + RewriteCond %{REQUEST_FILENAME} -d + RewriteRule ^.*$ - [NC,L] + + + # Pass other requests to front_content.php + RewriteRule ^.*$ front_content.php [QSA,NC,L] + + + + +# Some rules to compress files. +# NOTE: Following settings are not mod rewrite specific, but enabling mod_deflate +# for some file types can help to reduce bandwith. + + + SetOutputFilter DEFLATE + + diff --git a/conlite/plugins/mod_rewrite/includes/config.mod_rewrite_default.php b/conlite/plugins/mod_rewrite/includes/config.mod_rewrite_default.php new file mode 100644 index 0000000..ec7ac1a --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/config.mod_rewrite_default.php @@ -0,0 +1,128 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-05-xx + * + * $Id: config.mod_rewrite_default.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +global $cfg; + +// Use advanced mod_rewrites ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['use'] = 0; + +// Path to the htaccess file with trailling slash from domain-root! +$cfg['mod_rewrite']['rootdir'] = '/'; + +// Check path to the htaccess file ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['checkrootdir'] = 1; + +// Start TreeLocation from Root Tree (set to 1) or get location from first category (set to 0) +$cfg['mod_rewrite']['startfromroot'] = 0; + +// Prevent Duplicated Content, if startfromroot is enabled ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['prevent_duplicated_content'] = 0; + +// is multilanguage? ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['use_language'] = 0; + +// use language name in url? ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['use_language_name'] = 0; + +// is multiclient in only one directory? ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['use_client'] = 0; + +// use client name in url? ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['use_client_name'] = 0; + +// use lowercase url? ( 1 = yes, 0 = none ) +$cfg['mod_rewrite']['use_lowercase_uri'] = 1; + +// file extension for article links +$cfg['mod_rewrite']['file_extension'] = '.html'; + +// The percentage if the category name have to match with database names. +$cfg['mod_rewrite']['category_resolve_min_percentage'] = '75'; + +// Add start article name to url (1 = yes, 0 = none) +$cfg['mod_rewrite']['add_startart_name_to_url'] = 1; + +// Default start article name to use, depends on active add_startart_name_to_url +$cfg['mod_rewrite']['default_startart_name'] = 'index'; + +// Rewrite urls on generating the code for the page. If active, the responsibility will be +// outsourced to moduleoutputs and you have to adapt the moduleoutputs manually. Each output of +// internal article/category links must be processed by using $sess->url. (1 = yes, 0 = none) +$cfg['mod_rewrite']['rewrite_urls_at_congeneratecode'] = 0; + +// Rewrite urls on output of htmlcode at front_content.php. Is the old way, and doesn't require +// adapting of moduleoutputs. On the other hand usage of this way will be slower than rewriting +// option above. (1 = yes, 0 = none) +$cfg['mod_rewrite']['rewrite_urls_at_front_content_output'] = 1; + + +// Following five settings write urls like this one: +// www.domain.de/category1-category2.articlename.html +// Changes of these settings causes a reset of all aliases, see Advanced Mod Rewrite settings in +// backend. +// NOTE: category_seperator and article_seperator must contain different character. + +// Separator for categories +$cfg['mod_rewrite']['category_seperator'] = '/'; + +// Separator between category and article +$cfg['mod_rewrite']['article_seperator'] = '/'; + +// Word seperator in category names +$cfg['mod_rewrite']['category_word_seperator'] = '-'; + +// Word seperator in article names +$cfg['mod_rewrite']['article_word_seperator'] = '-'; + + +// Routing settings for incomming urls. Here you can define routing rules as follows: +// $cfg['mod_rewrite']['routing'] = array( +// '/a_incomming/url/foobar.html' => '/new_url/foobar.html', # route /a_incomming/url/foobar.html to /new_url/foobar.html +// '/cms/' => '/' # route /cms/ to / (doc root of client) +// ); +$cfg['mod_rewrite']['routing'] = array(); + + +// Redirect invalid articles to errorpage (1 = yes, 0 = none) +$cfg['mod_rewrite']['redirect_invalid_article_to_errorsite'] = 0; + diff --git a/conlite/plugins/mod_rewrite/includes/config.plugin.php b/conlite/plugins/mod_rewrite/includes/config.plugin.php new file mode 100644 index 0000000..96060d7 --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/config.plugin.php @@ -0,0 +1,178 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-05-xx + * + * $Id: config.plugin.php 275 2013-09-11 12:49:00Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +#################################################################################################### +/** + * Chain Contenido.Frontend.CreateURL + * This chain is called inside some scripts (front_content.php) to create urls. + * + * @todo: Is added to provide downwards compatibility for the amr plugin. + * There is no need for this chain since Contenido 4.8.9 contains its own Url building feature. + * @deprecated + * + * Parameters & order: + * string URL including parameter value pairs + * + * Returns: + * string Returns modified URL + */ +$_cecRegistry->registerChain("Contenido.Frontend.CreateURL", "string"); +#################################################################################################### + + +global $cfg, $contenido, $mr_statics; + +// used for caching +$mr_statics = array(); + +// initialize client id +if (isset($client) && (int) $client > 0) { + $clientId = (int) $client; +} elseif (isset($load_client) && (int) $load_client > 0) { + $clientId = (int) $load_client; +} else { + $clientId = ''; +} + + +// include necessary sources +plugin_include('mod_rewrite', 'classes/class.modrewritedebugger.php'); +plugin_include('mod_rewrite', 'classes/class.modrewritebase.php'); +plugin_include('mod_rewrite', 'classes/class.modrewrite.php'); +plugin_include('mod_rewrite', 'classes/class.modrewritecontroller.php'); +plugin_include('mod_rewrite', 'classes/class.modrewriteurlstack.php'); +plugin_include('mod_rewrite', 'classes/class.modrewriteurlutil.php'); +plugin_include('mod_rewrite', 'includes/functions.mod_rewrite.php'); + + +// set debug configuration +if (isset($contenido)) { + ModRewriteDebugger::setEnabled(true); +} else { + ModRewriteDebugger::setEnabled(false); +} + +// initialize mr plugin +ModRewrite::initialize($clientId); + +if (ModRewrite::isEnabled()) { + + $aMrCfg = ModRewrite::getConfig(); + + $_cecRegistry = cApiCECRegistry::getInstance(); + + // Add new tree function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.str_newtree.AfterCall', 'mr_strNewTree'); + + // Add move subtree function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.str_movesubtree.AfterCall', 'mr_strMoveSubtree'); + + // Add new category function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.str_newcat.AfterCall', 'mr_strNewCategory'); + + // Add rename category function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.str_renamecat.AfterCall', 'mr_strRenameCategory'); + + // Add move up category function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.str_moveupcat.AfterCall', 'mr_strMoveUpCategory'); + + // Add move down category function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.str_movedowncat.AfterCall', 'mr_strMovedownCategory'); + + // Add copy category function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Category.strCopyCategory', 'mr_strCopyCategory'); + + // Add category sync function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Category.strSyncCategory_Loop', 'mr_strSyncCategory'); + + // Add save article (new and existing category) function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Action.con_saveart.AfterCall', 'mr_conSaveArticle'); + + // Add move article function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Article.conMoveArticles_Loop', 'mr_conMoveArticles'); + + // Add duplicate article function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Article.conCopyArtLang_AfterInsert', 'mr_conCopyArtLang'); + + // Add sync article function to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Article.conSyncArticle_AfterInsert', 'mr_conSyncArticle'); + + if (!isset($contenido)) { + // we are not in backend, add cec functions for rewriting + + // Add mr related function for hook "after plugins loaded" to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Frontend.AfterLoadPlugins', 'mr_runFrontendController'); + + // Add url rewriting function to Contenido Extension Chainer + // @todo: no more need since Contenido 4.8.9 provides central Url building, + // but it is still available because of downwards compatibility + // @deprecated + $_cecRegistry->addChainFunction('Contenido.Frontend.CreateURL', 'mr_buildNewUrl'); + + // overwrite url builder configuration with own url builder + $cfg['url_builder']['name'] = 'MR'; + $cfg['config'] = array(); + Contenido_UrlBuilderConfig::setConfig($cfg['url_builder']); + + if ($aMrCfg['rewrite_urls_at_congeneratecode'] == 1) { + // Add url rewriting at code generation to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Content.conGenerateCode', 'mr_buildGeneratedCode'); + } elseif ($aMrCfg['rewrite_urls_at_front_content_output'] == 1) { + // Add url rewriting at html output to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Frontend.HTMLCodeOutput', 'mr_buildGeneratedCode'); + } else { + // Fallback solution: Add url rewriting at code generation to Contenido Extension Chainer + $_cecRegistry->addChainFunction('Contenido.Content.conGenerateCode', 'mr_buildGeneratedCode'); + } + } + +} + +if (isset($contenido) && isset($area) && $area == 'mod_rewrite_test') { + // configure url builder to enable it on test page + $cfg['url_builder']['name'] = 'MR'; + $cfg['config'] = array(); + Contenido_UrlBuilderConfig::setConfig($cfg['url_builder']); + ModRewrite::setEnabled(true); +} + +unset($clientId, $options); + +// administration > users > area translations +global $lngAct, $_cecRegistry; +$lngAct['mod_rewrite']['mod_rewrite'] = i18n("MR-Options", "mod_rewrite"); +$lngAct['mod_rewrite']['mod_rewrite_expert'] = i18n("Expert Options", "mod_rewrite"); +$lngAct['mod_rewrite']['mod_rewrite_test'] = i18n("MR Test Area", "mod_rewrite"); diff --git a/conlite/plugins/mod_rewrite/includes/front_content_controller.php b/conlite/plugins/mod_rewrite/includes/front_content_controller.php new file mode 100644 index 0000000..3448153 --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/front_content_controller.php @@ -0,0 +1,115 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-05-xx + * + * $Id: front_content_controller.php 220 2013-02-14 08:40:43Z Mansveld $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +global $client, $changeclient, $cfgClient, $lang, $changelang, $idart, $idcat, $path; + +ModRewriteDebugger::add(ModRewrite::getConfig(), 'front_content_controller.php mod rewrite config'); + + +// create an mod rewrite controller instance and execute processing +$oMRController = new ModRewriteController($_SERVER['REQUEST_URI']); +$oMRController->execute(); + +if ($oMRController->errorOccured()) { + + // an error occured (idcat and or idart couldn't catched by controller) + + $iRedirToErrPage = ModRewrite::getConfig('redirect_invalid_article_to_errorsite', 0); + // try to redirect to errorpage if desired + if ($iRedirToErrPage == 1 && (int) $client > 0 && (int) $lang > 0) { + global $errsite_idcat, $errsite_idart; + + if ($cfgClient['set'] != 'set') { + rereadClients(); + } + + // errorpage + $aParams = array( + 'client' => $client, 'idcat' => $errsite_idcat[$client], 'idart' => $errsite_idart[$client], + 'lang' => $lang, 'error'=> '1' + ); + $errsite = 'Location: ' . Contenido_Url::getInstance()->buildRedirect($aParams); + header("HTTP/1.0 404 Not found"); + mr_header($errsite); + exit(); + } + +} else { + + // set some global variables + + if ($oMRController->getClient()) { + $client = $oMRController->getClient(); + } + + if ($oMRController->getChangeClient()) { + $changeclient = $oMRController->getChangeClient(); + } + + if ($oMRController->getLang()) { + $lang = $oMRController->getLang(); + } + + if ($oMRController->getChangeLang()) { + $changelang = $oMRController->getChangeLang(); + } + + if ($oMRController->getIdArt()) { + $idart = $oMRController->getIdArt(); + } + + if ($oMRController->getIdCat()) { + $idcat = $oMRController->getIdCat(); + } + + if ($oMRController->getPath()) { + $path = $oMRController->getPath(); + } + +} + +// some debugs +ModRewriteDebugger::add($mr_preprocessedPageError, 'mr $mr_preprocessedPageError', __FILE__); +ModRewriteDebugger::add($idart, 'mr $idart', __FILE__); +ModRewriteDebugger::add($idcat, 'mr $idcat', __FILE__); +ModRewriteDebugger::add($lang, 'mr $lang', __FILE__); +ModRewriteDebugger::add($client, 'mr $client', __FILE__); + diff --git a/conlite/plugins/mod_rewrite/includes/functions.mod_rewrite.php b/conlite/plugins/mod_rewrite/includes/functions.mod_rewrite.php new file mode 100644 index 0000000..b228e96 --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/functions.mod_rewrite.php @@ -0,0 +1,967 @@ + + * @copyright � www.polycoder.de + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2004-12-04 + * modified 2005-12-18 + * + * $Id: functions.mod_rewrite.php 391 2015-11-09 21:12:36Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +/** + * Processes mod_rewrite related job for created new tree. + * + * Will be called by chain 'Contenido.Action.str_newtree.AfterCall'. + * + * @param array $data Assoziative array with some values + * @return array Passed parameter + */ +function mr_strNewTree(array $data) +{ + global $lang; + + ModRewriteDebugger::log($data, 'mr_strNewTree $data'); + + if ((int) $data['newcategoryid'] > 0) { + $mrCatAlias = (trim($data['categoryalias']) !== '') ? trim($data['categoryalias']) : trim($data['categoryname']); + // set new urlname - because original set urlname isn''t validated for double entries in same parent category + ModRewrite::setCatWebsafeName($mrCatAlias, $data['newcategoryid'], $lang); + ModRewrite::setCatUrlPath($data['newcategoryid'], $lang); + } + + return $data; +} + + +/** + * Processes mod_rewrite related job for created new category. + * + * Will be called by chain 'Contenido.Action.str_newcat.AfterCall'. + * + * @param array $data Assoziative array with some values + * @return array Passed parameter + */ +function mr_strNewCategory(array $data) +{ + global $lang; + + ModRewriteDebugger::log($data, 'mr_strNewCategory $data'); + + if ((int) $data['newcategoryid'] > 0) { + $mrCatAlias = (trim($data['categoryalias']) !== '') ? trim($data['categoryalias']) : trim($data['categoryname']); + // set new urlname - because original set urlname isn''t validated for double entries in same parent category + ModRewrite::setCatWebsafeName($mrCatAlias, $data['newcategoryid'], $lang); + ModRewrite::setCatUrlPath($data['newcategoryid'], $lang); + } + + return $data; +} + + +/** + * Processes mod_rewrite related job for renamed category + * 2010-02-01: and now all existing subcategories and modify their paths too... + * 2010-02-01: max 50 recursion level + * + * Will be called by chain 'Contenido.Action.str_renamecat.AfterCall'. + * + * @param array $data Assoziative array with some values + * @return array Passed parameter + */ +function mr_strRenameCategory(array $data) +{ + ModRewriteDebugger::log($data, 'mr_strRenameCategory $data'); + + // hes 20100102 + // maximal 50 recursion level + $recursion = (is_int($data['recursion'])) ? $data['recursion'] : 1; + if ($recursion > 50) { + exit("#20100201-1503: sorry - maximum function nesting level of ".$recursion." reached"); + } + + $mrCatAlias = (trim($data['newcategoryalias']) !== '') ? trim($data['newcategoryalias']) : trim($data['newcategoryname']); + if ($mrCatAlias != '') { + // set new urlname - because original set urlname isn''t validated for double entries in same parent category + ModRewrite::setCatWebsafeName($mrCatAlias, $data['idcat'], $data['lang']); + ModRewrite::setCatUrlPath($data['idcat'], $data['lang']); + } + + // hes 20100102 + // now dive into all existing subcategories and modify their paths too... + $str = 'parentid=' . $data['idcat']; + $oCatColl = new cApiCategoryCollection($str); + + while ($oCat = $oCatColl->next()) { + // hes 20100102 + $str = 'idcat=' . $oCat->get('idcat') . ' AND idlang=' . (int) $data['lang']; + $oCatLanColl = new cApiCategoryLanguageCollection($str); + $oCatLan = $oCatLanColl->next(); + + // hes 20100102 + $childData = array( + 'idcat' => $oCat->get('idcat'), + 'lang' => (int) $data['lang'], + 'newcategoryname' => $oCatLan->get('name'), + 'newcategoryalias' => $oCatLan->get('urlname'), + 'recursion' => $recursion + 1 + ); + + $resData = mr_strRenameCategory($childData); + } + + return $data; +} + + +/** + * Processes mod_rewrite related job after moving a category up. + * + * Will be called by chain 'Contenido.Action.str_moveupcat.AfterCall'. + * + * @todo do we really need processing of the category? there is no mr relevant data + * changes while moving the category on same level, level and name won't change + * + * @param int $idcat Category id + * @return int Category id + */ +function mr_strMoveUpCategory($idcat) +{ + ModRewriteDebugger::log($idcat, 'mr_strMoveUpCategory $idcat'); + + // category check + $cat = new cApiCategory((int) $idcat); + if (!$cat->get('preid')) { + return; + } + + // get all cat languages + $aIdLang = ModRewrite::getCatLanguages($idcat); + + // update ... + foreach ($aIdLang as $iIdLang) { + // get urlname + $sCatname = ModRewrite::getCatName($idcat, $iIdLang); + // set new urlname - because original set urlname isn't validated for double entries in same parent category + ModRewrite::setCatWebsafeName($sCatname, $idcat, $iIdLang); + } + + return $idcat; +} + + +/** + * Processes mod_rewrite related job after moving a category down. + * + * Will be called by chain 'Contenido.Action.str_movedowncat.AfterCall'. + * + * @todo do we really need processing of the category? there is no mr relevant data + * changes while moving the category on same level, level and name won't change + * + * @param int $idcat Id of category beeing moved down + * @return int Category id + */ +function mr_strMovedownCategory($idcat) +{ + ModRewriteDebugger::log($idcat, 'mr_strMovedownCategory $idcat'); + + // category check + $cat = new cApiCategory((int) $idcat); + if (!$cat->get('id')) { + return; + } + + // get all cat languages + $aIdLang = ModRewrite::getCatLanguages($idcat); + // update ... + foreach ($aIdLang as $iIdLang) { + // get urlname + $sCatname = ModRewrite::getCatName($idcat, $iIdLang); + // set new urlname - because original set urlname isn't validated for double entries in same parent category + ModRewrite::setCatWebsafeName($sCatname, $idcat, $iIdLang); + } + + return $idcat; +} + + +/** + * Processes mod_rewrite related job after moving a category subtree. + * + * Will be called by chain 'Contenido.Action.str_movesubtree.AfterCall'. + * + * @param array $data Assoziative array with some values + * @return array Passed parameter + */ +function mr_strMoveSubtree(array $data) +{ + ModRewriteDebugger::log($data, 'mr_strMoveSubtree $data'); + + // category check + if ((int) $data['idcat'] <= 0) { + return; + } + + // next category check + $cat = new cApiCategory($data['idcat']); + if (!$cat->get('idcat')) { + return; + } + + // get all cat languages + $aIdLang = ModRewrite::getCatLanguages($data['idcat']); + // update all languages + foreach ($aIdLang as $iIdLang) { + // get urlname + $sCatname = ModRewrite::getCatName($data['idcat'], $iIdLang); + // set new urlname - because original set urlname isn't validated for double entries in same parent category + ModRewrite::setCatWebsafeName($sCatname, $data['idcat'], $iIdLang); + ModRewrite::setCatUrlPath($data['idcat'], $iIdLang); + } + + // now dive into all existing subcategories and modify their paths too... + $oCatColl = new cApiCategoryCollection('parentid=' . $data['idcat']); + while ($oCat = $oCatColl->next()) { + mr_strMoveSubtree(array('idcat' => $oCat->get('idcat'))); + } + + return $data; +} + + +/** + * Processes mod_rewrite related job after copying a category subtree. + * + * Will be called by chain 'Contenido.Category.strCopyCategory'. + * + * @param array $data Assoziative array with some values + * @return array Passed parameter + */ +function mr_strCopyCategory(array $data) +{ + ModRewriteDebugger::log($data, 'mr_strCopyCategory $data'); + + $idcat = (int) $data['newcat']->get('idcat'); + if ($idcat <= 0) { + return $data; + } + + // get all cat languages + $aIdLang = ModRewrite::getCatLanguages($idcat); + // update ... + foreach ($aIdLang as $iIdLang) { + // get urlname + $sCatname = ModRewrite::getCatName($idcat, $iIdLang); + // set new urlname - because original set urlname isn't validated for double entries in same parent category + ModRewrite::setCatWebsafeName($sCatname, $idcat, $iIdLang); + ModRewrite::setCatUrlPath($idcat, $iIdLang); + } +} + + +/** + * Processes mod_rewrite related job during structure synchronisation process, + * sets the urlpath of current category. + * + * Will be called by chain 'Contenido.Category.strSyncCategory_Loop'. + * + * @param array $data Assoziative array with some values + * @return array Passed parameter + */ +function mr_strSyncCategory(array $data) +{ + ModRewriteDebugger::log($data, 'mr_strSyncCategory $data'); + ModRewrite::setCatUrlPath($data['idcat'], $data['idlang']); + return $data; +} + + +/** + * Processes mod_rewrite related job for saved articles (new or modified article). + * + * Will be called by chain 'Contenido.Action.con_saveart.AfterCall'. + * + * @param array $data Assoziative array with some article properties + * @return array Passed parameter + */ +function mr_conSaveArticle(array $data) +{ + global $tmp_firstedit, $client; + + ModRewriteDebugger::log($data, 'mr_conSaveArticle $data'); + + if ((int) $data['idart'] == 0) { + return $data; + } + + if (strlen(trim($data['urlname'])) == 0) { + $data['urlname'] = $data['title']; + } + + if (1 == $tmp_firstedit) { + // new article + $aLanguages = getLanguagesByClient($client); + + foreach ($aLanguages as $iLang) { + ModRewrite::setArtWebsafeName($data['urlname'], $data['idart'], $iLang, $data['idcat']); + } + } else { + // modified article + $aArticle = ModRewrite::getArtIdByArtlangId($data['idartlang']); + + if (isset($aArticle['idart']) && isset($aArticle['idlang'])) { + ModRewrite::setArtWebsafeName($data['urlname'], $aArticle['idart'], $aArticle['idlang'], $data['idcat']); + } + } + + return $data; +} + + +/** + * Processes mod_rewrite related job for articles beeing moved. + * + * Will be called by chain 'Contenido.Article.conMoveArticles_Loop'. + * + * @param array $data Assoziative array with record entries + * @return array Loop through of arguments + */ +function mr_conMoveArticles($data) +{ + ModRewriteDebugger::log($data, 'mr_conMoveArticles $data'); + + // too defensive but secure way + if (!is_array($data)) { + return $data; + } elseif (!isset($data['idartlang'])) { + return $data; + } elseif (!isset($data['idart'])) { + return $data; + } + + $arr_art = ModRewrite::getArtIds($data['idartlang']); + if (count($arr_art) == 2) { + ModRewrite::setArtWebsafeName($arr_art["urlname"], $data['idart'], $arr_art["idlang"]); + } + + return $data; +} + + +/** + * Processes mod_rewrite related job for duplicated articles. + * + * Will be called by chain 'Contenido.Article.conCopyArtLang_AfterInsert'. + * + * @param array $data Assoziative array with record entries + * @return array Loop through of arguments + */ +function mr_conCopyArtLang($data) +{ + ModRewriteDebugger::log($data, 'mr_conCopyArtLang $data'); + + // too defensive but secure way + if (!is_array($data)) { + return $data; + } elseif (!isset($data['title'])) { + return $data; + } elseif (!isset($data['idart'])) { + return $data; + } elseif (!isset($data['idlang'])) { + return $data; + } + + ModRewrite::setArtWebsafeName($data['title'], $data['idart'], $data['idlang']); + + return $data; +} + + +/** + * Processes mod_rewrite related job for synchronized articles. + * + * Will be called by chain 'Contenido.Article.conSyncArticle_AfterInsert'. + * + * @param array $data Assoziative array with record entries as follows: + * + * array( + * 'src_art_lang' => Recordset (assoziative array) of source item from con_art_lang table + * 'dest_art_lang' => Recordset (assoziative array) of inserted destination item from con_art_lang table + * ); + * + * + * @return array Loop through of argument + */ +function mr_conSyncArticle($data) +{ + ModRewriteDebugger::log($data, 'mr_conSyncArticle $data'); + + // too defensive but secure way + if (!is_array($data)) { + return $data; + } elseif (!isset($data['src_art_lang']) || !is_array($data['src_art_lang'])) { + return $data; + } elseif (!isset($data['dest_art_lang']) || !is_array($data['dest_art_lang'])) { + return $data; + } elseif (!isset($data['dest_art_lang']['idart'])) { + return $data; + } elseif (!isset($data['dest_art_lang']['idlang'])) { + return $data; + } + + if (!isset($data['src_art_lang']['urlname'])) { + $artLang = new cApiArticleLanguage($data['src_art_lang']['idartlang']); + $urlname = $artLang->get('urlname'); + } else { + $urlname = $data['src_art_lang']['urlname']; + } + + if ($urlname) { + ModRewrite::setArtWebsafeName($urlname, $data['dest_art_lang']['idart'], $data['dest_art_lang']['idlang']); + } + + return $data; +} + + +/** + * Works as a wrapper for Contenido_Url. + * + * Will also be called by chain 'Contenido.Frontend.CreateURL'. + * + * @todo: Still exists bcause of downwards compatibility (some other modules/plugins are using it) + * + * @param string $url URL to rebuild + * @return string New URL + */ +function mr_buildNewUrl($url) +{ + global $lang; + + ModRewriteDebugger::add($url, 'mr_buildNewUrl() in -> $url'); + + $oUrl = Contenido_Url::getInstance(); + $aUrl = $oUrl->parse($url); + + // add language, if not exists + if (!isset($aUrl['params']['lang'])) { + $aUrl['params']['lang'] = $lang; + } + + // build url + $newUrl = $oUrl->build($aUrl['params']); + + // add existing fragment + if (isset($aUrl['fragment'])) { + $newUrl .= '#' . $aUrl['fragment']; + } + + $arr['in'] = $url; + $arr['out'] = $newUrl; + ModRewriteDebugger::add($arr, 'mr_buildNewUrl() in -> out'); + + return $newUrl; +} + + +/** + * Replaces existing ancors inside passed code, while rebuilding the urls. + * + * Will be called by chain 'Contenido.Content.conGenerateCode' or + * 'Contenido.Frontend.HTMLCodeOutput' depening on mod_rewrite settings. + * + * @param string $code Code to prepare + * @return string New code + */ +function mr_buildGeneratedCode($code) +{ + global $client, $cfgClient; + + ModRewriteDebugger::add($code, 'mr_buildGeneratedCode() in'); + + // mod rewrite is activated + if (ModRewrite::isEnabled()) { + $sseStarttime = getmicrotime(); + + // anchor hack + $code = preg_replace_callback( + "/]*)href\s*=\s*[\"|\'][\/]#(.?|.+?)[\"|\']([^>]*)>/i", + create_function('$arr_matches' , 'return ModRewrite::rewriteHtmlAnchor($arr_matches);'), + $code + ); + + // remove fucking tinymce single quote entities: + $code = str_replace("'", "'", $code); + + // get base uri + $sBaseUri = $cfgClient[$client]['path']['htmlpath']; + $sBaseUri = CEC_Hook::execute("Contenido.Frontend.BaseHrefGeneration", $sBaseUri); + + // IE hack with wrong base href interpretation + $code = preg_replace("/([\"|\'|=])upload\/(.?|.+?)([\"|\'|>])/ie", "stripslashes('\\1{$sBaseUri}upload/\\2\\3')", $code); + + // define some preparations to replace /front_content.php & ./front_content.php + // against front_content.php, because urls should start with front_content.php + $aPattern = array( + '/([\"|\'|=])\/front_content\.php(.?|.+?)([\"|\'|>])/i', + '/([\"|\'|=])\.\/front_content\.php(.?|.+?)([\"|\'|>])/i' + ); + + $aReplace = array( + '\1front_content.php\2\3', + '\1front_content.php\2\3' + ); + + // perform the pre replacements + $code = preg_replace($aPattern, $aReplace, $code); + + // create url stack object and fill it with found urls... + $oMRUrlStack = ModRewriteUrlStack::getInstance(); + $oMRUrlStack->add('front_content.php'); + + preg_match_all("/([\"|\'|=])front_content\.php(.?|.+?)([\"|\'|>])/i", $code, $matches, PREG_SET_ORDER); + foreach ($matches as $val) { + $oMRUrlStack->add('front_content.php' . $val[2]); + } + + // ok let it beginn, start mod rewrite class + $code = str_replace('"front_content.php"', '"' . mr_buildNewUrl('front_content.php') . '"', $code); + $code = str_replace("'front_content.php'", "'" . mr_buildNewUrl('front_content.php') . "'", $code); + $code = preg_replace_callback( + "/([\"|\'|=])front_content\.php(.?|.+?)([\"|\'|>])/i", + create_function('$aMatches' , 'return $aMatches[1] . mr_buildNewUrl("front_content.php" . $aMatches[2]) . $aMatches[3];'), + $code + ); + + ModRewriteDebugger::add($code, 'mr_buildGeneratedCode() out'); + + $sseEndtime = getmicrotime(); + } else { + // anchor hack for non modrewrite websites + $code = preg_replace_callback( + "/]*)href\s*=\s*[\"|\'][\/]#(.?|.+?)[\"|\']([^>]*)>/i", + create_function('$arr_matches' , 'return ModRewrite::contenidoHtmlAnchor($arr_matches, $GLOBALS["is_XHTML"]);'), + $code + ); + } + + ModRewriteDebugger::add(($sseEndtime - $sseStarttime), 'mr_buildGeneratedCode() total spend time'); + + if ($debug = mr_debugOutput(false)) { + $code = str_ireplace_once("", $debug . "\n", $code); + } + + return $code; + // print "\n\n"; +} + + +/** + * Sets language of client, like done in front_content.php + * + * @param int $client Client id + */ +function mr_setClientLanguageId($client) +{ + global $lang, $load_lang, $cfg; + + if ((int) $lang > 0) { + // there is nothing to do + return; + } elseif ($load_lang) { + // use the first language of this client, load_client is set in cms/config.php + $lang = $load_lang; + return; + } + + // try to get clients language from table + $sql = "SELECT B.idlang FROM " + . $cfg['tab']['clients_lang']." AS A, " + . $cfg['tab']['lang']." AS B " + . "WHERE " + . "A.idclient='" . ((int) $client) . "' AND A.idlang=B.idlang" + . "LIMIT 0,1"; + + if ($aData = mr_queryAndNextRecord($sql)) { + $lang = $aData['idlang']; + } +} + + +/** + * Loads Advanced Mod Rewrite configuration for passed client using serialized + * file containing the settings. + * + * File is placed in /contenido/mod_rewrite/includes/and is named like + * config.mod_rewrite_{client_id}.php. + * + * @param int $clientId Id of client + * @param bool $forceReload Flag to force to reload configuration, e. g. after + * done changes on it + */ +function mr_loadConfiguration($clientId, $forceReload = false) +{ + global $cfg; + static $aLoaded; + + $clientId = (int) $clientId; + if (!isset($aLoaded)) { + $aLoaded = array(); + } elseif (isset($aLoaded[$clientId]) && $forceReload == false) { + return; + } + + $mrConfig = mr_getConfiguration($clientId); + + if (is_array($mrConfig)) { + // merge mod rewrite configuration with global cfg array + $cfg = array_merge($cfg, $mrConfig); + } else { + // couldn't load configuration, set defaults + include_once($cfg['path']['contenido'] . $cfg['path']['plugins'] . 'mod_rewrite/includes/config.mod_rewrite_default.php'); + } + + $aLoaded[$clientId] = true; +} + + +/** + * Returns the mod rewrite configuration array of an client. + * + * File is placed in /contenido/mod_rewrite/includes/and is named like + * config.mod_rewrite_{client_id}.php. + * + * @param int $clientId Id of client + * @return array|null + */ +function mr_getConfiguration($clientId) +{ + global $cfg; + + + $file = $cfg['path']['config'] . 'config.mod_rewrite_' . $clientId . '.php'; + if (!is_file($file) || !is_readable($file)) { + $file = $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'mod_rewrite/includes/config.mod_rewrite_' . $clientId . '.php'; + if (!is_file($file) || !is_readable($file)) { + return null; + } else { + cWarning(__FILE__, __LINE__, "Configuration file of AMR-Plugin still using plugin folder, move it to data/config folder!"); + } + } + if ($content = file_get_contents($file)) { + return unserialize($content); + } else { + return null; + } +} + + +/** + * Saves the mod rewrite configuration array of an client. + * + * File is placed in /contenido/mod_rewrite/includes/and is named like + * config.mod_rewrite_{client_id}.php. + * + * @param int $clientId Id of client + * @param array $config Configuration to save + * @return bool + */ +function mr_setConfiguration($clientId, array $config) +{ + global $cfg; + + $file = $cfg['path']['config'] . 'config.mod_rewrite_' . $clientId . '.php'; + $result = file_put_contents($file, serialize($config), LOCK_EX); + return ($result) ? true : false; +} + + +/** + * Includes the frontend controller script which parses the url and extacts + * needed data like idcat, idart, lang and client from it. + * + * Will be called by chain 'Contenido.Frontend.AfterLoadPlugins' at front_content.php. + * + * @return bool Just a return value + */ +function mr_runFrontendController() +{ + $iStartTime = getmicrotime(); + + plugin_include('mod_rewrite', 'includes/config.plugin.php'); + + if (ModRewrite::isEnabled() == true) { + plugin_include('mod_rewrite', 'includes/front_content_controller.php'); + + $totalTime = sprintf('%.4f', (getmicrotime() - $iStartTime)); + ModRewriteDebugger::add($totalTime, 'mr_runFrontendController() total time'); + } + + return true; +} + + +/** + * Cleanups passed string from characters beeing repeated two or more times + * + * @param string $char Character to remove + * @param string $string String to clean from character + * @return string Cleaned string + */ +function mr_removeMultipleChars($char, $string) +{ + while (strpos($string, $char . $char) !== false) { + $string = str_replace($char . $char, $char, $string); + } + return $string; +} + + +/** + * Returns amr related translation text + * + * @param string $key The message id as string + * @return string Related message + */ +function mr_i18n($key) +{ + global $lngAMR; + return (is_array($lngAMR) && isset($lngAMR[$key])) ? $lngAMR[$key] : 'n. a.'; +} + +################################################################################ +### Some helper functions, which are not plugin specific + + +/** + * Database query helper. Used to execute a select statement and to return the + * result of first recordset. + * + * Minimizes following code: + * + * // default way + * $db = new DB_ConLite(); + * $sql = "SELECT * FROM foo WHERE bar='foobar'"; + * $db->query($sql); + * $db->next_record(); + * $data = $db->Record; + * + * // new way + * $sql = "SELECT * FROM foo WHERE bar='foobar'"; + * $data = mr_queryAndNextRecord($sql); + * + * + * @param string $query Query to execute + * @return mixed Assoziative array including recordset or null + */ +function mr_queryAndNextRecord($query) +{ + static $db; + if (!isset($db)) { + $db = new DB_ConLite(); + } + if (!$db->query($query)) { + return null; + } + return ($db->next_record()) ? $db->Record : null; +} + + +/** + * Returns value of an array key (assoziative or indexed). + * + * Shortcut function for some ways to access to arrays: + * + * // old way + * if (is_array($foo) && isset($foo['bar']) && $foo['bar'] == 'yieeha') { + * // do something + * } + * + * // new, more readable way: + * if (mr_arrayValue($foo, 'bar') == 'yieeha') { + * // do something + * } + * + * // old way + * if (is_array($foo) && isset($foo['bar'])) { + * $jep = $foo['bar']; + * } else { + * $jep = 'yummy'; + * } + * + * // new way + * $jep = mr_arrayValue($foo, 'bar', 'yummy'); + * + * + * @param array $array The array + * @param mixed $key Position of an indexed array or key of an assoziative array + * @param mixed $default Default value to return + * @return mixed Either the found value or the default value + */ +function mr_arrayValue($array, $key, $default = null) +{ + if (!is_array($array)) { + return $default; + } elseif (!isset($array[$key])) { + return $default; + } else { + return $array[$key]; + } +} + + +/** + * Request cleanup function. Request data is allways tainted and must be filtered. + * Pass the array to cleanup using several options. + * Emulates array_walk_recursive(). + * + * @param mixed $data Data to cleanup + * @param array $options Default options array, provides only 'filter' key with several + * filter functions which are to execute as follows: + * + * $options['filter'] = array('trim', 'myFilterFunc'); + * + * If no filter functions are set, 'trim', 'strip_tags' and 'stripslashes' + * will be used by default. + * A userdefined function must accept the value as a parameter and must return + * the filtered parameter, e. g. + * + * function myFilter($data) { + * // do what you want with the data, e. g. cleanup of xss content + * return $data; + * } + * + * + * @return mixed Cleaned data + */ +function mr_requestCleanup(&$data, $options = null) +{ + if (!mr_arrayValue($options, 'filter')) { + $options['filter'] = array('trim', 'strip_tags', 'stripslashes'); + } + + if (is_array($data)) { + foreach ($data as $p => $v) { + $data[$p] = mr_requestCleanup($v, $options); + } + } else { + foreach ($options['filter'] as $filter) { + if ($filter == 'trim') { + $data = trim($data); + } elseif ($filter == 'strip_tags') { + $data = strip_tags($data); + } elseif ($filter == 'stripslashes') { + $data = stripslashes($data); + } elseif (function_exists($filter)) { + $data = call_user_func($filter, $data); + } + } + } + return $data; +} + + +/** + * Minimalistic'n simple way to get request variables. + * + * Checks occurance in $_GET, then in $_POST. Uses trim() and strip_tags() to preclean data. + * + * @param string $key Name of var to get + * @param mixed $default Default value to return + * @return mixed The value + */ +function mr_getRequest($key, $default = null) +{ + static $cache; + if (!isset($cache)) { + $cache = array(); + } + if (isset($cache[$key])) { + return $cache[$key]; + } + if (isset($_GET[$key])) { + $val = $_GET[$key]; + } elseif (isset($_POST[$key])) { + $val = $_POST[$key]; + } else { + $val = $default; + } + $cache[$key] = strip_tags(trim($val)); + return $cache[$key]; +} + + +/** + * Replaces calling of header method for redirects in front_content.php, + * used during development. + * + * @param $header Header value for redirect + */ +function mr_header($header) +{ + header($header);return; + + $header = str_replace('Location: ', '', $header); + echo ' + + +

    '.$header.'

    '; + mr_debugOutput(); + echo ''; + exit(); +} + + +/** + * Debug output only during development + * + * @param bool $print Flag to echo the debug data + * @return mixed Either the debug data, if parameter $print is set to true, or nothing + */ +function mr_debugOutput($print = true) +{ + global $DB_Contenido_QueryCache; + if (isset($DB_Contenido_QueryCache) && is_array($DB_Contenido_QueryCache) && + count($DB_Contenido_QueryCache) > 0) { + ModRewriteDebugger::add($DB_Contenido_QueryCache, 'sql statements'); + + // calculate total time consumption of queries + $timeTotal = 0; + foreach ($DB_Contenido_QueryCache as $pos => $item) { + $timeTotal += $item['time']; + } + ModRewriteDebugger::add($timeTotal, 'sql total time'); + } + + $sOutput = ModRewriteDebugger::getAll(); + if ($print == true) { + echo $sOutput; + } else { + return $sOutput; + } +} diff --git a/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_content.php b/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_content.php new file mode 100644 index 0000000..e94359e --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_content.php @@ -0,0 +1,324 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2008-04-22 + * modified 2011-05-17 Murat Purc, added check for available client id + * + * $Id: include.mod_rewrite_content.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +################################################################################ +##### Initialization + +if ((int) $client <= 0) { + // if there is no client selected, display empty page + $oPage = new cPage(); + $sMsg = $notification->returnNotification( + Contenido_Notification::LEVEL_ERROR, i18n("No Client selected") + ); + $oPage->setContent($sMsg); + $oPage->render(); + return; +} + +plugin_include('mod_rewrite', 'classes/controller/class.modrewrite_content_controller.php'); + +$action = (isset($_REQUEST['mr_action'])) ? $_REQUEST['mr_action'] : 'index'; +$bDebug = false; + + +################################################################################ +##### Some variables + + +$oMrController = new ModRewrite_ContentController(); + +$aMrCfg = ModRewrite::getConfig(); + +// downwards compatibility to previous plugin versions +if (mr_arrayValue($aMrCfg, 'category_seperator', '') == '') { + $aMrCfg['category_seperator'] = '/'; +} +if (mr_arrayValue($aMrCfg, 'category_word_seperator', '') == '') { + $aMrCfg['category_word_seperator'] = '-'; +} +if (mr_arrayValue($aMrCfg, 'article_seperator', '') == '') { + $aMrCfg['article_seperator'] = '/'; +} +if (mr_arrayValue($aMrCfg, 'article_word_seperator', '') == '') { + $aMrCfg['article_word_seperator'] = '-'; +} + +// some settings +$aSeparator = array( + 'pattern' => '/^[\/\-_\.\$~]{1}$/', + 'info' => '/ - . _ ~' +); +$aWordSeparator = array( + 'pattern' => '/^[\-_\.\$~]{1}$/', + 'info' => '- . _ ~' +); + +$routingSeparator = '>>>'; + + +$oMrController->setProperty('bDebug', $bDebug); +$oMrController->setProperty('aSeparator', $aSeparator); +$oMrController->setProperty('aWordSeparator', $aWordSeparator); +$oMrController->setProperty('routingSeparator', $routingSeparator); + +// define basic data contents (used for template) +$oView = $oMrController->getView(); +$oView->content_before = ''; +$oView->idclient = $client; +$oView->use_chk = (ModRewrite::isEnabled()) ? ' checked="checked"' : ''; + +// mr copy .htaccess +$aHtaccessInfo = ModRewrite::getHtaccessInfo(); + +if ($aHtaccessInfo['has_htaccess']) { + $oView->htaccess_info_css = 'display:none;'; +} else { + $oView->htaccess_info_css = 'display:table-row;'; +} + +// mr root dir +$oView->rootdir = $aMrCfg['rootdir']; +$oView->rootdir_error = ''; + +// mr check root dir +$oView->checkrootdir_chk = ($aMrCfg['checkrootdir'] == 1) ? ' checked="checked"' : ''; + +// mr start from root +$oView->startfromroot_chk = ($aMrCfg['startfromroot'] == 1) ? ' checked="checked"' : ''; + +// mr prevent duplicated content +$oView->prevent_duplicated_content_chk = ($aMrCfg['prevent_duplicated_content'] == 1) ? ' checked="checked"' : ''; + +// mr language usage +$oView->use_language_chk = ($aMrCfg['use_language'] == 1) ? ' checked="checked"' : ''; +$oView->use_language_name_chk = ($aMrCfg['use_language_name'] == 1) ? ' checked="checked"' : ''; +$oView->use_language_name_disabled = ($aMrCfg['use_language'] == 1) ? '' : ' disabled="disabled"'; + +// mr client usage +$oView->use_client_chk = ($aMrCfg['use_client'] == 1) ? ' checked="checked"' : ''; +$oView->use_client_name_chk = ($aMrCfg['use_client_name'] == 1) ? ' checked="checked"' : ''; +$oView->use_client_name_disabled = ($aMrCfg['use_client'] == 1) ? '' : ' disabled="disabled"'; + +// mr lowecase uri +$oView->use_lowercase_uri_chk = ($aMrCfg['use_lowercase_uri'] == 1) ? ' checked="checked"' : ''; + +// mr category/category word separator +$oView->category_separator = $aMrCfg['category_seperator']; +$oView->category_separator_attrib = ''; +$oView->category_word_separator = $aMrCfg['category_word_seperator']; +$oView->category_word_separator_attrib = ''; +$oView->category_separator_error = ''; +$oView->category_word_separator_error = ''; + +// mr article/article word separator +$oView->article_separator = $aMrCfg['article_seperator']; +$oView->article_separator_attrib = ''; +$oView->article_word_separator = $aMrCfg['article_word_seperator']; +$oView->article_word_separator_attrib = ''; +$oView->article_separator_error = ''; +$oView->article_word_separator_error = ''; + +// mr file extension +$oView->file_extension = $aMrCfg['file_extension']; +$oView->file_extension_error = ''; + +// mr category name resolve percentage +$oView->category_resolve_min_percentage = $aMrCfg['category_resolve_min_percentage']; +$oView->category_resolve_min_percentage_error = ''; + +// mr add start article name to url +$oView->add_startart_name_to_url_chk = ($aMrCfg['add_startart_name_to_url'] == 1) ? ' checked="checked"' : ''; +$oView->add_startart_name_to_url_error = ''; +$oView->default_startart_name = $aMrCfg['default_startart_name']; + +// mr rewrite urls at +$oView->rewrite_urls_at_congeneratecode_chk = ($aMrCfg['rewrite_urls_at_congeneratecode'] == 1) ? ' checked="checked"' : ''; +$oView->rewrite_urls_at_front_content_output_chk = ($aMrCfg['rewrite_urls_at_front_content_output'] == 1) ? ' checked="checked"' : ''; +$oView->content_after = ''; + +// mr rewrite routing +$data = ''; +if (is_array($aMrCfg['routing'])) { + foreach ($aMrCfg['routing'] as $uri => $route){ + $data .= $uri . $routingSeparator . $route . "\n"; + } +} +$oView->rewrite_routing = $data; + +// mr redirect invalid article +$oView->redirect_invalid_article_to_errorsite_chk = ($aMrCfg['redirect_invalid_article_to_errorsite'] == 1) ? ' checked="checked"' : ''; + + +$oView->lng_version = i18n('Version', 'mod_rewrite'); +$oView->lng_author = i18n('Author', 'mod_rewrite'); +$oView->lng_mail_to_author = i18n('E-Mail to author', 'mod_rewrite'); +$oView->lng_pluginpage = i18n('Plugin page', 'mod_rewrite'); +$oView->lng_visit_pluginpage = i18n('Visit plugin page', 'mod_rewrite'); +$oView->lng_opens_in_new_window = i18n('opens page in new window', 'mod_rewrite'); +$oView->lng_contenido_forum = i18n('Contenido forum', 'mod_rewrite'); +$oView->lng_pluginthread_in_contenido_forum = i18n('Plugin thread in Contenido forum', 'mod_rewrite'); +$oView->lng_plugin_settings = i18n('Plugin settings', 'mod_rewrite'); +$oView->lng_note = i18n('Note', 'mod_rewrite'); + +$sMsg = i18n('The .htaccess file could not found either in Contenido installation directory nor in client directory.
    It should set up in %sFunctions%s area, if needed.', 'mod_rewrite'); +$oView->lng_msg_no_htaccess_found = sprintf($sMsg, '', ''); + +$oView->lng_enable_amr = i18n('Enable Advanced Mod Rewrite', 'mod_rewrite'); + +$oView->lng_msg_enable_amr_info = i18n('Disabling of plugin does not result in disabling mod rewrite module of the web server - This means,
    all defined rules in the .htaccess are still active and could create unwanted side effects.

    Apache mod rewrite could be enabled/disabled by setting the RewriteEngine directive.
    Any defined rewrite rules could remain in the .htaccess and they will not processed,
    if the mod rewrite module is disabled', 'mod_rewrite'); + +$oView->lng_example = i18n('Example', 'mod_rewrite'); + +$oView->lng_msg_enable_amr_info_example = i18n("# enable apache mod rewrite module\nRewriteEngine on\n\n# disable apache mod rewrite module\nRewriteEngine off", 'mod_rewrite'); + +$oView->lng_rootdir = i18n('Path to .htaccess from DocumentRoot', 'mod_rewrite'); +$oView->lng_rootdir_info = i18n("Type '/' if the .htaccess file lies inside the wwwroot (DocumentRoot) folder.
    Type the path to the subfolder fromm wwwroot, if Contenido is installed in a subfolder within the wwwroot
    (e. g. http://domain/mycontenido -> path = '/mycontenido/')", 'mod_rewrite'); + +$oView->lng_checkrootdir = i18n('Check path to .htaccess', 'mod_rewrite'); +$oView->lng_checkrootdir_info = i18n('The path will be checked, if this option is enabled.
    But this could result in an error in some cases, even if the specified path is valid and
    clients DocumentRoot differs from Contenido backend DocumentRoot.', 'mod_rewrite'); + +$oView->lng_startfromroot = i18n('Should the name of root category be displayed in the URL?', 'mod_rewrite'); +$oView->lng_startfromroot_lbl = i18n('Start from root category', 'mod_rewrite'); +$oView->lng_startfromroot_info = i18n('If enabled, the name of the root category (e. g. "Mainnavigation" in a Contenido default installation), will be preceded to the URL.', 'mod_rewrite'); + +$oView->lng_use_client = i18n('Are several clients maintained in one directory?', 'mod_rewrite'); +$oView->lng_use_client_lbl = i18n('Prepend client to the URL', 'mod_rewrite'); +$oView->lng_use_client_name_lbl = i18n('Use client name instead of the id', 'mod_rewrite'); + +$oView->lng_use_language = i18n('Should the language appear in the URL (required for multi language websites)?', 'mod_rewrite'); +$oView->lng_use_language_lbl = i18n('Prepend language to the URL', 'mod_rewrite'); +$oView->lng_use_language_name_lbl = i18n('Use language name instead of the id', 'mod_rewrite'); + +$oView->lng_userdefined_separators_header = i18n('Configure your own separators with following 4 settings
    to control generated URLs to your own taste', 'mod_rewrite'); +$oView->lng_userdefined_separators_example = i18n("www.domain.com/category1-category2.articlename.html\nwww.domain.com/category1/category2-articlename.html\nwww.domain.com/category.name1~category2~articlename.html\nwww.domain.com/category_name1-category2-articlename.foo", 'mod_rewrite'); +$oView->lng_userdefined_separators_example_a = i18n('Category separator has to be different from category-word separator', 'mod_rewrite'); +$oView->lng_userdefined_separators_example_a_example = i18n("# Example: Category separator (/) and category-word separator (_)\ncategory_one/category_two/articlename.html", 'mod_rewrite'); +$oView->lng_userdefined_separators_example_b = i18n('Category separator has to be different from article-word separator', 'mod_rewrite'); +$oView->lng_userdefined_separators_example_b_example = i18n("# Example: Category separator (/) and article-word separator (-)\ncategory_one/category_two/article-description.html", 'mod_rewrite'); +$oView->lng_userdefined_separators_example_c = i18n('Category-article separator has to be different from article-word separator', 'mod_rewrite'); +$oView->lng_userdefined_separators_example_c_example = i18n("# Example: Category-article separator (/) and article-word separator (-)\ncategory_one/category_two/article-description.html", 'mod_rewrite'); + +$oView->lng_category_separator = i18n('Category separator (delemiter between single categories)', 'mod_rewrite'); +$oView->lng_catart_separator_info = sprintf(i18n('(possible values: %s)', 'mod_rewrite'), $aSeparator['info']); +$oView->lng_word_separator_info = sprintf(i18n('(possible values: %s)', 'mod_rewrite'), $aWordSeparator['info']); +$oView->lng_category_word_separator = i18n('Category-word separator (delemiter between category words)', 'mod_rewrite'); +$oView->lng_article_separator = i18n('Category-article separator (delemiter between category-block and article)', 'mod_rewrite'); +$oView->lng_article_word_separator = i18n('Article-word separator (delemiter between article words)', 'mod_rewrite'); + +$oView->lng_add_startart_name_to_url = i18n('Append article name to URLs', 'mod_rewrite'); +$oView->lng_add_startart_name_to_url_lbl = i18n('Append article name always to URLs (even at URLs to categories)', 'mod_rewrite'); +$oView->lng_default_startart_name = i18n('Default article name without extension', 'mod_rewrite'); +$oView->lng_default_startart_name_info = i18n('e. g. "index" for index.ext
    In case of selected "Append article name always to URLs" option and a empty field,
    the name of the start article will be used', 'mod_rewrite'); + +$oView->lng_file_extension = i18n('File extension at the end of the URL', 'mod_rewrite'); +$oView->lng_file_extension_info = i18n('Specification of file extension with a preceded dot
    e.g. ".html" for http://host/foo/bar.html', 'mod_rewrite'); +$oView->lng_file_extension_info2 = i18n('It\'s strongly recommended to specify a extension here,
    if the option "Append article name always to URLs" was not selected.

    Otherwise URLs to categories and articles would have the same format
    which may result in unresolvable categories/articles in some cases.', 'mod_rewrite'); +$oView->lng_file_extension_info3 = i18n('It\'s necessary to specify a file extension at the moment, due do existing issues, which are not solved until yet. An not defined extension may result in invalid article detection in some cases.', 'mod_rewrite'); + +$oView->lng_use_lowercase_uri = i18n('Should the URLs be written in lower case?', 'mod_rewrite'); +$oView->lng_use_lowercase_uri_lbl = i18n('URLs in lower case', 'mod_rewrite'); + +$oView->lng_prevent_duplicated_content = i18n('Duplicated content', 'mod_rewrite'); +$oView->lng_prevent_duplicated_content_lbl = i18n('Prevent duplicated content', 'mod_rewrite'); + +$oView->lng_prevent_duplicated_content_info = i18n('Depending on configuration, pages could be found thru different URLs.
    Enabling of this option prevents this. Examples for duplicated content', 'mod_rewrite'); +$oView->lng_prevent_duplicated_content_info2 = i18n("Name of the root category in the URL: Feasible is /maincategory/subcategory/ and /subcategory/\nLanguage in the URL: Feasible is /german/category/ and /1/category/\nClient in the URL: Feasible is /client/category/ und /1/category/", 'mod_rewrite'); +$oView->lng_prevent_duplicated_content_info2 = '
  • ' . str_replace("\n", '
  • ', $oView->lng_prevent_duplicated_content_info2) . '
  • '; + +$oView->lng_category_resolve_min_percentage = i18n('Percentage for similar category paths in URLs', 'mod_rewrite'); +$oView->lng_category_resolve_min_percentage_info = i18n('This setting refers only to the category path of a URL. If AMR is configured
    to prepend e. g. the root category, language and/or client to the URL,
    the specified percentage will not applied to those parts of the URL.
    A incoming URL will be cleaned from those values and the remaining path (urlpath of the category)
    will be checked against similarities.', 'mod_rewrite'); +$oView->lng_category_resolve_min_percentage_example = i18n("100 = exact match with no tolerance\n85 = paths with little errors will match to similar ones\n0 = matching will work even for total wrong paths", 'mod_rewrite'); + +$oView->lng_redirect_invalid_article_to_errorsite = i18n('Redirect in case of invalid articles', 'mod_rewrite'); +$oView->lng_redirect_invalid_article_to_errorsite_lbl = i18n('Redirect to error page in case of invaid articles', 'mod_rewrite'); +$oView->lng_redirect_invalid_article_to_errorsite_info = i18n('The start page will be displayed if this option is not enabled', 'mod_rewrite'); + +$oView->lng_rewrite_urls_at = i18n('Moment of URL generation', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_front_content_output_lbl = i18n('a.) During the output of HTML code of the page', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_front_content_output_info = i18n('Clean-URLs will be generated during page output. Modules/Plugins are able to generate URLs to frontend
    as usual as in previous Contenido versions using a format like "front_content.php?idcat=1&idart=2".
    The URLs will be replaced by the plugin to Clean-URLs before sending the HTML output.', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_front_content_output_info2 = i18n('Differences to variant b.)', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_front_content_output_info3 = i18n("Still compatible to old modules/plugins, since no changes in codes are required\nAll occurring URLs in HTML code, even those set by wysiwyg, will be switched to Clean-URLs\nAll URLs will usually be collected and converted to Clean-URLs at once.
    Doing it this way reduces the amount of executed database significantly.", 'mod_rewrite'); +$oView->lng_rewrite_urls_at_front_content_output_info3 = '
  • ' . str_replace("\n", '
  • ', $oView->rewrite_urls_at_front_content_output_info3) . '
  • '; + +$oView->lng_rewrite_urls_at_congeneratecode_lbl = i18n('b.) In modules or plugins', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_congeneratecode_info = i18n('By using this option, all Clean-URLs will be generated directly in module or plugins.
    This means, all areas in modules/plugins, who generate internal URLs to categories/articles, have to be adapted manually.
    All Clean-URLs have to be generated by using following function:', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_congeneratecode_example = i18n("# structure of a normal url\n\$url = 'front_content.php?idart=123&lang=2&client=1';\n\n# creation of a url by using the Contenidos Url-Builder (since 4.8.9),\n# wich expects the parameter as a assoziative array\n\$params = array('idart'=>123, 'lang'=>2, 'client'=>1);\n\$newUrl = Contenido_Url::getInstance()->build(\$params);", 'mod_rewrite'); +$oView->lng_rewrite_urls_at_congeneratecode_info2 = i18n('Differences to variant a.)', 'mod_rewrite'); +$oView->lng_rewrite_urls_at_congeneratecode_info3 = i18n("The default way to generate URLs to fronend pages\nEach URL in modules/plugins has to be generated by UrlBuilder\nEach generated Clean-Url requires a database query", 'mod_rewrite'); +$oView->lng_rewrite_urls_at_congeneratecode_info3 = '
  • ' . str_replace("\n", '
  • ', $oView->lng_rewrite_urls_at_congeneratecode_info3) . '
  • '; + +$oView->lng_rewrite_routing = i18n('Routing', 'mod_rewrite'); +$oView->lng_rewrite_routing_info = i18n('Routing definitions for incoming URLs', 'mod_rewrite'); +$oView->lng_rewrite_routing_info2 = i18n('Type one routing definition per line as follows:', 'mod_rewrite'); +$oView->lng_rewrite_routing_example = i18n("# {incoming_url}>>>{new_url}\n/incoming_url/name.html>>>new_url/new_name.html\n\n# route a specific incoming url to a new page\n/campaign/20_percent_on_everything_except_animal_food.html>>>front_content.php?idcat=23\n\n# route request to wwwroot to a specific page\n/>>>front_content.php?idart=16", 'mod_rewrite'); +$oView->lng_rewrite_routing_info3 = i18n("The routing does not sends a HTTP header redirection to the destination URL, the redirection will happen internally by
    replacing the detected incoming URL against the new destination URL (overwriting of article- categoryid)\nIncoming URLs can point to non existing resources (category/article), but the desttination URLs should point
    to valid Contenido articles/categories\nDestination URLs should point to real URLs to categories/articles,
    e. g.front_content.php?idcat=23 or front_content.php?idart=34\nThe language id should attached to the URL in multi language sites
    e. g. front_content.php?idcat=23&lang=1\nThe client id should attached to the URL in multi client sites sharing the same folder
    e. g. front_content.php?idcat=23&client=2\nThe destination URL should not start with '/' or './' (wrong: /front_content.php, correct: front_content.php)", 'mod_rewrite'); +$oView->lng_rewrite_routing_info3 = '
  • ' . str_replace("\n", '
  • ', $oView->lng_rewrite_routing_info3) . '
  • '; + +$oView->lng_discard_changes = i18n('Discard changes', 'mod_rewrite'); +$oView->lng_save_changes = i18n('Save changes', 'mod_rewrite'); + + +################################################################################ +##### Action processing + +if ($action == 'index') { + + $oMrController->indexAction(); + +} elseif ($action == 'save') { + + $oMrController->saveAction(); + +} elseif ($action == 'reset') { + + $oMrController->resetAction(); + +} elseif ($action == 'resetempty') { + + $oMrController->resetEmptyAction(); + +} else { + + $oMrController->indexAction(); + +} + + +################################################################################ +##### Output + +$oMrController->render( + $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'mod_rewrite/templates/content.html' +); + diff --git a/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contentexpert.php b/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contentexpert.php new file mode 100644 index 0000000..1e28988 --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contentexpert.php @@ -0,0 +1,169 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * modified 2011-05-17 Murat Purc, added check for available client id + * + * $Id: include.mod_rewrite_contentexpert.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +################################################################################ +##### Initialization + +if ((int) $client <= 0) { + // if there is no client selected, display empty page + $oPage = new cPage(); + $sMsg = $notification->returnNotification( + Contenido_Notification::LEVEL_ERROR, i18n("No Client selected") + ); + $oPage->setContent($sMsg); + $oPage->render(); + return; +} + +plugin_include('mod_rewrite', 'classes/controller/class.modrewrite_contentexpert_controller.php'); + +$action = (isset($_REQUEST['mr_action'])) ? $_REQUEST['mr_action'] : 'index'; +$debug = false; + + +################################################################################ +##### Some variables + + +$oMrController = new ModRewrite_ContentExpertController(); + +$aMrCfg = ModRewrite::getConfig(); + +$aHtaccessInfo = ModRewrite::getHtaccessInfo(); + +// define basic data contents (used for template) +$oView = $oMrController->getView(); + +// view variables +$oView->copy_htaccess_css = 'display:table-row;'; +$oView->copy_htaccess_error = ''; +$oView->copy_htaccess_contenido_chk = ' checked="checked"'; +$oView->copy_htaccess_cms_chk = ''; +$oView->contenido_full_path = $aHtaccessInfo['contenido_full_path']; +$oView->client_full_path = $aHtaccessInfo['client_full_path']; +$oView->content_after = ''; + +$oMrController->setProperty('htaccessInfo', $aHtaccessInfo); + +// view language variables +$oView->lng_plugin_functions = i18n('Plugin functions', 'mod_rewrite'); + +$oView->lng_copy_htaccess_type = i18n('Copy/Download .htaccess template', 'mod_rewrite'); +$oView->lng_copy_htaccess_type_lbl = i18n('Select .htaccess template', 'mod_rewrite'); +$oView->lng_copy_htaccess_type1 = i18n('Restrictive .htaccess', 'mod_rewrite'); +$oView->lng_copy_htaccess_type2 = i18n('Simple .htaccess', 'mod_rewrite'); +$oView->lng_copy_htaccess_type_info1 = i18n('Contains rules with restrictive settings.
    +All requests pointing to extension avi, css, doc, flv, gif, gzip, ico, jpeg, jpg, js, mov,
    +mp3, pdf, png, ppt, rar, txt, wav, wmv, xml, zip, will be excluded vom rewriting.
    +Remaining requests will be rewritten to front_content.php,
    +except requests to \'contenido/\', \'setup/\', \'cms/upload\', \'cms/front_content.php\', etc.
    +Each resource, which has to be excluded from rewriting must be specified explicitly.', 'mod_rewrite'); + +$oView->lng_copy_htaccess_type_info2 = i18n('Contains a sipmle collection of rules. Each requests pointing to valid symlinks, folders or
    +files, will be excluded from rewriting. Remaining requests will be rewritten to front_content.php', 'mod_rewrite'); + +$oView->lng_copy_htaccess_to = i18n('and copy to', 'mod_rewrite'); +$oView->lng_copy_htaccess_to_contenido = i18n('Contenido installation directory', 'mod_rewrite'); +$oView->lng_copy_htaccess_to_contenido_info = i18n('Copy the selected .htaccess template into Contenido installation directory
    +
    +    {CONTENIDO_FULL_PATH}.
    +
    +This is the recommended option for a Contenido installation with one or more clients
    +who are running on the same domain.', 'mod_rewrite'); +$oView->lng_copy_htaccess_to_contenido_info = str_replace('{CONTENIDO_FULL_PATH}', $oView->contenido_full_path, $oView->lng_copy_htaccess_to_contenido_info); +$oView->lng_copy_htaccess_to_client = i18n('client directory', 'mod_rewrite'); +$oView->lng_copy_htaccess_to_client_info = i18n('Copy the selected .htaccess template into client\'s directory
    +
    +    {CLIENT_FULL_PATH}.
    +
    +This is the recommended option for a multiple client system
    +where each client has it\'s own domain/subdomain', 'mod_rewrite'); +$oView->lng_copy_htaccess_to_client_info = str_replace('{CLIENT_FULL_PATH}', $oView->client_full_path, $oView->lng_copy_htaccess_to_client_info); +$oView->lng_or = i18n('or', 'mod_rewrite'); +$oView->lng_download = i18n('Download', 'mod_rewrite'); +$oView->lng_download_info = i18n('Download selected .htaccess template to copy it to the destination folder
    +or to take over the settings manually.', 'mod_rewrite'); + +$oView->lng_resetaliases = i18n('Reset category-/ and article aliases', 'mod_rewrite'); +$oView->lng_resetempty_link = i18n('Reset only empty aliases', 'mod_rewrite'); +$oView->lng_resetempty_info = i18n('Only empty aliases will be reset, existing aliases, e. g. manually set aliases, will not be changed.', 'mod_rewrite'); +$oView->lng_resetall_link = i18n('Reset all aliases', 'mod_rewrite'); +$oView->lng_resetall_info = i18n('Reset all category-/article aliases. Existing aliases will be overwritten.', 'mod_rewrite'); +$oView->lng_note = i18n('Note', 'mod_rewrite'); +$oView->lng_resetaliases_note = i18n('This process could require some time depending on amount of categories/articles.
    +The aliases will not contain the configured plugin separators, but the Contenido default separators \'/\' und \'-\', e. g. \'/category-word/article-word\'.
    +Execution of this function ma be helpful to prepare all or empty aliases for the usage by the plugin.', 'mod_rewrite'); + +$oView->lng_discard_changes = i18n('Discard changes', 'mod_rewrite'); +$oView->lng_save_changes = i18n('Save changes', 'mod_rewrite'); + + +################################################################################ +##### Action processing + +if ($action == 'index') { + + $oMrController->indexAction(); + +} elseif ($action == 'copyhtaccess') { + + $oMrController->copyHtaccessAction(); + +} elseif ($action == 'downloadhtaccess') { + + $oMrController->downloadHtaccessAction(); + exit(); + +} elseif ($action == 'reset') { + + $oMrController->resetAction(); + +} elseif ($action == 'resetempty') { + + $oMrController->resetEmptyAction(); + +} else { + + $oMrController->indexAction(); + +} + + +################################################################################ +##### Output + +$oMrController->render( + $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'mod_rewrite/templates/contentexpert.html' +); + diff --git a/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contenttest.php b/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contenttest.php new file mode 100644 index 0000000..8588504 --- /dev/null +++ b/conlite/plugins/mod_rewrite/includes/include.mod_rewrite_contenttest.php @@ -0,0 +1,108 @@ + + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * modified 2011-05-17 Murat Purc, added check for available client id + * + * $Id: include.mod_rewrite_contenttest.php 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +defined('CON_FRAMEWORK') or die('Illegal call'); + + +################################################################################ +##### Initialization + +if ((int) $client <= 0) { + // if there is no client selected, display empty page + $oPage = new cPage(); + $sMsg = $notification->returnNotification( + Contenido_Notification::LEVEL_ERROR, i18n("No Client selected") + ); + $oPage->setContent($sMsg); + $oPage->render(); + return; +} + +plugin_include('mod_rewrite', 'classes/controller/class.modrewrite_contenttest_controller.php'); + + +################################################################################ +##### Processing + +$mrTestNoOptionSelected = false; +if (!mr_getRequest('idart') && !mr_getRequest('idcat') && !mr_getRequest('idcatart') && !mr_getRequest('idartlang')) { + $mrTestNoOptionSelected = true; +} + + +$oMrTestController = new ModRewrite_ContentTestController(); + + +// view language variables +$oView = $oMrTestController->getView(); +$oView->lng_form_info = i18n('Define options to genereate the URLs by using the form below and run the test.', 'mod_rewrite'); +$oView->lng_form_label = i18n('Parameter to use', 'mod_rewrite'); +$oView->lng_maxitems_lbl = i18n('Number of URLs to generate', 'mod_rewrite'); +$oView->lng_run_test = i18n('Run test', 'mod_rewrite'); + +$oView->lng_result_item_tpl = i18n('{pref}{name} +{pref}Builder in: {url_in} +{pref}Builder out: {url_out} +{pref}Resolved URL: {url_res} +{pref}Resolved data: {data}', 'mod_rewrite'); + +$oView->lng_result_message_tpl = i18n('Duration of test run: {time} seconds.
    +Number of processed URLs: {num_urls}
    +Successful resolved: {num_success}
    +Errors during resolving: {num_fail}', 'mod_rewrite'); + + +################################################################################ +##### Action processing + +if ($mrTestNoOptionSelected) { + $oMrTestController->indexAction(); +} else { + $oMrTestController->testAction(); +} + +$oView = $oMrTestController->getView(); +$oView->content .= mr_debugOutput(false); + + +################################################################################ +##### Output + +$oMrTestController->render( + $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'mod_rewrite/templates/contenttest.html' +); diff --git a/conlite/plugins/mod_rewrite/locale/de_DE/LC_MESSAGES/mod_rewrite.mo b/conlite/plugins/mod_rewrite/locale/de_DE/LC_MESSAGES/mod_rewrite.mo new file mode 100644 index 0000000000000000000000000000000000000000..9ce6db757b8781c957959632c07d03387bd02858 GIT binary patch literal 29426 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\n" +"Language-Team: Murat Purc \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: ../../../../\n" +"X-Poedit-KeywordsList: i18n\n" +"X-Poedit-SourceCharset: iso-8859-1\n" +"X-Generator: Poedit 1.5.7\n" +"X-Poedit-SearchPath-0: mod_rewrite\n" + +#: classes/controller/class.modrewrite_controller_abstract.php:73 +msgid "More informations" +msgstr "Weitere Informationen" + +#: classes/controller/class.modrewrite_content_controller.php:72 +msgid "" +"The root directory has a invalid format, alowed are the chars [a-zA-Z0-9\\-_" +"\\/\\.]" +msgstr "" +"Das Rootverzeichnis hat ein ungültiges Format, erlaubt sind die Zeichen " +"[a-zA-Z0-9\\-_\\/\\.]" + +#: classes/controller/class.modrewrite_content_controller.php:79 +#, php-format +msgid "The specified directory \"%s\" does not exists" +msgstr "Das angegebene Verzeichnis \"%s\" existiert nicht" + +#: classes/controller/class.modrewrite_content_controller.php:86 +#, php-format +msgid "" +"The specified directory \"%s\" does not exists in DOCUMENT_ROOT \"%s\". this " +"could happen, if clients DOCUMENT_ROOT differs from Contenido backends " +"DOCUMENT_ROOT. However, the setting will be taken over because of disabled " +"check." +msgstr "" +"Das angegebene Verzeichnis \"%s\" existiert nicht im DOCUMENT_ROOT \"%s\". " +"Das kann vorkommen, wenn das DOCUMENT_ROOT des Mandanten vom Contenido " +"Backend DOCUMENT_ROOT abweicht. Die Einstellung wird dennoch ü" +"bernommen, da die Überprüfung abgeschaltet wurde." + +#: classes/controller/class.modrewrite_content_controller.php:189 +#, php-format +msgid "Please specify separator (%s) for category" +msgstr "Bitte Trenner (%s) für Kategoriewörter angeben" + +#: classes/controller/class.modrewrite_content_controller.php:194 +#, php-format +msgid "Invalid separator for category, allowed one of following characters: %s" +msgstr "" +"Trenner für Kategorie ist ungültig, erlaubt ist eines der Zeichen: " +"%s" + +#: classes/controller/class.modrewrite_content_controller.php:201 +#, php-format +msgid "Please specify separator (%s) for category words" +msgstr "Bitte Trenner (%s) für Kategorie angeben" + +#: classes/controller/class.modrewrite_content_controller.php:206 +#, php-format +msgid "" +"Invalid separator for category words, allowed one of following characters: %s" +msgstr "" +"Trenner für Kategorie ist ungültig, erlaubt ist eines der Zeichen: " +"%s" + +#: classes/controller/class.modrewrite_content_controller.php:213 +#, php-format +msgid "Please specify separator (%s) for article" +msgstr "Bitte Trenner (%s) für Kategoriewörter angeben" + +#: classes/controller/class.modrewrite_content_controller.php:218 +#, php-format +msgid "" +"Invalid separator for article, allowed is one of following characters: %s" +msgstr "" +"Trenner für Kategorie ist ungültig, erlaubt ist eines der Zeichen: " +"%s" + +#: classes/controller/class.modrewrite_content_controller.php:225 +#, php-format +msgid "Please specify separator (%s) for article words" +msgstr "Bitte Trenner (%s) für Kategorie angeben" + +#: classes/controller/class.modrewrite_content_controller.php:230 +#, php-format +msgid "" +"Invalid separator for article words, allowed is one of following characters: " +"%s" +msgstr "" +"Trenner für Kategorie ist ungültig, erlaubt ist eines der Zeichen: " +"%s" + +#: classes/controller/class.modrewrite_content_controller.php:237 +msgid "Separator for category and category words must not be identical" +msgstr "" +"Trenner für Kategorie und Kategoriewörter dürfen nicht " +"identisch sein" + +#: classes/controller/class.modrewrite_content_controller.php:242 +msgid "Separator for category and article words must not be identical" +msgstr "Separator for category and article words must not be identical" + +#: classes/controller/class.modrewrite_content_controller.php:247 +msgid "Separator for category-article and article words must not be identical" +msgstr "" +"Trenner für Kategorie-Artikel und Artikelwörter dürfen nicht " +"identisch sein" + +#: classes/controller/class.modrewrite_content_controller.php:264 +msgid "" +"The file extension has a invalid format, allowed are the chars \\.([a-zA-" +"Z0-9\\-_\\/])" +msgstr "" +"Das Rootverzeichnis hat ein ungültiges Format, erlaubt sind die Zeichen " +"[a-zA-Z0-9\\-_\\/\\.]" + +#: classes/controller/class.modrewrite_content_controller.php:278 +msgid "Value has to be numeric." +msgstr "Wert muss numerisch sein." + +#: classes/controller/class.modrewrite_content_controller.php:282 +msgid "Value has to be between 0 an 100." +msgstr "Wert muss zwischen 0 und 100 sein." + +#: classes/controller/class.modrewrite_content_controller.php:299 +msgid "" +"The article name has a invalid format, allowed are the chars /^[a-zA-Z0-9\\-_" +"\\/\\.]*$/" +msgstr "" +"Das Rootverzeichnis hat ein ungültiges Format, erlaubt sind die Zeichen " +"[a-zA-Z0-9\\-_\\/\\.]" + +#: classes/controller/class.modrewrite_content_controller.php:362 +msgid "Please check your input" +msgstr "Bitte überprüfen Sie ihre Eingaben" + +#: classes/controller/class.modrewrite_content_controller.php:370 +msgid "Configuration has not been saved, because of enabled debugging" +msgstr "Konfiguration wurde nicht gespeichert, weil debugging aktiv ist" + +#: classes/controller/class.modrewrite_content_controller.php:384 +#, php-format +msgid "Configuration could not saved. Please check write permissions for %s " +msgstr "" +"Konfiguration konnte nicht gespeichert werden. Überprüfen Sie " +"bitte die Schreibrechte für %s" + +#: includes/include.mod_rewrite_content.php:42 +#: includes/include.mod_rewrite_contenttest.php:49 +#: includes/include.mod_rewrite_contentexpert.php:42 +msgid "No Client selected" +msgstr "Kein Mandant ausgewählt" + +#: includes/include.mod_rewrite_content.php:183 +msgid "Version" +msgstr "Version" + +#: includes/include.mod_rewrite_content.php:184 +msgid "Author" +msgstr "Autor" + +#: includes/include.mod_rewrite_content.php:185 +msgid "E-Mail to author" +msgstr "E-Mail an Autor" + +#: includes/include.mod_rewrite_content.php:186 +msgid "Plugin page" +msgstr "Pluginseite" + +#: includes/include.mod_rewrite_content.php:187 +msgid "Visit plugin page" +msgstr "Pluginseite besuchen" + +#: includes/include.mod_rewrite_content.php:188 +msgid "opens page in new window" +msgstr "öffnet Seite in einem neuen Fenster" + +#: includes/include.mod_rewrite_content.php:189 +msgid "Contenido forum" +msgstr "Contenido Forum" + +#: includes/include.mod_rewrite_content.php:190 +msgid "Plugin thread in Contenido forum" +msgstr "Pluginbeitrag im Contenido Forum" + +#: includes/include.mod_rewrite_content.php:191 +msgid "Plugin settings" +msgstr "Plugineinstellungen" + +#: includes/include.mod_rewrite_content.php:192 +#: includes/include.mod_rewrite_contentexpert.php:123 +msgid "Note" +msgstr "Hinweis" + +#: includes/include.mod_rewrite_content.php:194 +#, php-format +msgid "" +"The .htaccess file could not found either in Contenido installation " +"directory nor in client directory.
    It should set up in %sFunctions%s " +"area, if needed." +msgstr "" +"Es wurde weder im Contenido Installationsverzeichnis noch im " +"Mandantenverzeichnis eine .htaccess Datei gefunden.
    Die .htaccess Datei " +"sollte gegebenenfalls im Bereich %sFunktionen%s eingerichtet werden." + +#: includes/include.mod_rewrite_content.php:197 +msgid "Enable Advanced Mod Rewrite" +msgstr "Advanced Mod Rewrite aktivieren" + +#: includes/include.mod_rewrite_content.php:199 +msgid "" +"Disabling of plugin does not result in disabling mod rewrite module of the " +"web server - This means,
    all defined rules in the .htaccess are still " +"active and could create unwanted side effects.

    Apache mod rewrite " +"could be enabled/disabled by setting the RewriteEngine directive.
    Any " +"defined rewrite rules could remain in the .htaccess and they will not " +"processed,
    if the mod rewrite module is disabled" +msgstr "" +"Beim Deaktivieren des Plugins wird das mod rewrite Modul des Webservers " +"nicht mit deaktiviert - Das bedeutet,
    dass alle in der .htaccess " +"definerten Regeln weiterhin aktiv sind und einen unerwünschten " +"Nebeneffekt haben können.

    Apache mod rewrite lässt sich " +"in der .htaccess durch das Setzen der RewriteEngine-Direktive aktivieren/" +"deaktivieren.
    Wird das mod rewrite Modul deaktiviert, können die " +"in der .htaccess definierten Regeln weiterhin bleiben, sie werden
    dann " +"nicht verarbeitet." + +#: includes/include.mod_rewrite_content.php:201 +msgid "Example" +msgstr "Beispiel" + +#: includes/include.mod_rewrite_content.php:203 +msgid "" +"# enable apache mod rewrite module\n" +"RewriteEngine on\n" +"\n" +"# disable apache mod rewrite module\n" +"RewriteEngine off" +msgstr "" +"# aktivieren des apache mod rewrite moduls\n" +"RewriteEngine on\n" +"\n" +"# deaktivieren des apache mod rewrite moduls\n" +"RewriteEngine off" + +#: includes/include.mod_rewrite_content.php:205 +msgid "Path to .htaccess from DocumentRoot" +msgstr "Pfad zur .htaccess Datei vom DocumentRoot ausgehend" + +#: includes/include.mod_rewrite_content.php:206 +msgid "" +"Type '/' if the .htaccess file lies inside the wwwroot (DocumentRoot) folder." +"
    Type the path to the subfolder fromm wwwroot, if Contenido is " +"installed in a subfolder within the wwwroot
    (e. g. http://domain/" +"mycontenido -> path = '/mycontenido/')" +msgstr "" +"Liegt die .htaccess im wwwroot (DocumentRoot), ist '/' anzugeben, ist " +"Contenido in einem
    Unterverzeichnis von wwwroot installiert, ist der " +"Pfad vom wwwroot aus anzugeben
    (z. B. http://domain/mycontenido -> " +"Pfad = '/mycontenido/')." + +#: includes/include.mod_rewrite_content.php:208 +msgid "Check path to .htaccess" +msgstr "Pfad zur .htaccess Datei überprüfen" + +#: includes/include.mod_rewrite_content.php:209 +msgid "" +"The path will be checked, if this option is enabled.
    But this could " +"result in an error in some cases, even if the specified path is valid " +"and
    clients DocumentRoot differs from Contenido backend DocumentRoot." +msgstr "" +"Ist diese Option aktiv, wird der eingegebene Pfad überprüft. Das " +"kann unter
    Umständen einen Fehler verursachen, obwohl der Pfad " +"zwar richtig ist, aber der Mandant
    einen anderen DocumentRoot als das " +"Contenido Backend hat." + +#: includes/include.mod_rewrite_content.php:211 +msgid "Should the name of root category be displayed in the URL?" +msgstr "Soll der Name des Hauptbaumes mit in der URL erscheinen?" + +#: includes/include.mod_rewrite_content.php:212 +msgid "Start from root category" +msgstr "Start vom Hauptbaum aus" + +#: includes/include.mod_rewrite_content.php:213 +msgid "" +"If enabled, the name of the root category (e. g. \"Mainnavigation\" in a " +"Contenido default installation), will be preceded to the URL." +msgstr "" +"Ist diese Option gewählt, wird der Name des Hauptbaumes (Kategoriebaum, " +"
    z. B. \"Hauptnavigation\" bei Contenido Standardinstallation) der URL " +"vorangestellt." + +#: includes/include.mod_rewrite_content.php:215 +msgid "Are several clients maintained in one directory?" +msgstr "Werden mehrere Mandanten in einem Verzeichnis gepflegt?" + +#: includes/include.mod_rewrite_content.php:216 +msgid "Prepend client to the URL" +msgstr "Mandant an die URL voranstellen" + +#: includes/include.mod_rewrite_content.php:217 +msgid "Use client name instead of the id" +msgstr "Name des Mandanten anstatt die Id verwenden" + +#: includes/include.mod_rewrite_content.php:219 +msgid "" +"Should the language appear in the URL (required for multi language websites)?" +msgstr "" +"Soll die Sprache mit in der URL erscheinen (für Mehrsprachsysteme " +"unabdingbar)?" + +#: includes/include.mod_rewrite_content.php:220 +msgid "Prepend language to the URL" +msgstr "Sprache an die URL voranstellen" + +#: includes/include.mod_rewrite_content.php:221 +msgid "Use language name instead of the id" +msgstr "Name der Sprache anstatt die Id verwenden" + +#: includes/include.mod_rewrite_content.php:223 +msgid "" +"Configure your own separators with following 4 settings
    to control " +"generated URLs to your own taste" +msgstr "" +"Mit den nächsten 4 Einstellungen können die Trennzeichen in " +"den
    generierten URLs nach den eigenen Wünschen gesetzt werden." + +#: includes/include.mod_rewrite_content.php:224 +msgid "" +"www.domain.com/category1-category2.articlename.html\n" +"www.domain.com/category1/category2-articlename.html\n" +"www.domain.com/category.name1~category2~articlename.html\n" +"www.domain.com/category_name1-category2-articlename.foo" +msgstr "" +"www.domain.de/kategorie1-kategorie2.artikelname.html\n" +"www.domain.de/kategorie1/kategorie2-artikelname.html\n" +"www.domain.de/kategorie.name1~kategorie2~artikelname.html\n" +"www.domain.de/kategorie_name1-kategorie2-artikelname.foo" + +#: includes/include.mod_rewrite_content.php:225 +msgid "Category separator has to be different from category-word separator" +msgstr "" +"Kategorie-Separator und Kategoriewort-Separator müssen unterschiedlich " +"sein" + +#: includes/include.mod_rewrite_content.php:226 +msgid "" +"# Example: Category separator (/) and category-word separator (_)\n" +"category_one/category_two/articlename.html" +msgstr "" +"# Beispiel: Kategorie-Separator (/) und Kategoriewort-Separator (_)\n" +"kategorie_eins/kategorie_zwei/artikelname.html" + +#: includes/include.mod_rewrite_content.php:227 +msgid "Category separator has to be different from article-word separator" +msgstr "" +"Kategorie-Separator und Artikelwort-Separator müssen unterschiedlich " +"sein" + +#: includes/include.mod_rewrite_content.php:228 +msgid "" +"# Example: Category separator (/) and article-word separator (-)\n" +"category_one/category_two/article-description.html" +msgstr "" +"# Beispiel: Kategorie-Separator (/) und Artikelwort-Separator (-)\n" +"kategorie_eins/kategorie_zwei/artikel-bezeichnung.html" + +#: includes/include.mod_rewrite_content.php:229 +msgid "" +"Category-article separator has to be different from article-word separator" +msgstr "" +"Kategorie-Artikel-Separator und Artikelwort-Separator müssen " +"unterschiedlich sein" + +#: includes/include.mod_rewrite_content.php:230 +msgid "" +"# Example: Category-article separator (/) and article-word separator (-)\n" +"category_one/category_two/article-description.html" +msgstr "" +"# Beispiel: Kategorie-Artikel-Separator (/) und Artikelwort-Separator (-)\n" +"kategorie_eins/kategorie_zwei/artikel-bezeichnung.html" + +#: includes/include.mod_rewrite_content.php:232 +msgid "Category separator (delemiter between single categories)" +msgstr "Kategorie-Separator (Trenner zwischen einzelnen Kategorien)" + +#: includes/include.mod_rewrite_content.php:233 +#: includes/include.mod_rewrite_content.php:234 +#, php-format +msgid "(possible values: %s)" +msgstr "(mögliche Werte: %s)" + +#: includes/include.mod_rewrite_content.php:235 +msgid "Category-word separator (delemiter between category words)" +msgstr "" +"Kategoriewort-Separator (Trenner zwischen einzelnen Kategoriewörtern)" + +#: includes/include.mod_rewrite_content.php:236 +msgid "" +"Category-article separator (delemiter between category-block and article)" +msgstr "" +"Kategorie-Artikel-Separator (Trenner zwischen Kategorieabschnitt und " +"Artikelname)" + +#: includes/include.mod_rewrite_content.php:237 +msgid "Article-word separator (delemiter between article words)" +msgstr "Artikelwort-Separator (Trenner zwischen einzelnen Artikelwörtern)" + +#: includes/include.mod_rewrite_content.php:239 +msgid "Append article name to URLs" +msgstr "Artikelname an URLs anhängen" + +#: includes/include.mod_rewrite_content.php:240 +msgid "Append article name always to URLs (even at URLs to categories)" +msgstr "" +"Artikelname immer an die URLs anhängen (auch bei URLs zu Kategorien)" + +#: includes/include.mod_rewrite_content.php:241 +msgid "Default article name without extension" +msgstr "Standard-Artikelname ohne Dateiendung" + +#: includes/include.mod_rewrite_content.php:242 +msgid "" +"e. g. \"index\" for index.ext
    In case of selected \"Append article name " +"always to URLs\" option and a empty field,
    the name of the start " +"article will be used" +msgstr "" +"z. B. \"index\" für index.ext.
    Wenn die Option \"Artikelname immer " +"an die URLs anhängen\" aktiviert und das Feld leer ist,
    wird der " +"Name des Startartikels verwendet." + +#: includes/include.mod_rewrite_content.php:244 +msgid "File extension at the end of the URL" +msgstr "Dateiendung am Ende der URL" + +#: includes/include.mod_rewrite_content.php:245 +msgid "" +"Specification of file extension with a preceded dot
    e.g. \".html\" for " +"http://host/foo/bar.html" +msgstr "" +"Angabe der Dateiendung mit einem vorangestellten Punkt,
    z. B. \".html\" " +"für http://host/foo/bar.html" + +#: includes/include.mod_rewrite_content.php:246 +msgid "" +"It's strongly recommended to specify a extension here,
    if the option " +"\"Append article name always to URLs\" was not selected.

    Otherwise URLs to categories and articles would have the same format
    which may result in unresolvable categories/articles in some cases." +msgstr "" +"Falls die Option \"Artikelname immer an die URLs anhängen\" nicht " +"gewählt wurde,
    ist es zwingend notwending, dass hier eine " +"Dateiendung angegeben wird.

    Sonst haben URLs zu Kategorien und zu " +"Seiten das gleiche Format, und die korrekte
    Auflösung der " +"Kategorie und/oder des Artikels kann nicht gewährleistet werden." + +#: includes/include.mod_rewrite_content.php:247 +msgid "" +"It's necessary to specify a file extension at the moment, due do existing " +"issues, which are not solved until yet. An not defined extension may result " +"in invalid article detection in some cases." +msgstr "" +"Aufgrund diverser Probleme, die noch nicht in dieser Version gelöst " +"wurden konnten, sollte unbedingt eine Endung angegeben werden. Ohne eine " +"angegebene Endung kann es zur fehlerhaften Erkennung der Artikel kommen." + +#: includes/include.mod_rewrite_content.php:249 +msgid "Should the URLs be written in lower case?" +msgstr "Sollen die URLs klein geschrieben werden?" + +#: includes/include.mod_rewrite_content.php:250 +msgid "URLs in lower case" +msgstr "URLs in Kleinbuchstaben" + +#: includes/include.mod_rewrite_content.php:252 +msgid "Duplicated content" +msgstr "Duplicated Content" + +#: includes/include.mod_rewrite_content.php:253 +msgid "Prevent duplicated content" +msgstr "Duplicated Content verhindern" + +#: includes/include.mod_rewrite_content.php:255 +msgid "" +"Depending on configuration, pages could be found thru different URLs.
    Enabling of this option prevents this. Examples for duplicated content" +msgstr "" +"Seiten werden je nach Konfiguration unter verschiedenen URLs gefunden.
    Das Aktivieren dieser Option unterbindet dies. Beispiele für " +"duplicated Content" + +#: includes/include.mod_rewrite_content.php:256 +msgid "" +"Name of the root category in the URL: Feasible is /maincategory/subcategory/ " +"and /subcategory/\n" +"Language in the URL: Feasible is /german/category/ and /1/category/\n" +"Client in the URL: Feasible is /client/category/ und /1/category/" +msgstr "" +"Name des Hauptbaumes in der URL: Möglich /hauptkategorie/" +"unterkategorie/ und /unterkategorie/\n" +"Sprache in der URL: Möglich /deutsch/kategorie/ und /1/kategorie/\n" +"Mandant in der URL: Möglich /mandant/kategorie/ und /1/kategorie/" + +#: includes/include.mod_rewrite_content.php:259 +msgid "Percentage for similar category paths in URLs" +msgstr "Prozentsatz für ähnliche Kategorie-Pfade in URLs" + +#: includes/include.mod_rewrite_content.php:260 +msgid "" +"This setting refers only to the category path of a URL. If AMR is " +"configured
    to prepend e. g. the root category, language and/or client " +"to the URL,
    the specified percentage will not applied to those parts of " +"the URL.
    A incoming URL will be cleaned from those values and the " +"remaining path (urlpath of the category)
    will be checked against " +"similarities." +msgstr "" +"Diese Einstellung bezieht sich nur auf den Kategorieteil einer URL. Ist AMR " +"so konfiguriert, dass z. B. die
    Hauptnavigation und/oder Sprache sowie " +"der Name des Mandanten an die URL vorangestellt wird, so wird der hier
    definierte Prozentsatz nicht auf diese Werte der URL angewendet.
    Eine " +"ankommende URL wird von solchen Präfixen entfernt, der übrig " +"gebliebene Pfad (Urlpfad der Kategorie)
    wird auf die Ähnlichkleit " +"hin geprüft." + +#: includes/include.mod_rewrite_content.php:261 +msgid "" +"100 = exact match with no tolerance\n" +"85 = paths with little errors will match to similar ones\n" +"0 = matching will work even for total wrong paths" +msgstr "" +"100 = exakte überinstimmung, keine fehlertoleranz\n" +"85 = pfade mit kleineren fehlern ergeben auch treffern\n" +"0 = vollständig fehlerhafte pfade ergeben dennoch einen treffer" + +#: includes/include.mod_rewrite_content.php:263 +msgid "Redirect in case of invalid articles" +msgstr "Weiterleitung bei ungültigen Artikeln" + +#: includes/include.mod_rewrite_content.php:264 +msgid "Redirect to error page in case of invaid articles" +msgstr "Bei ungültigen Artikeln zur Fehlerseite weiterleiten" + +#: includes/include.mod_rewrite_content.php:265 +msgid "The start page will be displayed if this option is not enabled" +msgstr "Ist die Option nicht aktiv, wird die Startseite angezeigt" + +#: includes/include.mod_rewrite_content.php:267 +msgid "Moment of URL generation" +msgstr "Zeitpunkt zum Generieren der URLs" + +#: includes/include.mod_rewrite_content.php:268 +msgid "a.) During the output of HTML code of the page" +msgstr "a.) Bei der Ausgabe des HTML Codes der Seite" + +#: includes/include.mod_rewrite_content.php:269 +msgid "" +"Clean-URLs will be generated during page output. Modules/Plugins are able to " +"generate URLs to frontend
    as usual as in previous Contenido versions " +"using a format like \"front_content.php?idcat=1&idart=2\".
    The URLs " +"will be replaced by the plugin to Clean-URLs before sending the HTML output." +msgstr "" +"Clean-URLs werden bei der Ausgabe der Seite generiert. Module/Plugins kö" +"nnen URLs zum Frontend,
    wie in früheren Versionen von Contenido " +"üblich, nach dem Muster \"front_content.php?idcat=1&idart=2\"
    ausgeben. Die URLs werden vom Plugin vor der Ausgabe des HTML-Outputs Clean-" +"URLs ersetzt." + +#: includes/include.mod_rewrite_content.php:270 +msgid "Differences to variant b.)" +msgstr "Unterschiede zur Variante b.)" + +#: includes/include.mod_rewrite_content.php:271 +msgid "" +"Still compatible to old modules/plugins, since no changes in codes are " +"required\n" +"All occurring URLs in HTML code, even those set by wysiwyg, will be switched " +"to Clean-URLs\n" +"All URLs will usually be collected and converted to Clean-URLs at once.
    Doing it this way reduces the amount of executed database significantly." +msgstr "" +"Weiterhin Kompatibel zu älteren Modulen/Plugins, da keine Ä" +"nderungen am Code nötig sind\n" +"Sämtliche im HTML-Code vorkommende URLs, auch über wysiwyg " +"gesetzte URLs,
    werden auf Clean-URLs umgestellt\n" +"Alle umzuschreibenden URLs werden in der Regel \"gesammelt\" und auf eimmal " +"umgeschreiben,
    dadurch wird die Anzahl der DB-Abfragen sehr stark " +"minimiert" + +#: includes/include.mod_rewrite_content.php:274 +msgid "b.) In modules or plugins" +msgstr "b.) In Modulen oder Plugins" + +#: includes/include.mod_rewrite_content.php:275 +msgid "" +"By using this option, all Clean-URLs will be generated directly in module or " +"plugins.
    This means, all areas in modules/plugins, who generate " +"internal URLs to categories/articles, have to be adapted manually.
    All " +"Clean-URLs have to be generated by using following function:" +msgstr "" +"Bei dieser Option werden die Clean-URLs direkt in Modulen/Plugins generiert. " +"Das bedeutet,
    dass alle internen URLs auf Kategorien/Artikel in den " +"Modulausgaben ggf. manuell angepasst werden müssen.
    Clean-URLs " +"müssen dann stets mit folgender Funktion erstellt werden:" + +#: includes/include.mod_rewrite_content.php:276 +msgid "" +"# structure of a normal url\n" +"$url = 'front_content.php?idart=123&lang=2&client=1';\n" +"\n" +"# creation of a url by using the Contenidos Url-Builder (since 4.8.9),\n" +"# wich expects the parameter as a assoziative array\n" +"$params = array('idart'=>123, 'lang'=>2, 'client'=>1);\n" +"$newUrl = Contenido_Url::getInstance()->build($params);" +msgstr "" +"# aufbau einer normalen url\n" +"$url = 'front_content.php?idart=123&lang=2&client=1';\n" +"\n" +"# erstellen der neuen Url über Contenidos Url-Builder (seit 4.8.9),\n" +"# der die Parameter als assoziatives array erwartet\n" +"$params = array('idart'=>123, 'lang'=>2, 'client'=>1);\n" +"$newUrl = Contenido_Url::getInstance()->build($params);" + +#: includes/include.mod_rewrite_content.php:277 +msgid "Differences to variant a.)" +msgstr "Unterschiede zur Variante a.)" + +#: includes/include.mod_rewrite_content.php:278 +msgid "" +"The default way to generate URLs to fronend pages\n" +"Each URL in modules/plugins has to be generated by UrlBuilder\n" +"Each generated Clean-Url requires a database query" +msgstr "" +"Der Standardweg um URLs zu Frontendseiten zu generieren\n" +"Jede URL in Modulen/Plugins ist vom UrlBuilder zu erstellen\n" +"Für jede umzuschreibende URL ist eine Datenbankabfrage nötig" + +#: includes/include.mod_rewrite_content.php:281 +msgid "Routing" +msgstr "Routing" + +#: includes/include.mod_rewrite_content.php:282 +msgid "Routing definitions for incoming URLs" +msgstr "Routing Definitionen für eingehende URLs" + +#: includes/include.mod_rewrite_content.php:283 +msgid "Type one routing definition per line as follows:" +msgstr "Pro Zeile eine Routing Definition wie folgt eingeben:" + +#: includes/include.mod_rewrite_content.php:284 +msgid "" +"# {incoming_url}>>>{new_url}\n" +"/incoming_url/name.html>>>new_url/new_name.html\n" +"\n" +"# route a specific incoming url to a new page\n" +"/campaign/20_percent_on_everything_except_animal_food.html>>>front_content." +"php?idcat=23\n" +"\n" +"# route request to wwwroot to a specific page\n" +"/>>>front_content.php?idart=16" +msgstr "" +"# {eingehende_url}>>>{neue_url}\n" +"/eingehende_url/name.html>>>neue_url/neuer_name.html\n" +"\n" +"# bestimmte eingehende url zur einer seite weiterleiten\n" +"/aktionen/20_prozent_auf_alles_ausser_tiernahrung.html>>>front_content.php?" +"idcat=23\n" +"\n" +"# request zum wwwroot auf eine bestimmte seite routen\n" +"/>>>front_content.php?idart=16" + +#: includes/include.mod_rewrite_content.php:285 +msgid "" +"The routing does not sends a HTTP header redirection to the destination URL, " +"the redirection will happen internally by
    replacing the detected " +"incoming URL against the new destination URL (overwriting of article- " +"categoryid)\n" +"Incoming URLs can point to non existing resources (category/article), but " +"the desttination URLs should point
    to valid Contenido articles/" +"categories\n" +"Destination URLs should point to real URLs to categories/articles,
    e. g." +"front_content.php?idcat=23 or front_content.php?idart=34\n" +"The language id should attached to the URL in multi language sites
    e. " +"g. front_content.php?idcat=23&lang=1\n" +"The client id should attached to the URL in multi client sites sharing the " +"same folder
    e. g. front_content.php?idcat=23&client=2\n" +"The destination URL should not start with '/' or './' (wrong: /front_content." +"php, correct: front_content.php)" +msgstr "" +"Das Routing schickt keinen HTTP Header mit einer Weiterleitung zur Ziel-URL, " +"die Umleitung findet intern
    durch das Ersetzen der erkannten " +"Eingangsseite gegen die neue Zielseite statt (Überschreiben der " +"Artikel-/Kategorieid)\n" +"Eingehende URLs können auch nicht vorhandene Ressourcen (Kategorie, " +"Artikel) sein, hinter der Ziel URL muss eine
    gültige Contenido-" +"Seite (Kategorie/Artikel) liegen\n" +"Als Ziel URL sollte eine reale URL zur Kategorie/Seite angegeben werden, " +"
    z. B. front_content.php?idcat=23 oder front_content.php?idart=34.\n" +"Bei mehrsprachigen Auftritten sollte die Id der Sprache angehängt " +"werden,
    z. B. front_content.php?idcat=23&lang=1\n" +"Bei mehreren Mandanten im gleichen Verzeichnis sollte die Id des Mandanten " +"angehängt werden,
    z. B. front_content.php?idcat=23&client=2\n" +"Die Zielurl sollte nicht mit '/' oder './' beginnen (falsch: /front_content." +"php, richtig: front_content.php)" + +#: includes/include.mod_rewrite_content.php:288 +#: includes/include.mod_rewrite_contentexpert.php:128 +msgid "Discard changes" +msgstr "Änderungen verwerfen" + +#: includes/include.mod_rewrite_content.php:289 +#: includes/include.mod_rewrite_contentexpert.php:129 +msgid "Save changes" +msgstr "Änderungen speichern" + +#: includes/include.mod_rewrite_contenttest.php:73 +msgid "" +"Define options to genereate the URLs by using the form below and run the " +"test." +msgstr "" +"Optionen zum Generieren der URLs im folgenden Formular setzen und den Test " +"starten." + +#: includes/include.mod_rewrite_contenttest.php:74 +msgid "Parameter to use" +msgstr "Zu verwendende Parameter" + +#: includes/include.mod_rewrite_contenttest.php:75 +msgid "Number of URLs to generate" +msgstr "Anzahl der zu generierenden URLs" + +#: includes/include.mod_rewrite_contenttest.php:76 +msgid "Run test" +msgstr "Test starten" + +#: includes/include.mod_rewrite_contenttest.php:78 +msgid "" +"{pref}{name}\n" +"{pref}Builder in: {url_in}\n" +"{pref}Builder out: {url_out}\n" +"{pref}Resolved URL: {url_res}\n" +"{pref}Resolved data: {data}" +msgstr "" +"{pref}{name}\n" +"{pref}Builder Eingang: {url_in}\n" +"{pref}Builder Ausgang: {url_out}\n" +"{pref}Aufgelöste URL: {url_res}\n" +"{pref}Aufgelöste Daten: {data}" + +#: includes/include.mod_rewrite_contenttest.php:84 +msgid "" +"Duration of test run: {time} seconds.
    \n" +"Number of processed URLs: {num_urls}
    \n" +"Successful resolved: {num_success}
    \n" +"Errors during resolving: {num_fail}" +msgstr "" +"Dauer des Testdurchlaufs: {time} Sekunden.
    \n" +"Anzahl verarbeiteter URLs: {num_urls}
    \n" +"Erfolgreich aufgelöst: {num_success}
    \n" +"Fehler beim Auflösen: {num_fail}" + +#: includes/config.plugin.php:176 +msgid "MR-Options" +msgstr "MR-Einstellungen" + +#: includes/config.plugin.php:177 +msgid "Expert Options" +msgstr "Experteneinstellungen" + +#: includes/config.plugin.php:178 +msgid "MR Test Area" +msgstr "MR Testbereich" + +#: includes/include.mod_rewrite_contentexpert.php:80 +msgid "Plugin functions" +msgstr "Plugin Funktionen" + +#: includes/include.mod_rewrite_contentexpert.php:82 +msgid "Copy/Download .htaccess template" +msgstr ".htaccess Vorlage kopieren/downloaden" + +#: includes/include.mod_rewrite_contentexpert.php:83 +msgid "Select .htaccess template" +msgstr ".htaccess Vorlage auswählen" + +#: includes/include.mod_rewrite_contentexpert.php:84 +msgid "Restrictive .htaccess" +msgstr "Restriktive .htaccess" + +#: includes/include.mod_rewrite_contentexpert.php:85 +msgid "Simple .htaccess" +msgstr "Einfache .htaccess" + +#: includes/include.mod_rewrite_contentexpert.php:86 +msgid "" +"Contains rules with restrictive settings.
    \n" +"All requests pointing to extension avi, css, doc, flv, gif, gzip, ico, jpeg, " +"jpg, js, mov,
    \n" +"mp3, pdf, png, ppt, rar, txt, wav, wmv, xml, zip, will be excluded vom " +"rewriting.
    \n" +"Remaining requests will be rewritten to front_content.php,
    \n" +"except requests to 'contenido/', 'setup/', 'cms/upload', 'cms/front_content." +"php', etc.
    \n" +"Each resource, which has to be excluded from rewriting must be specified " +"explicitly." +msgstr "" +"Enthält Regeln mit restriktiveren Einstellungen.
    Alle Anfragen, " +"die auf die Dateienendung avi, css, doc, flv, gif, gzip, ico, jpeg, jpg, js, " +"mov,
    mp3, pdf, png, ppt, rar, txt, wav, wmv, xml, zip gehen, werden " +"vom Umschreiben ausgeschlossen.
    Alle anderen Anfragen, werden an " +"front_content.php umschrieben.
    Ausgeschlossen davon sind 'contenido/', " +"'setup/', 'cms/upload', 'cms/front_content.php', usw.
    Jede neue " +"Ressource, die vom Umschreiben ausgeschlossen werden soll, muss explizit " +"definiert werden." + +#: includes/include.mod_rewrite_contentexpert.php:93 +msgid "" +"Contains a sipmle collection of rules. Each requests pointing to valid " +"symlinks, folders or
    \n" +"files, will be excluded from rewriting. Remaining requests will be rewritten " +"to front_content.php" +msgstr "" +"Enthält eine einfachere Sammlung an Regeln. Alle Anfragen, die auf " +"gültige Symlinks, Verzeichnisse oder
    Dateien gehen, werden vom " +"Umschreiben ausgeschlossen. Restliche Anfragen werden an front_content." +"php
    umschrieben." + +#: includes/include.mod_rewrite_contentexpert.php:96 +msgid "and copy to" +msgstr "und kopieren in" + +#: includes/include.mod_rewrite_contentexpert.php:97 +msgid "Contenido installation directory" +msgstr "das Contenido Installationsverzeichnis" + +#: includes/include.mod_rewrite_contentexpert.php:98 +msgid "" +"Copy the selected .htaccess template into Contenido installation " +"directory
    \n" +"
    \n" +"    {CONTENIDO_FULL_PATH}.
    \n" +"
    \n" +"This is the recommended option for a Contenido installation with one or more " +"clients
    \n" +"who are running on the same domain." +msgstr "" +"Die gewählte .htaccess Vorlage in das Contenido " +"Installationsverzeichnis
    \n" +"
    \n" +"    {CONTENIDO_FULL_PATH}
    \n" +"
    \n" +"kopieren.
    \n" +"Das ist die empfohlene Option für eine Contenido-Installation mit einem " +"Mandanten oder
    \n" +"mehreren Mandanten, die alle unter der gleichen Domain laufen." + +#: includes/include.mod_rewrite_contentexpert.php:105 +msgid "client directory" +msgstr "das Mandantenverzeichnis" + +#: includes/include.mod_rewrite_contentexpert.php:106 +msgid "" +"Copy the selected .htaccess template into client's directory
    \n" +"
    \n" +"    {CLIENT_FULL_PATH}.
    \n" +"
    \n" +"This is the recommended option for a multiple client system
    \n" +"where each client has it's own domain/subdomain" +msgstr "" +"Die gewählte .htaccess Vorlage in das Mandantenerzeichnis
    \n" +"
    \n" +"    {CLIENT_FULL_PATH}
    \n" +"
    \n" +"kopieren.
    \n" +"Diese Option ist z. B. bei einem Mehrmandantensystem empfohlen,
    \n" +"wenn jeder Mandant unter einer eigenen Domain/Subdomain läuft." + +#: includes/include.mod_rewrite_contentexpert.php:113 +msgid "or" +msgstr "oder" + +#: includes/include.mod_rewrite_contentexpert.php:114 +msgid "Download" +msgstr "Downloaden" + +#: includes/include.mod_rewrite_contentexpert.php:115 +msgid "" +"Download selected .htaccess template to copy it to the destination " +"folder
    \n" +"or to take over the settings manually." +msgstr "" +"Die gewählte .htaccess Vorlage downloaden um z. B. die Datei " +"manuell
    \n" +"in das Verzeichnis zu kopieren oder Einstellungen zu übernehmen." + +#: includes/include.mod_rewrite_contentexpert.php:118 +msgid "Reset category-/ and article aliases" +msgstr "Kategorie-/ und Artikel-Aliase zurücksetzen" + +#: includes/include.mod_rewrite_contentexpert.php:119 +msgid "Reset only empty aliases" +msgstr "Nur leere Aliase zurücksetzen" + +#: includes/include.mod_rewrite_contentexpert.php:120 +msgid "" +"Only empty aliases will be reset, existing aliases, e. g. manually set " +"aliases, will not be changed." +msgstr "" +"Nur leere Kategorie-/Artikelaliase initial setzen
    Vorhandene Aliase, z." +"B. vorher manuell gesetze Aliase werden nicht geändert." + +#: includes/include.mod_rewrite_contentexpert.php:121 +msgid "Reset all aliases" +msgstr "Alle Aliase zurücksetzen" + +#: includes/include.mod_rewrite_contentexpert.php:122 +msgid "" +"Reset all category-/article aliases. Existing aliases will be overwritten." +msgstr "" +"Alle Kategorie-/Artikelaliase neu setzen.
    Vorhandene Aliase werden " +"überschrieben." + +#: includes/include.mod_rewrite_contentexpert.php:124 +msgid "" +"This process could require some time depending on amount of categories/" +"articles.
    \n" +"The aliases will not contain the configured plugin separators, but the " +"Contenido default separators '/' und '-', e. g. '/category-word/article-" +"word'.
    \n" +"Execution of this function ma be helpful to prepare all or empty aliases for " +"the usage by the plugin." +msgstr "" +"Dieser Prozess kann je nach Anzahl der Kategorien/Artikel etwas Zeit in " +"Anspruch nehmen.
    \n" +"Die Aliase erhalten nicht die oben konfigurierten Separatoren, sondern die " +"Contenido-Standardseparatoren '/' und '-', z. B. '/category-word/article-" +"word'.
    \n" +"Das Ausführen dieser Funktion kann Hilfreich sein, um sämtliche " +"oder nur leere Aliase nachträglich auf die Verwendung mit dem Plugin " +"anzupassen." diff --git a/conlite/plugins/mod_rewrite/locale/mod_rewrite.pot b/conlite/plugins/mod_rewrite/locale/mod_rewrite.pot new file mode 100644 index 0000000..ee5fcd1 --- /dev/null +++ b/conlite/plugins/mod_rewrite/locale/mod_rewrite.pot @@ -0,0 +1,740 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-20 11:14+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: classes/controller/class.modrewrite_controller_abstract.php:73 +msgid "More informations" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:72 +msgid "" +"The root directory has a invalid format, alowed are the chars [a-zA-Z0-9\\-_" +"\\/\\.]" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:79 +#, php-format +msgid "The specified directory \"%s\" does not exists" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:86 +#, php-format +msgid "" +"The specified directory \"%s\" does not exists in DOCUMENT_ROOT \"%s\". this " +"could happen, if clients DOCUMENT_ROOT differs from Contenido backends " +"DOCUMENT_ROOT. However, the setting will be taken over because of disabled " +"check." +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:189 +#, php-format +msgid "Please specify separator (%s) for category" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:194 +#, php-format +msgid "Invalid separator for category, allowed one of following characters: %s" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:201 +#, php-format +msgid "Please specify separator (%s) for category words" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:206 +#, php-format +msgid "" +"Invalid separator for category words, allowed one of following characters: %s" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:213 +#, php-format +msgid "Please specify separator (%s) for article" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:218 +#, php-format +msgid "" +"Invalid separator for article, allowed is one of following characters: %s" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:225 +#, php-format +msgid "Please specify separator (%s) for article words" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:230 +#, php-format +msgid "" +"Invalid separator for article words, allowed is one of following characters: " +"%s" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:237 +msgid "Separator for category and category words must not be identical" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:242 +msgid "Separator for category and article words must not be identical" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:247 +msgid "Separator for category-article and article words must not be identical" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:264 +msgid "" +"The file extension has a invalid format, allowed are the chars \\.([a-zA-" +"Z0-9\\-_\\/])" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:278 +msgid "Value has to be numeric." +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:282 +msgid "Value has to be between 0 an 100." +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:299 +msgid "" +"The article name has a invalid format, allowed are the chars /^[a-zA-Z0-9\\-_" +"\\/\\.]*$/" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:362 +msgid "Please check your input" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:370 +msgid "Configuration has not been saved, because of enabled debugging" +msgstr "" + +#: classes/controller/class.modrewrite_content_controller.php:384 +#, php-format +msgid "Configuration could not saved. Please check write permissions for %s " +msgstr "" + +#: includes/include.mod_rewrite_content.php:42 +#: includes/include.mod_rewrite_contenttest.php:49 +#: includes/include.mod_rewrite_contentexpert.php:42 +msgid "No Client selected" +msgstr "" + +#: includes/include.mod_rewrite_content.php:183 +msgid "Version" +msgstr "" + +#: includes/include.mod_rewrite_content.php:184 +msgid "Author" +msgstr "" + +#: includes/include.mod_rewrite_content.php:185 +msgid "E-Mail to author" +msgstr "" + +#: includes/include.mod_rewrite_content.php:186 +msgid "Plugin page" +msgstr "" + +#: includes/include.mod_rewrite_content.php:187 +msgid "Visit plugin page" +msgstr "" + +#: includes/include.mod_rewrite_content.php:188 +msgid "opens page in new window" +msgstr "" + +#: includes/include.mod_rewrite_content.php:189 +msgid "Contenido forum" +msgstr "" + +#: includes/include.mod_rewrite_content.php:190 +msgid "Plugin thread in Contenido forum" +msgstr "" + +#: includes/include.mod_rewrite_content.php:191 +msgid "Plugin settings" +msgstr "" + +#: includes/include.mod_rewrite_content.php:192 +#: includes/include.mod_rewrite_contentexpert.php:123 +msgid "Note" +msgstr "" + +#: includes/include.mod_rewrite_content.php:194 +#, php-format +msgid "" +"The .htaccess file could not found either in Contenido installation " +"directory nor in client directory.
    It should set up in %sFunctions%s " +"area, if needed." +msgstr "" + +#: includes/include.mod_rewrite_content.php:197 +msgid "Enable Advanced Mod Rewrite" +msgstr "" + +#: includes/include.mod_rewrite_content.php:199 +msgid "" +"Disabling of plugin does not result in disabling mod rewrite module of the " +"web server - This means,
    all defined rules in the .htaccess are still " +"active and could create unwanted side effects.

    Apache mod rewrite " +"could be enabled/disabled by setting the RewriteEngine directive.
    Any " +"defined rewrite rules could remain in the .htaccess and they will not " +"processed,
    if the mod rewrite module is disabled" +msgstr "" + +#: includes/include.mod_rewrite_content.php:201 +msgid "Example" +msgstr "" + +#: includes/include.mod_rewrite_content.php:203 +msgid "" +"# enable apache mod rewrite module\n" +"RewriteEngine on\n" +"\n" +"# disable apache mod rewrite module\n" +"RewriteEngine off" +msgstr "" + +#: includes/include.mod_rewrite_content.php:205 +msgid "Path to .htaccess from DocumentRoot" +msgstr "" + +#: includes/include.mod_rewrite_content.php:206 +msgid "" +"Type '/' if the .htaccess file lies inside the wwwroot (DocumentRoot) folder." +"
    Type the path to the subfolder fromm wwwroot, if Contenido is " +"installed in a subfolder within the wwwroot
    (e. g. http://domain/" +"mycontenido -> path = '/mycontenido/')" +msgstr "" + +#: includes/include.mod_rewrite_content.php:208 +msgid "Check path to .htaccess" +msgstr "" + +#: includes/include.mod_rewrite_content.php:209 +msgid "" +"The path will be checked, if this option is enabled.
    But this could " +"result in an error in some cases, even if the specified path is valid " +"and
    clients DocumentRoot differs from Contenido backend DocumentRoot." +msgstr "" + +#: includes/include.mod_rewrite_content.php:211 +msgid "Should the name of root category be displayed in the URL?" +msgstr "" + +#: includes/include.mod_rewrite_content.php:212 +msgid "Start from root category" +msgstr "" + +#: includes/include.mod_rewrite_content.php:213 +msgid "" +"If enabled, the name of the root category (e. g. \"Mainnavigation\" in a " +"Contenido default installation), will be preceded to the URL." +msgstr "" + +#: includes/include.mod_rewrite_content.php:215 +msgid "Are several clients maintained in one directory?" +msgstr "" + +#: includes/include.mod_rewrite_content.php:216 +msgid "Prepend client to the URL" +msgstr "" + +#: includes/include.mod_rewrite_content.php:217 +msgid "Use client name instead of the id" +msgstr "" + +#: includes/include.mod_rewrite_content.php:219 +msgid "" +"Should the language appear in the URL (required for multi language websites)?" +msgstr "" + +#: includes/include.mod_rewrite_content.php:220 +msgid "Prepend language to the URL" +msgstr "" + +#: includes/include.mod_rewrite_content.php:221 +msgid "Use language name instead of the id" +msgstr "" + +#: includes/include.mod_rewrite_content.php:223 +msgid "" +"Configure your own separators with following 4 settings
    to control " +"generated URLs to your own taste" +msgstr "" + +#: includes/include.mod_rewrite_content.php:224 +msgid "" +"www.domain.com/category1-category2.articlename.html\n" +"www.domain.com/category1/category2-articlename.html\n" +"www.domain.com/category.name1~category2~articlename.html\n" +"www.domain.com/category_name1-category2-articlename.foo" +msgstr "" + +#: includes/include.mod_rewrite_content.php:225 +msgid "Category separator has to be different from category-word separator" +msgstr "" + +#: includes/include.mod_rewrite_content.php:226 +msgid "" +"# Example: Category separator (/) and category-word separator (_)\n" +"category_one/category_two/articlename.html" +msgstr "" + +#: includes/include.mod_rewrite_content.php:227 +msgid "Category separator has to be different from article-word separator" +msgstr "" + +#: includes/include.mod_rewrite_content.php:228 +msgid "" +"# Example: Category separator (/) and article-word separator (-)\n" +"category_one/category_two/article-description.html" +msgstr "" + +#: includes/include.mod_rewrite_content.php:229 +msgid "" +"Category-article separator has to be different from article-word separator" +msgstr "" + +#: includes/include.mod_rewrite_content.php:230 +msgid "" +"# Example: Category-article separator (/) and article-word separator (-)\n" +"category_one/category_two/article-description.html" +msgstr "" + +#: includes/include.mod_rewrite_content.php:232 +msgid "Category separator (delemiter between single categories)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:233 +#: includes/include.mod_rewrite_content.php:234 +#, php-format +msgid "(possible values: %s)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:235 +msgid "Category-word separator (delemiter between category words)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:236 +msgid "" +"Category-article separator (delemiter between category-block and article)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:237 +msgid "Article-word separator (delemiter between article words)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:239 +msgid "Append article name to URLs" +msgstr "" + +#: includes/include.mod_rewrite_content.php:240 +msgid "Append article name always to URLs (even at URLs to categories)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:241 +msgid "Default article name without extension" +msgstr "" + +#: includes/include.mod_rewrite_content.php:242 +msgid "" +"e. g. \"index\" for index.ext
    In case of selected \"Append article name " +"always to URLs\" option and a empty field,
    the name of the start " +"article will be used" +msgstr "" + +#: includes/include.mod_rewrite_content.php:244 +msgid "File extension at the end of the URL" +msgstr "" + +#: includes/include.mod_rewrite_content.php:245 +msgid "" +"Specification of file extension with a preceded dot
    e.g. \".html\" for " +"http://host/foo/bar.html" +msgstr "" + +#: includes/include.mod_rewrite_content.php:246 +msgid "" +"It's strongly recommended to specify a extension here,
    if the option " +"\"Append article name always to URLs\" was not selected.

    Otherwise URLs to categories and articles would have the same format
    which may result in unresolvable categories/articles in some cases." +msgstr "" + +#: includes/include.mod_rewrite_content.php:247 +msgid "" +"It's necessary to specify a file extension at the moment, due do existing " +"issues, which are not solved until yet. An not defined extension may result " +"in invalid article detection in some cases." +msgstr "" + +#: includes/include.mod_rewrite_content.php:249 +msgid "Should the URLs be written in lower case?" +msgstr "" + +#: includes/include.mod_rewrite_content.php:250 +msgid "URLs in lower case" +msgstr "" + +#: includes/include.mod_rewrite_content.php:252 +msgid "Duplicated content" +msgstr "" + +#: includes/include.mod_rewrite_content.php:253 +msgid "Prevent duplicated content" +msgstr "" + +#: includes/include.mod_rewrite_content.php:255 +msgid "" +"Depending on configuration, pages could be found thru different URLs.
    Enabling of this option prevents this. Examples for duplicated content" +msgstr "" + +#: includes/include.mod_rewrite_content.php:256 +msgid "" +"Name of the root category in the URL: Feasible is /maincategory/subcategory/ " +"and /subcategory/\n" +"Language in the URL: Feasible is /german/category/ and /1/category/\n" +"Client in the URL: Feasible is /client/category/ und /1/category/" +msgstr "" + +#: includes/include.mod_rewrite_content.php:259 +msgid "Percentage for similar category paths in URLs" +msgstr "" + +#: includes/include.mod_rewrite_content.php:260 +msgid "" +"This setting refers only to the category path of a URL. If AMR is " +"configured
    to prepend e. g. the root category, language and/or client " +"to the URL,
    the specified percentage will not applied to those parts of " +"the URL.
    A incoming URL will be cleaned from those values and the " +"remaining path (urlpath of the category)
    will be checked against " +"similarities." +msgstr "" + +#: includes/include.mod_rewrite_content.php:261 +msgid "" +"100 = exact match with no tolerance\n" +"85 = paths with little errors will match to similar ones\n" +"0 = matching will work even for total wrong paths" +msgstr "" + +#: includes/include.mod_rewrite_content.php:263 +msgid "Redirect in case of invalid articles" +msgstr "" + +#: includes/include.mod_rewrite_content.php:264 +msgid "Redirect to error page in case of invaid articles" +msgstr "" + +#: includes/include.mod_rewrite_content.php:265 +msgid "The start page will be displayed if this option is not enabled" +msgstr "" + +#: includes/include.mod_rewrite_content.php:267 +msgid "Moment of URL generation" +msgstr "" + +#: includes/include.mod_rewrite_content.php:268 +msgid "a.) During the output of HTML code of the page" +msgstr "" + +#: includes/include.mod_rewrite_content.php:269 +msgid "" +"Clean-URLs will be generated during page output. Modules/Plugins are able to " +"generate URLs to frontend
    as usual as in previous Contenido versions " +"using a format like \"front_content.php?idcat=1&idart=2\".
    The URLs " +"will be replaced by the plugin to Clean-URLs before sending the HTML output." +msgstr "" + +#: includes/include.mod_rewrite_content.php:270 +msgid "Differences to variant b.)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:271 +msgid "" +"Still compatible to old modules/plugins, since no changes in codes are " +"required\n" +"All occurring URLs in HTML code, even those set by wysiwyg, will be switched " +"to Clean-URLs\n" +"All URLs will usually be collected and converted to Clean-URLs at once.
    Doing it this way reduces the amount of executed database significantly." +msgstr "" + +#: includes/include.mod_rewrite_content.php:274 +msgid "b.) In modules or plugins" +msgstr "" + +#: includes/include.mod_rewrite_content.php:275 +msgid "" +"By using this option, all Clean-URLs will be generated directly in module or " +"plugins.
    This means, all areas in modules/plugins, who generate " +"internal URLs to categories/articles, have to be adapted manually.
    All " +"Clean-URLs have to be generated by using following function:" +msgstr "" + +#: includes/include.mod_rewrite_content.php:276 +msgid "" +"# structure of a normal url\n" +"$url = 'front_content.php?idart=123&lang=2&client=1';\n" +"\n" +"# creation of a url by using the Contenidos Url-Builder (since 4.8.9),\n" +"# wich expects the parameter as a assoziative array\n" +"$params = array('idart'=>123, 'lang'=>2, 'client'=>1);\n" +"$newUrl = Contenido_Url::getInstance()->build($params);" +msgstr "" + +#: includes/include.mod_rewrite_content.php:277 +msgid "Differences to variant a.)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:278 +msgid "" +"The default way to generate URLs to fronend pages\n" +"Each URL in modules/plugins has to be generated by UrlBuilder\n" +"Each generated Clean-Url requires a database query" +msgstr "" + +#: includes/include.mod_rewrite_content.php:281 +msgid "Routing" +msgstr "" + +#: includes/include.mod_rewrite_content.php:282 +msgid "Routing definitions for incoming URLs" +msgstr "" + +#: includes/include.mod_rewrite_content.php:283 +msgid "Type one routing definition per line as follows:" +msgstr "" + +#: includes/include.mod_rewrite_content.php:284 +msgid "" +"# {incoming_url}>>>{new_url}\n" +"/incoming_url/name.html>>>new_url/new_name.html\n" +"\n" +"# route a specific incoming url to a new page\n" +"/campaign/20_percent_on_everything_except_animal_food.html>>>front_content." +"php?idcat=23\n" +"\n" +"# route request to wwwroot to a specific page\n" +"/>>>front_content.php?idart=16" +msgstr "" + +#: includes/include.mod_rewrite_content.php:285 +msgid "" +"The routing does not sends a HTTP header redirection to the destination URL, " +"the redirection will happen internally by
    replacing the detected " +"incoming URL against the new destination URL (overwriting of article- " +"categoryid)\n" +"Incoming URLs can point to non existing resources (category/article), but " +"the desttination URLs should point
    to valid Contenido articles/" +"categories\n" +"Destination URLs should point to real URLs to categories/articles,
    e. g." +"front_content.php?idcat=23 or front_content.php?idart=34\n" +"The language id should attached to the URL in multi language sites
    e. " +"g. front_content.php?idcat=23&lang=1\n" +"The client id should attached to the URL in multi client sites sharing the " +"same folder
    e. g. front_content.php?idcat=23&client=2\n" +"The destination URL should not start with '/' or './' (wrong: /front_content." +"php, correct: front_content.php)" +msgstr "" + +#: includes/include.mod_rewrite_content.php:288 +#: includes/include.mod_rewrite_contentexpert.php:128 +msgid "Discard changes" +msgstr "" + +#: includes/include.mod_rewrite_content.php:289 +#: includes/include.mod_rewrite_contentexpert.php:129 +msgid "Save changes" +msgstr "" + +#: includes/include.mod_rewrite_contenttest.php:73 +msgid "" +"Define options to genereate the URLs by using the form below and run the " +"test." +msgstr "" + +#: includes/include.mod_rewrite_contenttest.php:74 +msgid "Parameter to use" +msgstr "" + +#: includes/include.mod_rewrite_contenttest.php:75 +msgid "Number of URLs to generate" +msgstr "" + +#: includes/include.mod_rewrite_contenttest.php:76 +msgid "Run test" +msgstr "" + +#: includes/include.mod_rewrite_contenttest.php:78 +msgid "" +"{pref}{name}\n" +"{pref}Builder in: {url_in}\n" +"{pref}Builder out: {url_out}\n" +"{pref}Resolved URL: {url_res}\n" +"{pref}Resolved data: {data}" +msgstr "" + +#: includes/include.mod_rewrite_contenttest.php:84 +msgid "" +"Duration of test run: {time} seconds.
    \n" +"Number of processed URLs: {num_urls}
    \n" +"Successful resolved: {num_success}
    \n" +"Errors during resolving: {num_fail}" +msgstr "" + +#: includes/config.plugin.php:176 +msgid "MR-Options" +msgstr "" + +#: includes/config.plugin.php:177 +msgid "Expert Options" +msgstr "" + +#: includes/config.plugin.php:178 +msgid "MR Test Area" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:80 +msgid "Plugin functions" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:82 +msgid "Copy/Download .htaccess template" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:83 +msgid "Select .htaccess template" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:84 +msgid "Restrictive .htaccess" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:85 +msgid "Simple .htaccess" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:86 +msgid "" +"Contains rules with restrictive settings.
    \n" +"All requests pointing to extension avi, css, doc, flv, gif, gzip, ico, jpeg, " +"jpg, js, mov,
    \n" +"mp3, pdf, png, ppt, rar, txt, wav, wmv, xml, zip, will be excluded vom " +"rewriting.
    \n" +"Remaining requests will be rewritten to front_content.php,
    \n" +"except requests to 'contenido/', 'setup/', 'cms/upload', 'cms/front_content." +"php', etc.
    \n" +"Each resource, which has to be excluded from rewriting must be specified " +"explicitly." +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:93 +msgid "" +"Contains a sipmle collection of rules. Each requests pointing to valid " +"symlinks, folders or
    \n" +"files, will be excluded from rewriting. Remaining requests will be rewritten " +"to front_content.php" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:96 +msgid "and copy to" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:97 +msgid "Contenido installation directory" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:98 +msgid "" +"Copy the selected .htaccess template into Contenido installation " +"directory
    \n" +"
    \n" +"    {CONTENIDO_FULL_PATH}.
    \n" +"
    \n" +"This is the recommended option for a Contenido installation with one or more " +"clients
    \n" +"who are running on the same domain." +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:105 +msgid "client directory" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:106 +msgid "" +"Copy the selected .htaccess template into client's directory
    \n" +"
    \n" +"    {CLIENT_FULL_PATH}.
    \n" +"
    \n" +"This is the recommended option for a multiple client system
    \n" +"where each client has it's own domain/subdomain" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:113 +msgid "or" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:114 +msgid "Download" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:115 +msgid "" +"Download selected .htaccess template to copy it to the destination " +"folder
    \n" +"or to take over the settings manually." +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:118 +msgid "Reset category-/ and article aliases" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:119 +msgid "Reset only empty aliases" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:120 +msgid "" +"Only empty aliases will be reset, existing aliases, e. g. manually set " +"aliases, will not be changed." +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:121 +msgid "Reset all aliases" +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:122 +msgid "" +"Reset all category-/article aliases. Existing aliases will be overwritten." +msgstr "" + +#: includes/include.mod_rewrite_contentexpert.php:124 +msgid "" +"This process could require some time depending on amount of categories/" +"articles.
    \n" +"The aliases will not contain the configured plugin separators, but the " +"Contenido default separators '/' und '-', e. g. '/category-word/article-" +"word'.
    \n" +"Execution of this function ma be helpful to prepare all or empty aliases for " +"the usage by the plugin." +msgstr "" diff --git a/conlite/plugins/mod_rewrite/locale/potfiles.txt b/conlite/plugins/mod_rewrite/locale/potfiles.txt new file mode 100644 index 0000000..597ffc9 --- /dev/null +++ b/conlite/plugins/mod_rewrite/locale/potfiles.txt @@ -0,0 +1,22 @@ +./classes/class.modrewriteurlutil.php +./classes/class.modrewriteurlstack.php +./classes/class.modrewritecontroller.php +./classes/class.modrewritedebugger.php +./classes/class.modrewrite.php +./classes/controller/class.modrewrite_controller_abstract.php +./classes/controller/class.modrewrite_content_controller.php +./classes/controller/class.modrewrite_contentexpert_controller.php +./classes/controller/class.modrewrite_contenttest_controller.php +./classes/class.modrewritebase.php +./classes/class.modrewritetest.php +./external/aToolTip/demos.html +./templates/contenttest.html +./templates/contentexpert.html +./templates/content.html +./includes/functions.mod_rewrite.php +./includes/include.mod_rewrite_content.php +./includes/config.mod_rewrite_default.php +./includes/include.mod_rewrite_contenttest.php +./includes/config.plugin.php +./includes/front_content_controller.php +./includes/include.mod_rewrite_contentexpert.php diff --git a/conlite/plugins/mod_rewrite/readme.txt b/conlite/plugins/mod_rewrite/readme.txt new file mode 100644 index 0000000..1ce678f --- /dev/null +++ b/conlite/plugins/mod_rewrite/readme.txt @@ -0,0 +1,294 @@ +Advanced Mod Rewrite Plugin fr Contenido >= 4.8.15 + +################################################################################ +TOC (Table of contents) + +- BESCHREIBUNG +- CHANGELOG +- BEKANNTE BUGS +- FEATURES +- VORAUSSETZUNGEN +- INSTALLATION +- FAQ +- ADVANCED MOD REWRITE THEMEN IM CONTENIDO FORUM +- SCHLUSSBEMERKUNG + + + +################################################################################ +BESCHREIBUNG + +Das Plugin Advanced Mod Rewrite ist eine Erweiterung fr das Contenido-CMS zur Generierung von +alternativen URLs. + +Normalerweise werden die URLs zu Seiten einer auf ein CMS (z. B. Contenido) basierenden +Webprsenz nach dem Muster "/index.php?page=12&language=de" generiert, also in Form von +dynamischen URLs. Eine Mglichkeit solche dynamische URLs zu Webseiten, deren Inhalt in der Regel +aus Datenbanken kommen, gegen statische URLs wie z. B. "/de/page-name.html" umzustellen, gibt es in +Kombination mit dem Apache mod_rewrite-Modul. Dabei werden die URLs zu den Seiten als sogenannte +"Clean URLs" ausgegeben, Requests zur der gewnschten Ressource werden vom Webserver nach +definierten Regeln verarbeitet und intern an die Webanwendung weitergeleitet. + +Solche statische URLs knnen aufgrund der Keyworddichte (die Ressource beschreibende Wrter in der +URL) vorteilhaft fr Suchmaschinen sein und User knnen sich die URLs einfacher merken. + +Bei einer Contenido-Installation lassen sich solche URLs mit dem Advanced Mod Rewrite Plugin +generieren, URLs zu Frontendseiten, wie z. B. "/cms/front_content.php?idart=12&lang=1" werden +vom Plugin als statische URLs wie "/de/page-name.html" ausgegeben. Diverse Einstellungen zum +Ausgabeformat der URLs lassen sich im Contenido-Backend konfigurieren. + +Das Plugin Advanced Mod Rewrite basiert auf die geniale Erweiterung Advanced Mod Rewrite fr +Contenido, welches als Bundle von stese bis zur Contenido Version 4.6.15 entwickelt und betreut +wurde. + +Wichtiger Aspekt bei der Umsetzung war die Implementierung als Plugin mit so wenig wie mglichen +Eingriffen in den Contenido Core (trotzdem ging es nicht ohne einige Anpassungen an bestimmten +Sourcen). + +Daher enthlt das Archiv einige berarbeitete Contenido Sourcen, die eventuell nicht auf dem +neuesten Stand sein knnen. + + + +################################################################################ +CHANGELOG + +2011-04-11 Advanced Mod Rewrite Plugin integration into the Contenido core + + + +################################################################################ +BEKANNTE BUGS + +Urls sollten unbedingt eine Endung wie z. B. '.html' bekommen, da ansonsten die Erkennungsroutine den +Artikel aus der ankommenden URL nicht ermitteln kann. + +Wenn der Clean-URL die Sprache oder der Mandant vorangestellt wird, funktioniert die Fehlererkennung +unter Unstnden nicht richtig, d. h. es gibt keine Weiterleitung zur Fehlerseite, sofern dies im +Plugin eingestellt wurde. + + + +################################################################################ +FEATURES + +- Erstellung Suchmaschinenoptimierter URLs, Contenido interne URLs wie + /front_content.php?idcat=12&idart=34 werden z. B. als /kategoriename/artikelname.html umschrieben +- Untersttzung mehrerer Sprachen +- Untersttzung mehrerer Mandanten im gleichen Verzeichnis +- Umschreiben der URLs entweder bei der Ausgabe des HTML Codes oder beim Generieren des Codes der + Seiten +- Routing von URLs (Umleiten eingehender URLs auf andere Ziel-URLs) + + + +################################################################################ +VORAUSSETZUNGEN + +- Alle Voraussetzungen von Contenido 4.8.x gelten auch fr das Plugin +- PHP ab Version 5.1 (Das Plugin war bis Version 0.3.3 PHP 4.4.x kompatibel) +- Apache HTTP Server 2 mit Mod Rewrite + + + +################################################################################ +INSTALLATION + +Das Plugin kann im Contenido Setupprocess installiert werden. + +################################################################################ +WICHTIGES ZUM INHALT + +ALLGEMEIN +========= + +.htaccess: +---------- +Die Konfiguration des Apache, in der das mod_rewrite-Modul aktiviert und mit diversen Anweisungen +konfiguriert wird. Die Einstellungen bewirken, dass ankommende Anfragen wie z. B. +/kategorie/artikel.html an die front_content.php im Mandantenverzeichnis weitergeleitet werden. + +Die .htaccess liegt nicht im Contenido Installationsverzeichnis vor, es muss entweder dorthin +kopiert oder eine vorhanene .htaccess Datei angepasst werden. + +Als Vorlage existieren folgende 2 Versionen der .htaccess: + +htaccess_restrictive.txt: +Enthlt Regeln mit restriktiveren Einstellungen. +Alle Anfragen, die auf die Dateienendung js, ico, gif, jpg, jpeg, png, css, pdf gehen, werden vom +Umschreiben ausgeschlossen. Alle anderen Anfragen, werden an front_content.php umschrieben. +Ausgeschlossen davon sind 'contenido/', 'setup/', 'cms/upload', 'cms/front_content.php', usw. +Jede neue Ressource, die vom Umschreiben ausgeschlossen werden soll, muss explizit definiert werden. + +htaccess_simple.txt: +Enthlt eine einfachere Sammlung an Regeln. Alle Anfragen, die auf gltige symlinks, Verzeichnisse oder +Dateien gehen, werden vom Umschreiben ausgeschlossen. Restliche Anfragen werden an front_content.php +umschrieben. + + +contenido/plugins/mod_rewrite/*: +-------------------------------- +Die Sourcen des Plugins. + +contenido/classes/UrlBuilder/Contenido_UrlBuilder_MR.class.php: +--------------------------------------------------------------- +UrlBuilder Klasse des Plugins (seit Version 0.4.0), zum Generieren der URLs anhand der Pluginkonfiguration. +Verwendet die in den Contenido Core implementierte UrlBuilder-Funktionalitt und erweitert diesen um die +pluginspezifischen Features. + + +################################################################################ +FAQ + +Der Plugininstaller lsst sich nicht aufrufen, wie kann ich dennoch das Plugin installieren? +-------------------------------------------------------------------------------------------- +Normalerweise wird der Plugininstaller mit folgender URL aufgerufen: +http://localhost/contenido/plugins/mod_rewrite/install.php +("http://localhost/" ist eventuell gegen anderen virtual Host oder Domainnamen ersetzen) + +Es erscheint das Anmeldeformular zum Backend, ber den man sich am System anmelden kann. Nach +erfolgreicher Anmeldung wird man normalerweise zum Plugininstaller weitergeleitet. + +Manchmal kann es vorkommen, dass die Weiterleitung nach der Anmeldung nicht klappt und man nicht den +Plugininstaller aufrufen kann. +Um dennoch den Installer aufzurufen, reicht es aus, der URL die aktuell gltige Contenido Session ID +anzuhngen, z. B. /contenido/plugins/mod_rewrite/install.php?contenido={my_session_id}. + + +Wie teste ich, ob mod_rewrite am Server richtig konfiguriert ist? +----------------------------------------------------------------- +Obwohl mod_rewrite am Server installiert ist, kommt es manchmal vor, dass es nicht funktioniert. + +Das kann einfach getestet werden, erstelle eine .htaccess im Rootverzeichnis und schreibe folgendes +rein: +[code] +RewriteEngine on +RewriteRule ^ http://www.contenido.org [R,L] +[/code] + +Nach Eingabe der URL in die Adresszeile des Browsers, sollte auf www.contenido.org weitergeleitet +werden. +Wenn nicht, dann kann eines der folgenden Punkte der Grund dafr sein: +Das mod_rewrite Modul ist nicht geladen, das ist in der httpd.conf zu setzen +[code] +LoadModule rewrite_module modules/mod_rewrite.so +[/code] + +Die Direktive "AllowOverride" ist nicht korrekt gesetzt. Damit die Angaben in der .htaccess auch +bentzt werden knnen, muss fr das betreffende Verzeichnis die Direktive "AllowOverride" in der +httpd.conf angegeben werden: +[code] +# Beispielkonfiguration + + AllowOverride FileInfo + +[/code] + + +Wie richte ich Advanced Mod Rewrite fr eine Contenidoinstallation in einem Unterverzeichnis ein? +------------------------------------------------------------------------------------------------- + +Als Beispiel gehen wir davon aus, dass Contenido im Verzeichnis /mypage/ unterhalb vom Webroot +installiert wurde und das Mandantenverzeichnis per default /mypage/cms/ ist. + +In der Pluginkonfiguration (Backend) den Pfad zur .htaccess Datei (aus Sicht des Web-Browsers) +folgendermaen anpassen: +[code] +/mypage/ +[/code] + +Die /mypage/.htaccess ffnen und die RewriteBase folgendermaen anpassen: +[code] +RewriteBase /mypage/cms/ +[/code] + + +Welche Einstellungen sind ntig, wenn das Mandantenverzeichnis das wwwroot ist? +------------------------------------------------------------------------------- +Normalerweise liegt das Mandantenverzeichnis innerhalb des wwwroot und ist ber +http://domain.tld/cms/front_content.php erreichbar. +Manchmal ist es erwnscht, dass der Ordner /cms/ in der URL nicht sichbar sein soll, also +erreichbar ber http://domain.tld/front_content.php. + +In diesem Fall sind zwei Anpassungen ntig, damit Mod Rewrite korrekt funktioniert: +1. Die .htaccess Datei in das Verzeichnis /cms/ kopieren, da die Datei im wwwroot sein muss. +2. In der .htaccess die RewriteBase Option anpassen + +# von +RewriteBase /cms + +# auf +RewriteBase / + + +Wie kann ich das Verarbeiten bestimmter Seiten vom Plugin unterbinden? +---------------------------------------------------------------------- +Wenn das Plugin so konfiguriert wurde, dass die URLs bei der Ausgabe des HTML Codes der Seite +angepasst werden, kann dieses Verhalten bei manchen Seiten unerwnscht sein. Das kann bei einer +Ausgabe der Fall sein, dessen Inhalt kein HTML ist (z. B. Dateidownload), dann macht es keinen Sinn, +die Ausgabe anzupassen. + +Ab Contenido 4.8.8 gibt es eine neue Einstellung, mit der man unterbinden kann, dass die Ausgabe im +Frontend nicht in den Ausgabepuffer geschrieben wird. Ist dies fr eine Seite definiert worden, wird +auch die Funktion vom Plugin, die die URLs anpasst, nicht ausgefhrt. + +Einstellen lsst sich das ber Mandanteneinstellungen wie folgt: +[code] +Typ Name Wert +frontend.no_outputbuffer idart 12,14,40 +[/code] +Inhalte der Artikel mit der id 12, 14 und 40 werden dann von der Ausgabepufferung ausgeschlossen. + + +Warum werden URLs trotz richtiger Vorraussetzungen nicht umschrieben? +--------------------------------------------------------------------- +Ist die .htaccess und die Konfiguration des Plugins als Fehlerquelle auszuschlieen und das Plugin +soll die URLs bei der Ausgabe der Seite umschreiben (Standardeinstellung), knnte ein vorzeitig +geleerter Ausgabepuffer der Grund sein. + +In der front_content.php wird der HTML-Code in den Ausgabepuffer geschrieben, damit der Code vor der +endgltigen Ausgabe bearbeitet werden kann. Das Plugin fgt der Chain +"Contenido.Frontend.HTMLCodeOutput" eine eigene Funktion, die den Code aus dem Ausgabepuffer erhlt, +um die darin URLs zu umschreiben. + +Wird aber der Ausgabepuffer vorher geleert, z. B. durch Verwendung von ob_flush() in einem Modul, +wird der Code direkt an den Client rausgeschickt. Das hat den Effekt, dass in der front_content.php +kein Code mehr aus dem Ausgabepuffer zur Verfgung steht, der nicht weiterverarbeitet werden kann, +auch das Plugin kann dann keine URLs umschreiben. + + +Alle URLs zu Kategorien werden mit / oder /index.html umschrieben: +------------------------------------------------------------------ +Ist Contenido mit der Konfiguration $cfg["is_start_compatible"] = true; +(siehe contenidoincludes/config.php) eingestellt, um die Startartikeldefinition in Kategorien +kompatibel zu lteren Contenido-Versionen halten, kann das Plugin die URLs zu Kategorien nicht +generieren, weil es diese Konfiguration nicht untersttzt. + +Die einfachste Lsung ist, die Konfiguration $cfg["is_start_compatible"] auf false zu setzen und im +Backend in den vorhandenen Kategorien erneut die Startartikel zu setzen. + + + +################################################################################ +ADVANCED MOD REWRITE THEMEN IM CONTENIDO FORUM + +Plugin Advanced Mod Rewrite fr Contenido 4.8.x: +http://www.contenido.de/forum/viewtopic.php?t=21578 + +Original Advanced Mod Rewrite 4.6.23: +http://www.contenido.de/forum/viewtopic.php?t=18454 + +Original Advanced Mod Rewrite 4.6.15: +http://www.contenido.de/forum/viewtopic.php?t=11162 + +Advanced Mod Rewriting Contenido 4.4.4: +http://www.contenido.de/forum/viewtopic.php?t=6713 + + + +################################################################################ +SCHLUSSBEMERKUNG + +Benutzung des Plugins auf eigene Gefahr! + +Murat Purc, murat@purc.de diff --git a/conlite/plugins/mod_rewrite/scripts/mod_rewrite.js b/conlite/plugins/mod_rewrite/scripts/mod_rewrite.js new file mode 100644 index 0000000..43b4d2c --- /dev/null +++ b/conlite/plugins/mod_rewrite/scripts/mod_rewrite.js @@ -0,0 +1,87 @@ +/** + * Project: + * Contenido Content Management System + * + * Description: + * Plugin Advanced Mod Rewrite JavaScript functions. + * + * Requirements: + * @con_php_req 5.0 + * + * + * @package Contenido Backend plugins + * @version 0.1 + * @author Murat Purc + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: mod_rewrite.js 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +var mrPlugin = { + lng: { + more_informations: "More informations" + }, + + toggle: function(id) { + // do some animation ;-) + $('#' + id).slideToggle("slow"); + }, + + showReadme: function() { + }, + + initializeSettingsPage: function() { + $(document).ready(function() { + $("#mr_use_language").click(function() { + $("#mr_use_language_name").attr("disabled", ($(this).attr("checked") ? "" : "disabled")); + }); + + $("#mr_use_client").click(function() { + $("#mr_use_client_name").attr("disabled", ($(this).attr("checked") ? "" : "disabled")); + }); + + $("#mr_add_startart_name_to_url").click(function() { + $("#mr_default_startart_name").attr("disabled", ($(this).attr("checked") ? "" : "disabled")); + if ($(this).attr("checked")) { + $("#mr_default_startart_name").removeClass("disabled"); + } else { + $("#mr_default_startart_name").addClass("disabled"); + } + }); + + mrPlugin._initializeTooltip(); + }); + }, + + initializeExterpPage: function() { + $(document).ready(function() { + mrPlugin._initializeTooltip(); + }); + }, + + _initializeTooltip: function() { + $(".mrPlugin a.i-link").each(function () { + $(this).attr("href", "javascript:void(0);"); + $(this).attr("title", mrPlugin.lng.more_informations); + var id = $(this).attr("id").substring(0, $(this).attr("id").indexOf("-link")); + $(this).aToolTip({ + clickIt: true, + xOffset: -20, + yOffset: 4, + outSpeed: 250, + tipContent: $("#" + id).html() + }); + }); + } +}; + diff --git a/conlite/plugins/mod_rewrite/styles/styles.css b/conlite/plugins/mod_rewrite/styles/styles.css new file mode 100644 index 0000000..6ad9035 --- /dev/null +++ b/conlite/plugins/mod_rewrite/styles/styles.css @@ -0,0 +1,100 @@ +/** + * Project: + * Contenido Content Management System + * + * Description: + * Plugin Advanced Mod Rewrite JavaScript functions. + * + * Requirements: + * @con_php_req 5.0 + * + * + * @package Contenido Backend plugins + * @version 0.1 + * @author Murat Purc + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since Contenido release 4.8.15 + * + * {@internal + * created 2011-04-11 + * + * $Id: styles.css 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +/** + * mrPlugin main page + * @section mrPlugin + */ + +body.mrPlugin {margin:10px;} + +.mrPlugin a {color:#0060b1;} +.mrPlugin strong {font-weight:bold;} +.mrPlugin img {border:none;} + +.mrPlugin pre.example {padding:3px 5px; border:1px #000 dashed; width:60%; min-width:650px;} + +.mrPlugin li {padding-bottom:0.4em;} + +.mrPlugin span.note {color:red;} +.mrPlugin input.disabled {background-color:#dadada;} + +.mrPlugin .altBg {background-color:#f1f1f1;} +.mrPlugin .aToolTip ul {padding-left:1em;} +.mrPlugin .clear {clear:both; font-size:0pt !important; height:0pt !important; line-height:0pt !important;} +.mrPlugin .blockLeft {display:block; float:left;} +.mrPlugin .blockRight {display:block; float:right;} + + +/* Header box */ +.mrPlugin .headerBox {background-color:#e2e2e2; border:1px solid #b5b5b5; padding:6px; margin-bottom:10px;} +.mrPlugin .headerBox p {margin:0; padding:0;} +.mrPlugin .headerBox ul {margin-bottom:0;} + + +/* Content table */ +.mrPlugin table#contenttable {border:0; border-top:1px; border-left:1px; border-bottom:1px; border-color:#b3b3b3; border-style:solid;} +.mrPlugin table#contenttable th {font-weight:bold; text-align:left;} +.mrPlugin table#contenttable tr {background-color:#fff;} +.mrPlugin th, .mrPlugin td {vertical-align:top;} +.mrPlugin td.col-I {border:0; border-bottom:1px; border-right:1px; border-color:#b3b3b3; border-style:solid;} +.mrPlugin td.col-II {border:0; border-bottom:1px; border-right:1px; border-color:#b3b3b3; border-style:solid;} + +.mrPlugin tr.marked td {background-color:#f2b7a1;} + + +/* Info button */ +.mrPlugin a.infoButton, +.mrPlugin a.infoButton:hover {display:block; float:left; width:16px; height:16px; background:transparent url(../../../images/info.gif) no-repeat; margin:0 0 0 5px;} +.mrPlugin a.infoButton.v2, +.mrPlugin a.infoButton:hover.v2 {margin-top:2px;} + + +/* Plugininfo layer */ +.mrPlugin .pluginInfo {} +.mrPlugin .pluginInfo p {font-weight:bold; margin:0; padding:0;} +.mrPlugin .pluginInfo ul {margin:0; padding:0; list-style-type:none;} +.mrPlugin .pluginInfo li {margin:0; padding:0;} +.mrPlugin .pluginInfo li.first {margin-top:0.6em;} + + + +/** + * mrPlugin test page + * @section mrPluginTest + */ + +/** @extends body.mrPlugin */ +body.mrPluginTest {} + +.mrPluginTest .headerBox form {float:left; width:35%; background:#e2e2e2; margin:0; padding-top:10px;} +.mrPluginTest .headerBox fieldset {margin-bottom:10px;} +.mrPluginTest .headerBox fieldset p {margin:0;} +.mrPluginTest .headerBox form .chk {width:24%; float:left;} +.mrPluginTest a {font-family:monospace;} diff --git a/conlite/plugins/mod_rewrite/templates/content.html b/conlite/plugins/mod_rewrite/templates/content.html new file mode 100644 index 0000000..aea348f --- /dev/null +++ b/conlite/plugins/mod_rewrite/templates/content.html @@ -0,0 +1,366 @@ + + + + mod_rewrite_content + + + + + + + + + + + + + + +
    +
    +
    Plugin Advanced Mod Rewrite +
    + +
    +
    + +{CONTENT_BEFORE} + +
    + + + + + + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {LNG_PLUGIN_SETTINGS}
    +
    + {LNG_NOTE}
    + {LNG_MSG_NO_HTACCESS_FOUND}
    +
    +
    +
    + + +
    +
    + +
    {LNG_ROOTDIR} + {ROOTDIR_ERROR} + +
    + +
    +
    + + +
    +
    + +
    {LNG_STARTFROMROOT} +
    + + +
    +
    + +
    {LNG_USE_CLIENT} + +
    +
    + +
    +
    {LNG_USE_LANGUAGE} + +
    +
    + +
    +
    + {LNG_USERDEFINED_SEPARATORS_HEADER} +
    + +
    {LNG_CATEGORY_SEPARATOR} + {CATEGORY_SEPARATOR_ERROR} + + {LNG_CATART_SEPARATOR_INFO} +
    {LNG_CATEGORY_WORD_SEPARATOR} + {CATEGORY_WORD_SEPARATOR_ERROR} + + {LNG_WORD_SEPARATOR_INFO} +
    {LNG_ARTICLE_SEPARATOR} + {ARTICLE_SEPARATOR_ERROR} + + {LNG_CATART_SEPARATOR_INFO} +
    {LNG_ARTICLE_WORD_SEPARATOR} + {ARTICLE_WORD_SEPARATOR_ERROR} + + {LNG_WORD_SEPARATOR_INFO} +
    {LNG_ADD_STARTART_NAME_TO_URL} + {ADD_STARTART_NAME_TO_URL_ERROR} + +
    +
    +
    +
    + +
    +
    + +
    {LNG_FILE_EXTENSION} + {FILE_EXTENSION_ERROR} +
    +
    +
    +
    + +

    {LNG_FILE_EXTENSION_INFO3}

    +
    {LNG_USE_LOWERCASE_URI} + + +
    {LNG_PREVENT_DUPLICATED_CONTENT} +
    +
    +
    +
    + +
    {LNG_CATEGORY_RESOLVE_MIN_PERCENTAGE} + {CATEGORY_RESOLVE_MIN_PERCENTAGE_ERROR} +
    + (0 - 100) +
    +
    + +
    {LNG_REDIRECT_INVALID_ARTICLE_TO_ERRORSITE} +
    + +
    +
    +
    + +
    {LNG_REWRITE_URLS_AT} +
    + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    {LNG_REWRITE_ROUTING} +
    {LNG_REWRITE_ROUTING_INFO}
    +
    + + +
    + + + +
    + +
    + +{CONTENT_AFTER} + + + \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/templates/contentexpert.html b/conlite/plugins/mod_rewrite/templates/contentexpert.html new file mode 100644 index 0000000..e286563 --- /dev/null +++ b/conlite/plugins/mod_rewrite/templates/contentexpert.html @@ -0,0 +1,153 @@ + + + + mod_rewrite_content_expert + + + + + + + + + + + + + + +
    +{LNG_PLUGIN_FUNCTIONS} +
    + +{CONTENT_BEFORE} + +
    + + + + + + + + ++ + + + + + + + + + + + + + + + + + + + + +
    {LNG_COPY_HTACCESS_TYPE} + {COPY_HTACCESS_ERROR} + +
    + +
    + + +
    +
    + + {LNG_COPY_HTACCESS_TO}
    +
    + + {LNG_COPY_HTACCESS_TO_CONTENIDO} +
    + +
    + + + {LNG_COPY_HTACCESS_TO_CLIENT} +
    + +
    + + {LNG_OR}
    +
    + + {LNG_DOWNLOAD} +
    + +
    + +
    +
    + {LNG_RESETALIASES} + + + {LNG_RESETEMPTY_LINK} +
    + +
    + + + {LNG_RESETALL_LINK} +
    + +
    + {LNG_NOTE}:
    + {LNG_RESETALIASES_NOTE} +
    + + + +
    + +
    + +{CONTENT_AFTER} + + + \ No newline at end of file diff --git a/conlite/plugins/mod_rewrite/templates/contenttest.html b/conlite/plugins/mod_rewrite/templates/contenttest.html new file mode 100644 index 0000000..2b5035b --- /dev/null +++ b/conlite/plugins/mod_rewrite/templates/contenttest.html @@ -0,0 +1,64 @@ + + + + mod_rewrite_content_test + + + + + + + + + + + + +
    +

    {LNG_FORM_INFO}

    +

    + + + +
    + {LNG_FORM_LABEL} +

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + +{CONTENT} + + + diff --git a/conlite/plugins/mod_rewrite/xml/lang_de_DE.xml b/conlite/plugins/mod_rewrite/xml/lang_de_DE.xml new file mode 100644 index 0000000..219aeeb --- /dev/null +++ b/conlite/plugins/mod_rewrite/xml/lang_de_DE.xml @@ -0,0 +1,14 @@ + + + + + + +
    AMR
    + Einstellungen + Funktionen + Test +
    +
    +
    +
    diff --git a/conlite/plugins/mod_rewrite/xml/lang_en_US.xml b/conlite/plugins/mod_rewrite/xml/lang_en_US.xml new file mode 100644 index 0000000..e97222b --- /dev/null +++ b/conlite/plugins/mod_rewrite/xml/lang_en_US.xml @@ -0,0 +1,14 @@ + + + + + + +
    AMR
    + Settings + Functions + Test +
    +
    +
    +
    diff --git a/conlite/plugins/newsletter/check.plugin.xml b/conlite/plugins/newsletter/check.plugin.xml new file mode 100644 index 0000000..e513f8f --- /dev/null +++ b/conlite/plugins/newsletter/check.plugin.xml @@ -0,0 +1,73 @@ + + + + Newsletter + newsletter + 88783B7D-9C64-A284-9A70-721F09BF7FE4 + Newsletter System for CONTENIDO + Bjoern Behrens + four for business AG + info@4fb.de + http://www.4fb.de + 0.1.0 + + + + + + + news + news_edit + recipients + recipientgroups + news_jobs + recipients_import + + + news_save + news_create + news_delete + news_duplicate + news_add_job + news_send_test + news_job_delete + news_job_details + news_job_detail_delete + news_html_settings + news_job_run + recipients_save + recipients_create + recipients_delete + recipientgroup_delete + recipientgroup_create + recipientgroup_recipient_delete + recipientgroup_save_group + recipients_purge + recipients_import + recipients_import_exec + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/conlite/plugins/newsletter/classes/class.newsletter.groups.php b/conlite/plugins/newsletter/classes/class.newsletter.groups.php new file mode 100644 index 0000000..928dd5d --- /dev/null +++ b/conlite/plugins/newsletter/classes/class.newsletter.groups.php @@ -0,0 +1,329 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01 + * modified 2008-06-30, Dominik Ziegler, add security fix + * modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting + * + * $Id: class.newsletter.groups.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Recipient group management class + */ +class RecipientGroupCollection extends ItemCollection +{ + /** + * Constructor Function + * @param none + */ + public function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["news_groups"], "idnewsgroup"); + $this->_setItemClass("RecipientGroup"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function RecipientGroupCollection() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Creates a new group + * @param $groupname string Specifies the groupname + * @param $defaultgroup integer Specfies, if group is default group (optional) + */ + public function create($groupname, $defaultgroup = 0) + { + global $client, $lang; + + $client = Contenido_Security::toInteger($client); + $lang = Contenido_Security::toInteger($lang); + + $group = new RecipientGroup(); + + #$_arrInFilters = array('urlencode', 'clHtmlSpecialChars', 'addslashes'); + + $mangledGroupName = $group->_inFilter($groupname); + $this->setWhere("idclient", $client); + $this->setWhere("idlang", $lang); + $this->setWhere("groupname", $mangledGroupName); + $this->query(); + + if ($obj = $this->next()) { + $groupname = $groupname . md5(rand()); + } + + $item = parent::create(); + + $item->set("idclient", $client); + $item->set("idlang", $lang); + $item->set("groupname", $groupname); + $item->set("defaultgroup", $defaultgroup); + $item->store(); + + return $item; + } + + /** + * Overridden delete method to remove groups from groupmember table + * before deleting group + * + * @param $itemID int specifies the newsletter recipient group + */ + public function delete($itemID) + { + $oAssociations = new RecipientGroupMemberCollection; + $oAssociations->setWhere("idnewsgroup", $itemID); + $oAssociations->query(); + + while ($oItem = $oAssociations->next()) { + $oAssociations->delete($oItem->get("idnewsgroupmember")); + } + parent::delete($itemID); + } +} + + +/** + * Single RecipientGroup Item + */ +class RecipientGroup extends Item +{ + /** + * Constructor Function + * @param mixed $mId Specifies the ID of item to load + */ + public function __construct($mId = false) + { + global $cfg; + parent::__construct($cfg["tab"]["news_groups"], "idnewsgroup"); + if ($mId !== false) { + $this->loadByPrimaryKey($mId); + } + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function RecipientGroup($mId = false) + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct($mId); + } + + /** + * Overriden store() method to ensure, that there is only one default group + **/ + public function store() + { + global $client, $lang; + + $client = Contenido_Security::toInteger($client); + $lang = Contenido_Security::toInteger($lang); + + if ($this->get("defaultgroup") == 1) { + $oItems = new RecipientGroupCollection(); + $oItems->setWhere("idclient", $client); + $oItems->setWhere("idlang", $lang); + $oItems->setWhere("defaultgroup", 1); + $oItems->setWhere("idnewsgroup", $this->get("idnewsgroup"), "<>"); + $oItems->query(); + + while ($oItem = $oItems->next()) { + $oItem->set("defaultgroup", 0); + $oItem->store(); + } + } + parent::store(); + } +} + + +/** + * Recipient group member management class + */ +class RecipientGroupMemberCollection extends ItemCollection +{ + /** + * Constructor Function + * @param none + */ + public function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["news_groupmembers"], "idnewsgroupmember"); + $this->_setJoinPartner ('RecipientGroupCollection'); + $this->_setJoinPartner ('RecipientCollection'); + $this->_setItemClass("RecipientGroupMember"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function RecipientGroupMemberCollection() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Creates a new association + * @param $idrecipientgroup int specifies the newsletter group + * @param $idrecipient int specifies the newsletter user + */ + public function create($idrecipientgroup, $idrecipient) + { + $idrecipientgroup = Contenido_Security::toInteger($idrecipientgroup); + $idrecipient = Contenido_Security::toInteger($idrecipient); + + $this->setWhere("idnewsgroup", $idrecipientgroup); + $this->setWhere("idnewsrcp", $idrecipient); + $this->query(); + + if ($this->next()) { + return false; + } + + $oItem = parent::create(); + + $oItem->set("idnewsrcp", $idrecipient); + $oItem->set("idnewsgroup", $idrecipientgroup); + $oItem->store(); + + return $oItem; + } + + /** + * Removes an association + * @param $idrecipientgroup int specifies the newsletter group + * @param $idrecipient int specifies the newsletter user + */ + public function remove($idrecipientgroup, $idrecipient) + { + $idrecipientgroup = Contenido_Security::toInteger($idrecipientgroup); + $idrecipient = Contenido_Security::toInteger($idrecipient); + + $this->setWhere("idnewsgroup", $idrecipientgroup); + $this->setWhere("idnewsrcp", $idrecipient); + $this->query(); + + if ($oItem = $this->next()) { + $this->delete($oItem->get("idnewsgroupmember")); + } + } + + /** + * Removes all associations from any newsletter group + * @param $idrecipient int specifies the newsletter recipient + */ + public function removeRecipientFromGroups($idrecipient) + { + $idrecipient = Contenido_Security::toInteger($idrecipient); + + $this->setWhere("idnewsrcp", $idrecipient); + $this->query(); + + while ($oItem = $this->next()) { + $this->delete($oItem->get("idnewsgroupmember")); + } + } + + /** + * Removes all associations of a newsletter group + * @param $idgroup int specifies the newsletter recipient group + */ + public function removeGroup($idgroup) + { + $idgroup = Contenido_Security::toInteger($idgroup); + + $this->setWhere("idnewsgroup", $idgroup); + $this->query(); + + while ($oItem = $this->next()) { + $this->delete($oItem->get("idnewsgroupmember")); + } + } + + /** + * Returns all recipients in a single group + * @param $idrecipientgroup int specifies the newsletter group + * @param $asObjects boolean specifies if the function should return objects + * @return array RecipientRecipient items + */ + public function getRecipientsInGroup($idrecipientgroup, $asObjects = true) + { + $idrecipientgroup = Contenido_Security::toInteger($idrecipientgroup); + + $this->setWhere("idnewsgroup", $idrecipientgroup); + $this->query(); + + $aObjects = array(); + + while ($oItem = $this->next()) { + if ($asObjects) { + $oRecipient = new Recipient(); + $oRecipient->loadByPrimaryKey($oItem->get("idnewsrcp")); + + $aObjects[] = $oRecipient; + } else { + $aObjects[] = $oItem->get("idnewsrcp"); + } + } + + return ($aObjects); + } +} + + +/** + * Single RecipientGroup Item + */ +class RecipientGroupMember extends Item +{ + /** + * Constructor Function + * @param mixed $mId Specifies the ID of item to load + */ + public function __construct($mId = false) + { + global $cfg; + parent::__construct($cfg["tab"]["news_groupmembers"], "idnewsgroupmember"); + if ($mId !== false) { + $this->loadByPrimaryKey($mId); + } + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function RecipientGroupMember($mId = false) + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct($mId); + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/classes/class.newsletter.jobs.php b/conlite/plugins/newsletter/classes/class.newsletter.jobs.php new file mode 100644 index 0000000..8e2aa31 --- /dev/null +++ b/conlite/plugins/newsletter/classes/class.newsletter.jobs.php @@ -0,0 +1,504 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01 + * modified 2008-06-30, Dominik Ziegler, add security fix + * modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting + * + * $Id: class.newsletter.jobs.php 119 2012-08-07 17:35:39Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Collection management class + */ +class cNewsletterJobCollection extends ItemCollection +{ + /** + * Constructor Function + * @param none + */ + public function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["news_jobs"], "idnewsjob"); + $this->_setItemClass("cNewsletterJob"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function cNewsletterJobCollection() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Creates a newsletter job + * @param $name string Specifies the name of the newsletter, the same name may be used more than once + * @param $idnews integer Newsletter id + */ + public function create($iIDNews, $iIDCatArt, $sName = "") + { + global $client, $lang, $cfg, $cfgClient, $auth; + + $oNewsletter = new Newsletter; + if ($oNewsletter->loadByPrimaryKey($iIDNews)) { + $iIDNews = Contenido_Security::toInteger($iIDNews); + $iIDCatArt = Contenido_Security::toInteger($iIDCatArt); + $lang = Contenido_Security::toInteger($lang); + $client = Contenido_Security::toInteger($client); + $sName = Contenido_Security::escapeDB($sName, null); + + $oItem = parent::create(); + + $oItem->set("idnews", $iIDNews); + $oItem->set("idclient", $client); + $oItem->set("idlang", $lang); + + if ($sName == "") { + $oItem->set("name", $oNewsletter->get("name")); + } else { + $oItem->set("name", $sName); + } + $oItem->set("type", $oNewsletter->get("type")); + $oItem->set("use_cronjob", $oNewsletter->get("use_cronjob")); + + $oLang = new cApiLanguage($lang); + $oItem->set("encoding", $oLang->get("encoding")); + unset ($oLang); + + $oItem->set("idart", $oNewsletter->get("idart")); + $oItem->set("subject", $oNewsletter->get("subject")); + + // Precompile messages + $sPath = $cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$iIDCatArt."&"; + + $sMessageText = $oNewsletter->get("message"); + + // Preventing double lines in mail, you may wish to disable this function on windows servers + if (!getSystemProperty("newsletter", "disable-rn-replacement")) { + $sMessageText = str_replace("\r\n", "\n", $sMessageText); + } + + $oNewsletter->_replaceTag($sMessageText, false, "unsubscribe", $sPath."unsubscribe={KEY}"); + $oNewsletter->_replaceTag($sMessageText, false, "change", $sPath."change={KEY}"); + $oNewsletter->_replaceTag($sMessageText, false, "stop", $sPath."stop={KEY}"); + $oNewsletter->_replaceTag($sMessageText, false, "goon", $sPath."goon={KEY}"); + + $oItem->set("message_text", $sMessageText); + + if ($oNewsletter->get("type") == "text") { + // Text newsletter, no html message + $sMessageHTML = ""; + } else { + // HTML newsletter, get article content + $sMessageHTML = $oNewsletter->getHTMLMessage(); + + if ($sMessageHTML) { + $oNewsletter->_replaceTag($sMessageHTML, true, "name", "MAIL_NAME"); + $oNewsletter->_replaceTag($sMessageHTML, true, "number", "MAIL_NUMBER"); + $oNewsletter->_replaceTag($sMessageHTML, true, "date", "MAIL_DATE"); + $oNewsletter->_replaceTag($sMessageHTML, true, "time", "MAIL_TIME"); + + $oNewsletter->_replaceTag($sMessageHTML, true, "unsubscribe", $sPath."unsubscribe={KEY}"); + $oNewsletter->_replaceTag($sMessageHTML, true, "change", $sPath."change={KEY}"); + $oNewsletter->_replaceTag($sMessageHTML, true, "stop", $sPath."stop={KEY}"); + $oNewsletter->_replaceTag($sMessageHTML, true, "goon", $sPath."goon={KEY}"); + + // Replace plugin tags by simple MAIL_ tags + if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") { + if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $sPlugin) { + plugin_include("recipients", $sPlugin."/".$sPlugin.".php"); + if (function_exists("recipients_".$sPlugin."_wantedVariables")) { + $aPluginVars = array(); + $aPluginVars = call_user_func("recipients_".$sPlugin."_wantedVariables"); + + foreach ($aPluginVars as $sPluginVar) { + $oNewsletter->_replaceTag($sMessageHTML, true, $sPluginVar, "MAIL_".strtoupper($sPluginVar)); + } + } + } + } + } + } else { + // There was a problem getting html message (maybe article deleted) + // Cancel job generation + return false; + } + } + + $oItem->set("message_html", $sMessageHTML); + + $oItem->set("newsfrom", $oNewsletter->get("newsfrom")); + if ($oNewsletter->get("newsfromname") == "") { + $oItem->set("newsfromname", $oNewsletter->get("newsfrom")); + } else { + $oItem->set("newsfromname", $oNewsletter->get("newsfromname")); + } + $oItem->set("newsdate", date("Y-m-d H:i:s"), false); //$oNewsletter->get("newsdate")); + $oItem->set("dispatch", $oNewsletter->get("dispatch")); + $oItem->set("dispatch_count", $oNewsletter->get("dispatch_count")); + $oItem->set("dispatch_delay", $oNewsletter->get("dispatch_delay")); + + // Store "send to" info in serialized array (just info) + $aSendInfo = array(); + $aSendInfo[] = $oNewsletter->get("send_to"); + + switch ($oNewsletter->get("send_to")) { + case "selection": + $oGroups = new RecipientGroupCollection; + $oGroups->setWhere("idnewsgroup", unserialize($oNewsletter->get("send_ids")), "IN"); + $oGroups->setOrder("groupname"); + $oGroups->query(); + #$oGroups->select("idnewsgroup IN ('" . implode("','", unserialize($oNewsletter->get("send_ids"))) . "')", "", "groupname"); + + while ($oGroup = $oGroups->next()) { + $aSendInfo[] = $oGroup->get("groupname"); + } + + unset ($oGroup); + unset ($oGroups); + break; + case "single": + if (is_numeric($oNewsletter->get("send_ids"))) { + $oRcp = new Recipient($oNewsletter->get("send_ids")); + + if ($oRcp->get("name") == "") { + $aSendInfo[] = $oRcp->get("email"); + } else { + $aSendInfo[] = $oRcp->get("name"); + } + $aSendInfo[] = $oRcp->get("email"); + + unset($oRcp); + } + break; + default: + } + $oItem->set("send_to", serialize($aSendInfo), false); + + $oItem->set("created", date("Y-m-d H:i:s"), false); + $oItem->set("author", $auth->auth["uid"]); + $oItem->set("authorname", $auth->auth["uname"]); + unset ($oNewsletter); // Not needed anymore + + // Adds log items for all recipients and returns recipient count + $oLogs = new cNewsletterLogCollection(); + $iRecipientCount = $oLogs->initializeJob($oItem->get($oItem->primaryKey), $iIDNews); + unset ($oLogs); + + $oItem->set("rcpcount", $iRecipientCount); + $oItem->set("sendcount", 0); + $oItem->set("status", 1); // Waiting for sending; note, that status will be set to 9, if $iRecipientCount = 0 in store() method + + $oItem->store(); + + return $oItem; + } else { + return false; + } + } + + /** + * Overridden delete method to remove job details (logs) from newsletter logs table + * before deleting newsletter job + * + * @param $iItemID int specifies the frontend user group + */ + public function delete($iItemID) + { + $oLogs = new cNewsletterLogCollection(); + $oLogs->delete($iItemID); + + parent::delete($iItemID); + } +} + + +/** + * Single NewsletterJob Item + */ +class cNewsletterJob extends Item +{ + /** + * Constructor Function + * @param mixed $mId Specifies the ID of item to load + */ + public function __construct($mId = false) + { + global $cfg; + parent::__construct($cfg["tab"]["news_jobs"], "idnewsjob"); + if ($mId !== false) { + $this->loadByPrimaryKey($mId); + } + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function cNewsletterJob($mId = false) + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct($mId); + } + + public function runJob() + { + global $cfg, $recipient; + + $iCount = 0; + if ($this->get("status") == 2) { + // Job is currently running, check start time and restart if + // started 5 minutes ago + $dStart = strtotime($this->get("started")); + $dNow = time(); + + if (($dNow - $dStart) > (5 * 60)) { + $this->set("status", 1); + $this->set("started", "0000-00-00 00:00:00", false); + + $oLogs = new cNewsletterLogCollection(); + $oLogs->setWhere("idnewsjob", $this->get($this->primaryKey)); + $oLogs->setWhere("status", "sending"); + $oLogs->query(); + + while ($oLog = $oLogs->next()) { + $oLog->set("status", "error (sending)"); + $oLog->store(); + } + } + } + + if ($this->get("status") == 1) { + // Job waiting for sending + $this->set("status", 2); + $this->set("started", date("Y-m-d H:i:s"), false); + $this->store(); + + // Initialization + $aMessages = array(); + + $oLanguage = new cApiLanguage($this->get("idlang")); + $sFormatDate = $oLanguage->getProperty("dateformat", "date"); + $sFormatTime = $oLanguage->getProperty("dateformat", "time"); + unset ($oLanguage); + + if ($sFormatDate == "") { + $sFormatDate = "%d.%m.%Y"; + } + if ($sFormatTime == "") { + $sFormatTime = "%H:%M"; + } + + // Get newsletter data + $sFrom = $this->get("newsfrom"); + $sFromName = $this->get("newsfromname"); + $sSubject = $this->get("subject"); + $sMessageText = $this->get("message_text"); + $sMessageHTML = $this->get("message_html"); + $dNewsDate = strtotime($this->get("newsdate")); + $sEncoding = $this->get("encoding"); + $bIsHTML = false; + if ($this->get("type") == "html" && $sMessageHTML != "") { + $bIsHTML = true; + } + + $bDispatch = false; + if ($this->get("dispatch") == 1) { + $bDispatch = true; + } + + // Single replacements + // Replace message tags (text message) + $sMessageText = str_replace("MAIL_DATE", strftime($sFormatDate, $dNewsDate), $sMessageText); + $sMessageText = str_replace("MAIL_TIME", strftime($sFormatTime, $dNewsDate), $sMessageText); + $sMessageText = str_replace("MAIL_NUMBER", $this->get("rcpcount"), $sMessageText); + + // Replace message tags (html message) + if ($bIsHTML) { + $sMessageHTML = str_replace("MAIL_DATE", strftime($sFormatDate, $dNewsDate), $sMessageHTML); + $sMessageHTML = str_replace("MAIL_TIME", strftime($sFormatTime, $dNewsDate), $sMessageHTML); + $sMessageHTML = str_replace("MAIL_NUMBER", $this->get("rcpcount"), $sMessageHTML); + } + + // Enabling plugin interface + $bPluginEnabled = false; + if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") { + $bPluginEnabled = true; + $aPlugins = array(); + + if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $sPlugin) { + plugin_include("recipients", $sPlugin."/".$sPlugin.".php"); + if (function_exists("recipients_".$sPlugin."_wantedVariables")) { + $aPlugins[$sPlugin] = call_user_func("recipients_".$sPlugin."_wantedVariables"); + } + } + } + } + + // Get recipients (from log table) + if (!is_object($oLogs)) { + $oLogs = new cNewsletterLogCollection; + } else { + $oLogs->resetQuery(); + } + $oLogs->setWhere("idnewsjob", $this->get($this->primaryKey)); + $oLogs->setWhere("status", "pending"); + + if ($bDispatch) { + $oLogs->setLimit(0, $this->get("dispatch_count")); + } + + $oLogs->query(); + while ($oLog = $oLogs->next()) { + $iCount++; + $oLog->set("status", "sending"); + $oLog->store(); + + $sRcpMsgText = $sMessageText; + $sRcpMsgHTML = $sMessageHTML; + + $sKey = $oLog->get("rcphash"); + $sEMail = $oLog->get("rcpemail"); + $bSendHTML = false; + if ($oLog->get("rcpnewstype") == 1) { + $bSendHTML = true; // Recipient accepts html newsletter + } + + if (strlen($sKey) == 30) { // Prevents sending without having a key + $sRcpMsgText = str_replace("{KEY}", $sKey, $sRcpMsgText); + $sRcpMsgText = str_replace("MAIL_MAIL", $sEMail, $sRcpMsgText); + $sRcpMsgText = str_replace("MAIL_NAME", $oLog->get("rcpname"), $sRcpMsgText); + + // Replace message tags (html message) + if ($bIsHTML && $bSendHTML) { + $sRcpMsgHTML = str_replace("{KEY}", $sKey, $sRcpMsgHTML); + $sRcpMsgHTML = str_replace("MAIL_MAIL", $sEMail, $sRcpMsgHTML); + $sRcpMsgHTML = str_replace("MAIL_NAME", $oLog->get("rcpname"), $sRcpMsgHTML); + } + + if ($bPluginEnabled) { + // Don't change name of $recipient variable as it is used in plugins! + $recipient = new Recipient(); + $recipient->loadByPrimaryKey($oLog->get("idnewsrcp")); + + foreach ($aPlugins as $sPlugin => $aPluginVar) { + foreach ($aPluginVar as $sPluginVar) { + // Replace tags in text message + $sRcpMsgText = str_replace("MAIL_".strtoupper($sPluginVar), call_user_func("recipients_".$sPlugin."_getvalue", $sPluginVar), $sRcpMsgText); + + // Replace tags in html message + if ($bIsHTML && $bSendHTML) { + $sRcpMsgHTML = str_replace("MAIL_".strtoupper($sPluginVar), call_user_func("recipients_".$sPlugin."_getvalue", $sPluginVar), $sRcpMsgHTML); + } + } + } + unset($recipient); + } + + $oMail = new PHPMailer(); + $oMail->CharSet = $sEncoding; + $oMail->IsHTML($bIsHTML && $bSendHTML); + $oMail->From = $sFrom; + $oMail->FromName = $sFromName; + $oMail->AddAddress($sEMail); + $oMail->Mailer = "mail"; + $oMail->Subject = $sSubject; + + if ($bIsHTML && $bSendHTML) { + $oMail->Body = $sRcpMsgHTML; + $oMail->AltBody = $sRcpMsgText."\n\n"; + } else { + $oMail->Body = $sRcpMsgText."\n\n"; + } + + if ($oMail->Send()) { + $oLog->set("status", "successful"); + $oLog->set("sent", date("Y-m-d H:i:s"), false); + } else { + $oLog->set("status", "error (sending)"); + } + } else { + $oLog->set("status", "error (key)"); + } + $oLog->store(); + } + + $this->set("sendcount", $this->get("sendcount") + $iCount); + + if ($iCount == 0 || !$bDispatch) { + // No recipients remaining, job finished + $this->set("status", 9); + $this->set("finished", date("Y-m-d H:i:s"), false); + } else if ($bDispatch) { + // Check, if there are recipients remaining - stops job faster + $oLogs->resetQuery(); + $oLogs->setWhere("idnewsjob", $this->get($this->primaryKey)); + $oLogs->setWhere("status", "pending"); + $oLogs->setLimit(0, $this->get("dispatch_count")); + $oLogs->query(); + + If ($oLogs->next()) { + // Remaining recipients found, set job back to pending + $this->set("status", 1); + $this->set("started", "0000-00-00 00:00:00", false); + } else { + // No remaining recipients, job finished + $this->set("status", 9); + $this->set("finished", date("Y-m-d H:i:s"), false); + } + } else { + // Set job back to pending + $this->set("status", 1); + $this->set("started", "0000-00-00 00:00:00", false); + } + $this->store(); + } + + return $iCount; + } + + /** + * Overriden store() method to set status to finished if rcpcount is 0 + */ + public function store() + { + if ($this->get("rcpcount") == 0) { + // No recipients, job finished + $this->set("status", 9); + if ($this->get("started") == "0000-00-00 00:00:00") { + $this->set("started", date("Y-m-d H:i:s"), false); + } + $this->set("finished", date("Y-m-d H:i:s"), false); + } + + parent::store(); + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/classes/class.newsletter.logs.php b/conlite/plugins/newsletter/classes/class.newsletter.logs.php new file mode 100644 index 0000000..fc6dbfe --- /dev/null +++ b/conlite/plugins/newsletter/classes/class.newsletter.logs.php @@ -0,0 +1,265 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01 + * modified 2008-06-30, Dominik Ziegler, add security fix + * modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting + * + * $Id: class.newsletter.logs.php 119 2012-08-07 17:35:39Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Collection management class + */ +class cNewsletterLogCollection extends ItemCollection +{ + /** + * Constructor Function + * @param none + */ + public function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["news_log"], "idnewslog"); + $this->_setItemClass("cNewsletterLog"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function cNewsletterLogCollection() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Creates a single new log item + * @param $idnewsjob integer ID of corresponding newsletter send job + * @param $idnewsrcp integer ID of recipient + * @param $rcp_name string Name of the recipient (-> recipient may be deleted) + * @param $rcp_email string E-Mail of the recipient (-> recipient may be deleted) + */ + public function create($idnewsjob, $idnewsrcp) + { + global $client, $lang, $auth; + + $idnewsjob = Contenido_Security::toInteger($idnewsjob); + $idnewsrcp = Contenido_Security::toInteger($idnewsrcp); + $client = Contenido_Security::toInteger($client); + $lang = Contenido_Security::toInteger($lang); + + $this->resetQuery(); + $this->setWhere("idnewsjob", $idnewsjob); + $this->setWhere("idnewsrcp", $idnewsrcp); + $this->query(); + + if ($oItem = $this->next()) { + return $oItem; + } + + $oRecipient = new Recipient; + if ($oRecipient->loadByPrimaryKey($idnewsrcp)) { + $oItem = parent::create(); + + $oItem->set("idnewsjob", $idnewsjob); + $oItem->set("idnewsrcp", $idnewsrcp); + + $sEMail = $oRecipient->get("email"); + $sName = $oRecipient->get("name"); + + if ($sName == "") { + $oItem->set("rcpname", $sEMail); + } else { + $oItem->set("rcpname", $sName); + } + + $oItem->set("rcpemail", $sEMail); + $oItem->set("rcphash", $oRecipient->get("hash")); + $oItem->set("rcpnewstype", $oRecipient->get("news_type")); + $oItem->set("status", "pending"); + $oItem->set("created", date("Y-m-d H:i:s"), false); + $oItem->store(); + + return $oItem; + } else { + return false; + } + } + + /** + * Gets all active recipients as specified for the newsletter and adds for + * every recipient a log item + * @param integer $idnewsjob ID of corresponding newsletter dispatch job + * @param integer $idnews ID of newsletter + * @return integer Recipient count + */ + public function initializeJob($idnewsjob, $idnews) + { + global $cfg; + + $idnewsjob = Contenido_Security::toInteger($idnewsjob); + $idnews = Contenido_Security::toInteger($idnews); + + $oNewsletter = new Newsletter(); + if ($oNewsletter->loadByPrimaryKey($idnews)) { + $sDestination = $oNewsletter->get("send_to"); + $iIDClient = $oNewsletter->get("idclient"); + $iIDLang = $oNewsletter->get("idlang"); + + switch ($sDestination) { + case "all" : + $sDistinct = ""; + $sFrom = ""; + $sSQL = "deactivated='0' AND confirmed='1' AND idclient='".$iIDClient."' AND idlang='".$iIDLang."'"; + break; + case "default" : + $sDistinct = "distinct"; + $sFrom = $cfg["tab"]["news_groups"]." AS groups, ".$cfg["tab"]["news_groupmembers"]." AS groupmembers "; + $sSQL = "recipientcollection.idclient = '".$iIDClient."' AND ". + "recipientcollection.idlang = '".$iIDLang."' AND ". + "recipientcollection.deactivated = '0' AND ". + "recipientcollection.confirmed = '1' AND ". + "recipientcollection.idnewsrcp = groupmembers.idnewsrcp AND ". + "groupmembers.idnewsgroup = groups.idnewsgroup AND ". + "groups.defaultgroup = '1' AND groups.idclient = '".$iIDClient."' AND ". + "groups.idlang = '".$iIDLang."'"; + break; + case "selection" : + $aGroups = unserialize ($oNewsletter->get("send_ids")); + + if (is_array($aGroups) && count($aGroups) > 0) { + $sGroups = "'" . implode("','", $aGroups) . "'"; + + $sDistinct = "distinct"; + $sFrom = $cfg["tab"]["news_groupmembers"]." AS groupmembers "; + $sSQL = "recipientcollection.idclient = '".$iIDClient."' AND ". + "recipientcollection.idlang = '".$iIDLang."' AND ". + "recipientcollection.deactivated = '0' AND ". + "recipientcollection.confirmed = '1' AND ". + "recipientcollection.idnewsrcp = groupmembers.idnewsrcp AND ". + "groupmembers.idnewsgroup IN (".$sGroups.")"; + } else { + $sDestination = "unknown"; + } + break; + case "single" : + $iID = $oNewsletter->get("send_ids"); + if (is_numeric($iID)) { + $sDistinct = ""; + $sFrom = ""; + $sSQL = "idnewsrcp = '".$iID."'"; + } else { + $sDestination = "unknown"; + } + break; + default: + $sDestination = "unknown"; + } + unset ($oNewsletter); + + if ($sDestination == "unknown") { + return 0; + } else { + $oRecipients = new RecipientCollection; + $oRecipients->flexSelect($sDistinct, $sFrom, $sSQL, "", "", ""); + + $iRecipients = $oRecipients->count(); + + while ($oRecipient = $oRecipients->next()) { + $this->create($idnewsjob, $oRecipient->get($oRecipient->primaryKey)); + } + + return $iRecipients; + } + } else { + return 0; + } + } + + /** + * Overriden delete function to update recipient count if removing recipient from the list + * @param integer $idnewslog ID + */ + public function delete($idnewslog) + { + $idnewslog = Contenido_Security::toInteger($idnewslog); + + $oLog = new cNewsletterLog($idnewslog); + $iIDNewsJob = $oLog->get("idnewsjob"); + unset($oLog); + + $oJob = new cNewsletterJob($iIDNewsJob); + $oJob->set("rcpcount", $oJob->get("rcpcount") - 1); + $oJob->store(); + unset ($oJob); + + parent::delete($idnewslog); + } + + public function deleteJob($idnewsjob) + { + $idnewsjob = Contenido_Security::toInteger($idnewsjob); + $this->setWhere("idnewsjob", $idnewsjob); + $this->query(); + + while ($oItem = $this->next()) { + $this->delete($oItem->get($oItem->primaryKey)); + } + + return true; + } +} + + +/** + * Single NewsletterLog Item + */ +class cNewsletterLog extends Item +{ + /** + * Constructor Function + * @param mixed $mId Specifies the ID of item to load + */ + public function __construct($mId = false) + { + global $cfg; + parent::__construct($cfg["tab"]["news_log"], "idnewslog"); + if ($mId !== false) { + $this->loadByPrimaryKey($mId); + } + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function cNewsletterLog($mId = false) + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct($mId); + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/classes/class.newsletter.php b/conlite/plugins/newsletter/classes/class.newsletter.php new file mode 100644 index 0000000..ec251b0 --- /dev/null +++ b/conlite/plugins/newsletter/classes/class.newsletter.php @@ -0,0 +1,1026 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01 + * modified 2008-06-30, Dominik Ziegler, add security fix + * modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting + * + * $Id: class.newsletter.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Newsletter management class + */ +class NewsletterCollection extends ItemCollection +{ + /** + * Constructor Function + * @param none + */ + public function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["news"], "idnews"); + $this->_setItemClass("Newsletter"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function NewsletterCollection() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Creates a new newsletter + * @param $name string specifies the newsletter name + */ + public function create($sName) + { + global $client, $lang, $auth; + + $sName = Contenido_Security::escapeDB($sName, null); + $client = Contenido_Security::toInteger($client); + $lang = Contenido_Security::toInteger($lang); + + // Check if the newsletter name already exists + $this->resetQuery; + $this->setWhere("idclient", $client); + $this->setWhere("idlang", $lang); + $this->setWhere("name", $sName); + $this->query(); + + if ($this->next()) { + return $this->create($sName."_".substr(md5(rand()), 0, 10)); + } + + $oItem = parent::create(); + $oItem->set("idclient", $client); + $oItem->set("idlang", $lang); + $oItem->set("name", $sName); + $oItem->set("created", date("Y-m-d H:i:s"), false); + $oItem->set("author", Contenido_Security::escapeDB($auth->auth["uid"], null)); + + $oItem->store(); + + return $oItem; + } + + /** + * Duplicates the newsletter specified by $itemID + * @param $itemID integer specifies the newsletter id + */ + public function duplicate($iItemID) + { + global $client, $lang, $auth; + + $client = Contenido_Security::toInteger($client); + $lang = Contenido_Security::toInteger($lang); + + cInclude("includes", "functions.con.php"); + + $oBaseItem = new Newsletter(); + $oBaseItem->loadByPrimaryKey($iItemID); + + $oItem = parent::create(); + $oItem->set("name", $oBaseItem->get("name")."_".substr(md5(rand()), 0, 10)); + + $iIDArt = 0; + if ($oBaseItem->get("type") == "html" && $oBaseItem->get("idart") > 0 && $oBaseItem->get("template_idart") > 0) { + $oClientLang = new cApiClientLanguage(false, $client, $lang); + + if ($oClientLang->getProperty("newsletter", "html_newsletter") == "true") { + $iIDArt = conCopyArticle($oBaseItem->get("idart"), + $oClientLang->getProperty("newsletter", "html_newsletter_idcat"), + sprintf(i18n("Newsletter: %s"), $oItem->get("name"))); + conMakeOnline($iIDArt, $lang); // Article has to be online for sending... + } + unset ($oClientLang); + } + $oItem->set("idart", $iIDArt); + $oItem->set("template_idart", $oBaseItem->get("template_idart")); + $oItem->set("idclient", $client); + $oItem->set("idlang", $lang); + $oItem->set("welcome", 0); + $oItem->set("type", $oBaseItem->get("type")); + $oItem->set("subject", $oBaseItem->get("subject")); + $oItem->set("message", $oBaseItem->get("message")); + $oItem->set("newsfrom", $oBaseItem->get("newsfrom")); + $oItem->set("newsfromname", $oBaseItem->get("newsfromname")); + $oItem->set("newsdate", date("Y-m-d H:i:s"), false); // But more or less deprecated + $oItem->set("use_cronjob", $oBaseItem->get("use_cronjob")); + $oItem->set("send_to", $oBaseItem->get("send_to")); + $oItem->set("send_ids", $oBaseItem->get("send_ids")); + $oItem->set("dispatch", $oBaseItem->get("dispatch")); + $oItem->set("dispatch_count", $oBaseItem->get("dispatch_count")); + $oItem->set("dispatch_delay", $oBaseItem->get("dispatch_delay")); + $oItem->set("author", $auth->auth["uid"]); + $oItem->set("created", date("Y-m-d H:i:s"), false); + + // Copy properties, runtime on-demand allocation of the properties object + if (!is_object($this->properties)) { + $this->properties = new PropertyCollection; + } + $this->properties->setWhere("idclient", $client); + $this->properties->setWhere("itemtype", $this->primaryKey); + $this->properties->setWhere("itemid", $iItemID); + $this->properties->query(); + + while ($oPropertyItem = $this->properties->next()) { + $oItem->setProperty($oPropertyItem->get("type"), $oPropertyItem->get("name"), $oPropertyItem->get("value")); + } + + $oItem->store(); + + return $oItem; + } +} + +/** + * Single Newsletter Item + */ +class Newsletter extends Item +{ + /** + * @var string Error storage + * @access private + */ + protected $_sError; + + /** + * Constructor Function + * @param mixed $mId Specifies the ID of item to load + */ + public function __construct($mId = false) + { + global $cfg; + parent::__construct($cfg["tab"]["news"], "idnews"); + $this->_sError = ""; + if ($mId !== false) { + $this->loadByPrimaryKey($mId); + } + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function Newsletter($mId = false) + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct($mId); + } + + /** + * Overriden store()-Method to set modified and modifiedby data and + * to ensure, that there is only one welcome newsletter + */ + public function store() + { + global $client, $lang, $auth; + + $client = Contenido_Security::toInteger($client); + $lang = Contenido_Security::toInteger($lang); + + $this->set("modified", date("Y-m-d H:i:s"), false); + $this->set("modifiedby", $auth->auth["uid"]); + + if ($this->get("welcome") == 1) { + $oItems = new NewsletterCollection(); + $oItems->setWhere("idclient", $client); + $oItems->setWhere("idlang", $lang); + $oItems->setWhere("welcome", 1); + $oItems->setWhere("idnews", $this->get("idnews"), "<>"); + $oItems->query(); + + while ($oItem = $oItems->next()) { + $oItem->set("welcome", 0); + $oItem->store(); + } + unset ($oItem); + unset ($oItems); + } + + parent::store(); + } + + /** + * Replaces newsletter tag (e.g. MAIL_NAME) with data. + * If code is just text using str_replace; if it is HTML by using regular expressions + * @param string sCode Code, where the tags will be replaced (by reference) + * @param bool bIsHTML Is code HTML? + * @param string sField Field name, without MAIL_ (e.g. just "name") + * @param string sData Data + * @access private + */ + public function _replaceTag(&$sCode, $bIsHTML, $sField, $sData) + { + if ($sCode && !$bIsHTML) { + $sCode = str_replace("MAIL_".strtoupper($sField), $sData, $sCode); + } else if ($sCode) { + // Extract certain tag + $sRegExp = '/\[mail\s*([^]]+)\s*name=(?:"|")'.$sField.'(?:"|")\s*(.*?)\s*\]((?:.|\s)+?)\[\/mail\]/i'; + $aMatch = array(); + $iMatches = preg_match($sRegExp, $sCode, $aMatch) ; + + if ($iMatches > 0) { + // $aMatch contains parameter info from left [1] or right [2] to name="field" + $sParameter = $aMatch[1] . $aMatch[2]; + $sMessage = $aMatch[3]; + $sRegExp = '/\s*(.*?)\s*=\s*(?:"|")(.*?)(?:"|")\s*/i'; + $aMatch = array(); + + if (preg_match_all($sRegExp, $sParameter, $aMatch) > 0) { + // Store parameter data as assoziative array + $aParameter = array_combine($aMatch[1], $aMatch[2]); + unset ($aMatch); // $aMatch not needed anymore + + if (!array_key_exists("type", $aParameter)) { + $aParameter["type"] = "text"; + } + + switch ($aParameter["type"]) { + case "link": + # TODO: Works everything fine? + # The current code makes it possible to do something like + # [mail ...]Some text here, then the link: [MAIL_STOP] and more text[/mail] + # + # If the other lines will be used, you don't need to + # set [MAIL_xy] and the message between the [mail]-tags will + # be used as link text (instead of using the tag parameter "text") + + $sText = $aParameter["text"]; + + if ($sText == "") { + $sText = $sData; + } + if ($sMessage == "") { + $sMessage = $sData; + } + + // Remove not needed parameters from the parameters list + // everything else goes into the link as parameters + unset ($aParameter["type"]); + unset ($aParameter["text"]); + + $sParameter = ""; + if (count($aParameter) > 0) { + foreach ($aParameter as $sKey => $sValue) { + $sParameter .= ' '.$sKey . '="' . $sValue . '"'; + } + } + $sMessage = str_replace("MAIL_".strtoupper($sField), ''.$sText.'', $sMessage); + #$sMessage = ''.$sMessage.''; + break; + default: + $sMessage = str_replace("MAIL_".strtoupper($sField), $sData, $sMessage); + #$sMessage = $sData; + } + + $sRegExp = '/\[mail[^]]+name=(?:"|")'.$sField.'(?:"|").*?\].*?\[\/mail\]/is'; + $sCode = preg_replace($sRegExp, $sMessage, $sCode, -1); + // Just to replace "text"-tags in HTML message also, just in case... + $sCode = str_replace("MAIL_".strtoupper($sField), $sData, $sCode); + } + } + } + } + + /** + * Replaces relative URL for url, src or href with absolute client htmlpath + * + * @author Ortwin Pinke + * @since CL 2.0 + * + * @global int $client + * @global array $cfgClient + * @param string $sUrl + * @return string + */ + protected function _callbackReplaceUrl($sUrl) { + global $client, $cfgClient; + $returnUrl = ''; + print_r($sUrl); + if($sUrl[1] == "url") { + if(empty($sUrl[3])) { + $returnUrl = $sUrl[1]."(".$sUrl[2]; + $returnUrl .= $cfgClient[$client]['path']['htmlpath']; + $returnUrl .= ltrim(ltrim($sUrl[4], "."), "/"); + $returnUrl .= $sUrl[2].")"; + } else { + $returnUrl = $sUrl[0]; + } + } else if(empty($sUrl[2])) { + $returnUrl = $sUrl[1].'="'; + $returnUrl .= $cfgClient[$client]['path']['htmlpath']; + $returnUrl .= ltrim(ltrim($sUrl[3], "."), "/").'"'; + } else { + $returnUrl = $sUrl[0]; + } + + return $returnUrl; + } + + /* TODO: HerrB: Remove or insert some functionality */ + protected function _getNewsletterTagData($sHTML, $sTag) + { + //$sRegExp = "/](.*?)>.*?<\/newsletter>/i"; + //$sRegExp = "/\[mail[^\]](.*?)>.*?\[\/mail\]/i"; + #\[mail[^\]]((name="(?P.*?)")|(type="(?P.*?)"))\](?P.*?)\[\/mail\] + #\[mail[^\]]((name=(?P[^"]*.*?[^"]*))|(type="(?P.*?)"))\](?P.*?)\[\/mail\] + + /* RegExp explanation: + * Match the character "[" literally �\[� + * Match the characters "mail" literally �mail� + * Match "whitespace characters" (spaces, tabs, line breaks, etc.) after "mail" �\s*� + * Match the regular expression below and capture its match into backreference number 1 �([^]]+)� + * Match any character that is not a "]" �[^]]+� + * Between one and unlimited times, as many times as possible, giving back as needed (greedy) �+� + * Match the character "]" literally �\]� + * Match the regular expression below and capture its match into backreference number 2 �((?:.|\s)+?)� + * Match the regular expression below �(?:.|\s)+?� + * Between one and unlimited times, as few times as possible, expanding as needed (lazy) �+?� + * Match either the regular expression below (attempting the next alternative only if this one fails) �.� + * Match any single character that is not a line break character �.� + * Or match regular expression number 2 below (the entire group fails if this one fails to match) �\s� + * Match a single character that is a "whitespace character" (spaces, tabs, line breaks, etc.) �\s� + * Match the character "[" literally �\[� + * Match the characters "/mail" literally �/mail� + * Match the character "]" literally �\]� + * Ignore case (i), . includes new lines (s) + **/ + + /* + $sRegExp = '/\[mail\s*([^]]+)\]((?:.|\s)+?)\[\/mail\]/is'; + $aMatch = array (); + preg_match_all($sRegExp, $sHTML, $aMatch, PREG_SET_ORDER); + print_r ($aMatch); + + // Auf bestimmten Typ matchen + $sRegExp = '/\[mail.*?name="name".*?\]((?:.|\s)+?)\[\/mail\]/is'; + $aMatch = array (); + preg_match_all($sRegExp, $sHTML, $aMatch, PREG_SET_ORDER); + print_r ($aMatch); */ + + // Parameter auseinandernehmen (ohne PREG_SET_ORDER) + #$sRegExp = '/\s*(.*?)\s*=\s*"(.*?)"\s*/i'; + #$aMatch = array (); + #preg_match_all($sRegExp, $sHTML, $aMatch); + #print_r ($aMatch); + } + + protected function _deChunkHTTPBody($sHeader, $sBody, $sEOL = "\r\n") + { + // Based on code from jbr at ya-right dot com, posted on http://www.php.net + // as user comment on fsockopen documentation (2007-05-01) + + // Analyze header + $aParts = preg_split("/\r?\n/", $sHeader, -1, PREG_SPLIT_NO_EMPTY); + + $aHeader = array(); + for ($i = 0;$i < sizeof ($aParts); $i++) { + if ($i != 0) { + $iPos = strpos($aParts[$i], ':'); + $sParameter = strtolower (str_replace(' ', '', substr ($aParts[$i], 0, $iPos))); + $sValue = trim(substr($aParts[$i], ($iPos + 1))); + } else { + $sField = 'status'; + $aParameters = explode(' ', $aParts[$i]); + $sParameter = $aParameters[1]; + } + + if ($sParameter == 'set-cookie') { + $aHeader['cookies'][] = $sValue; + } else if ($sParameter == 'content-type') { + if (($iPos = strpos($sValue, ';')) !== false) { + $aHeader[$sParameter] = substr($sValue, 0, $iPos); + } else { + $aHeader[$sParameter] = $sValue; + } + } else { + $aHeader[$sParameter] = $sValue; + } + } + + // Get dechunked and decompressed body + $iEOLLen = strlen($sEOL); + + $sBuffer = ''; + if (isset($aHeader['transfer-encoding']) && $aHeader['transfer-encoding'] == 'chunked') { + do { + $sBody = ltrim ($sBody); + $iPos = strpos($sBody, $sEOL); + $iDataLen = hexdec (substr($sBody, 0, $iPos)); + + if (isset($aHeader['content-encoding'])) { + $sBuffer .= gzinflate(substr($sBody, ($iPos + $iEOLLen + 10), $iDataLen)); + } else { + $sBuffer .= substr($sBody, ($iPos + $iEOLLen), $iDataLen); + } + + $sBody = substr ($sBody, ($iPos + $iDataLen + $iEOLLen)); + $sRemaining = trim ($sBody); + + } while (!empty($sRemaining)); + } else if (isset($aHeader['content-encoding'])) { + $sBuffer = gzinflate(substr($sBody, 10)); + } else { + $sBuffer = $sBody; // Not chunked, not compressed + } + + return $sBuffer; + } + + /** + * If newsletter is HTML newsletter and necessary data available + * returns final HTML message + * @return string HTML message + */ + public function getHTMLMessage() { + global $lang, $client, $cfgClient, $contenido; + + if ($this->get("type") == "html" && $this->get("idart") > 0 && $this->htmlArticleExists()) { + + // Article ID + $iIDArt = $this->get("idart"); + + // Category ID + $oClientLang = new cApiClientLanguage(false, $client, $lang); + $iIDCat = $oClientLang->getProperty("newsletter", "html_newsletter_idcat"); + unset ($oClientLang); + + // Get http username and password, if frontend is protected + $oClient = new cApiClient($client); + $sHTTPUserName = $oClient->getProperty("newsletter", "html_username"); + $sHTTPPassword = $oClient->getProperty("newsletter", "html_password"); + unset ($oClient); + + // Get HTML + if ($iIDArt > 0 && $iIDCat > 0) { + // Check, if newsletter is online and set temporarely online, otherwise + $bSetOffline = false; + $oArticles = new cApiArticleLanguageCollection; + $oArticles->setWhere("idlang", $this->get("idlang")); + $oArticles->setWhere("idart", $this->get("idart")); + $oArticles->query(); + + if ($oArticle = $oArticles->next()) { + if ($oArticle->get("online") == 0) { + $bSetOffline = true; + $oArticle->set("online", 1); + $oArticle->store(); + } + unset ($oArticle); + } + unset ($oArticles); + + $sFile = "front_content.php?client=$client&lang=$lang&idcat=$iIDCat&idart=$iIDArt&noex=1&send=1"; + $aURL = parse_url($cfgClient[$client]['path']['htmlpath']); + + // TODO: Other schemes than http should be tested before use! + if ($aURL["scheme"] == "https") { + $iPort = 443; + $sTarget = "ssl://".$aURL["host"]; + } else { + $iPort = 80; + $sTarget = $aURL["host"]; + } + if ($aURL["port"]) { + $iPort = $aURL["port"]; + } + + $iErrorNo = 0; + $sErrorMsg = ""; + if ($iHandler = fsockopen($sTarget, $iPort, $iErrorNo, $sErrorMsg, 30)) { + // If you use HTTP 1.1 you may get chunked data... you could solve + // this easily by using HTTP 1.0, but then you get a problem with + // virtual servers, as HTTP 1.0 doesn't use the host information... + fputs($iHandler, "GET ".$aURL["path"].$sFile." HTTP/1.1\r\n"); + fputs($iHandler, "Host: ".$aURL["host"]."\r\n"); + + // Maybe the website has been protected using .htaccess, then login + if ($sHTTPUserName != "" && $sHTTPPassword != "") { + fputs($iHandler, "Authorization: Basic " . base64_encode("$sHTTPUserName:$sHTTPPassword") . "\r\n"); + } + + fputs($iHandler, "Referer: http://".$aURL["host"]."\r\n"); + fputs($iHandler, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"); + fputs($iHandler, "Connection: close\r\n\r\n"); + + // Get the HTTP header and body separately + $sHTML = ""; + $sHeader = ""; + $bBody = false; + while (!feof($iHandler)) { + // $sLine = fgets($iHandler, 4096); + $sLine = fgets($iHandler, 1024); + if ($bBody) { + $sHTML .= $sLine; + } else if ($sLine == "\r\n") { + $bBody = true; + } else { + $sHeader .= $sLine; + } + } + fclose ($iHandler); + + $sHTML = $this->_deChunkHTTPBody($sHeader, $sHTML); + + // If someone likes to use anchors in html newsletters (*sigh*) + // the base href tag has to be removed - that means, we have to fix + // all source paths manually... + if (getEffectiveSetting('newsletter', 'remove_base_tag', "false") == "true") { + // Remove base tag + $sHTML = preg_replace('//is', '', $sHTML, 1); + $sHTML = preg_replace_callback('/(url)\((\'|\")?(http:\/\/|https:\/\/|ftp:\/\/)?([A-Za-z0-9#\.?\-=_&\/]*)[\'|\"]?\)/', array($this, "_callbackReplaceUrl"), $sHTML); + $sHTML = preg_replace_callback('/\b(src|href|ftp)[ ]*=[ ]*"(http:\/\/|https:\/\/|ftp:\/\/)?([A-Za-z0-9#\.?\-=_&\/]*)"/', array($this, "_callbackReplaceUrl"), $sHTML); + // Now replace anchor tags to the newsletter article itself just by the anchor + $sHTML = str_replace($cfgClient[$client]['path']['htmlpath']."front_content.php?idart=".$iIDArt."#", "#", $sHTML); + } + + $sReturn = $sHTML; + } else { + if ($contenido) { // Use i18n only in backend + $sErrorText = i18n("There was a problem getting the newsletter article using http. Error: %s (%s)"); + } else { + $sErrorText = "There was a problem getting the newsletter article using http. Error: %s (%s)"; + } + + $this->_sError = sprintf($sErrorText, $sErrorMsg, $iErrorNo); + $sReturn = false; + } + + // Set previously offline article back to offline + if ($bSetOffline) { + $oArticles = new cApiArticleLanguageCollection(); + $oArticles->setWhere("idlang", $this->get("idlang")); + $oArticles->setWhere("idart", $this->get("idart")); + $oArticles->query(); + + if ($oArticle = $oArticles->next()) { + $oArticle->set("online", 0); + $oArticle->store(); + } + unset ($oArticle); + unset ($oArticles); + } + + return $sReturn; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Checks, if html newsletter article still exists + * @return bool + */ + public function htmlArticleExists() + { + if ($this->get("idart") > 0) { + $oArticles = new cApiArticleLanguageCollection(); + $oArticles->setWhere("idlang", $this->get("idlang")); + $oArticles->setWhere("idart", $this->get("idart")); + $oArticles->query(); + + if ($oArticles->count() > 0) { + $bReturn = true; + } else { + $bReturn = false; + } + + unset ($oArticles); + } else { + $bReturn = false; + } + + return $bReturn; + } + + /** + * Sends test newsletter directly to specified email address + * @param integer $iIDCatArt idcatart of newsletter handler article + * @param string $sEMail Recipient email address + * @param string $sName Optional: Recipient name + * @param bool $bSimulatePlugin If recipient plugin activated, include plugins + * and simulate values from plugins + * @param string $sEncoding Message (and header) encoding, e.g. iso-8859-1 + */ + public function sendEMail($iIDCatArt, $sEMail, $sName = "", $bSimulatePlugins = true, $sEncoding = "iso-8859-1") + { + global $lang, $client, $cfg, $cfgClient, $contenido; + + // Initialization + if ($sName == "") { + $sName = $sEMail; + } + + $oLanguage = new cApiLanguage($lang); + $sFormatDate = $oLanguage->getProperty("dateformat", "date"); + $sFormatTime = $oLanguage->getProperty("dateformat", "time"); + unset ($oLanguage); + + if ($sFormatDate == "") { + $sFormatDate = "%d.%m.%Y"; + } + if ($sFormatTime == "") { + $sFormatTime = "%H:%M"; + } + + // Get newsletter data + $sFrom = $this->get("newsfrom"); + $sFromName = $this->get("newsfromname"); + if ($sFromName == "") { + $sFromName = $sFrom; + } + $sSubject = $this->get("subject"); + $sMessageText = $this->get("message"); + + $bIsHTML = false; + if ($this->get("type") == "html") { + $sMessageHTML = $this->getHTMLMessage(); + + if ($sMessageHTML === false) { + // There was a problem getting the html message (maybe article + // deleted). Exit with error instead of sending as text message only + + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter to %s could not be sent: No html message available"); + } else { + $sError = "Newsletter to %s could not be sent: No html message available"; + } + $this->_sError = $sName." (".$sEMail."): ".sprintf($sError, $sEMail); + return false; + } else { + $bIsHTML = true; + } + } + + // Preventing double lines in mail, you may wish to disable this function on windows servers + if (!getSystemProperty("newsletter", "disable-rn-replacement")) { + $sMessageText = str_replace("\r\n", "\n", $sMessageText); + } + + // Simulate key, an alphanumeric string of 30 characters + $sKey = str_repeat("key", 10); + $sPath = $cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$iIDCatArt."&"; + + // Replace message tags (text message) + $this->_replaceTag($sMessageText, false, "name", $sName); + $this->_replaceTag($sMessageText, false, "number", 1); + $this->_replaceTag($sMessageText, false, "date", strftime($sFormatDate)); + $this->_replaceTag($sMessageText, false, "time", strftime($sFormatTime)); + $this->_replaceTag($sMessageText, false, "unsubscribe", $sPath."unsubscribe=".$sKey); + $this->_replaceTag($sMessageText, false, "change", $sPath."change=".$sKey); + $this->_replaceTag($sMessageText, false, "stop", $sPath."stop=".$sKey); + $this->_replaceTag($sMessageText, false, "goon", $sPath."goon=".$sKey); + + // Replace message tags (html message) + if ($bIsHTML) { + $this->_replaceTag($sMessageHTML, true, "name", $sName); + $this->_replaceTag($sMessageHTML, true, "number", 1); + $this->_replaceTag($sMessageHTML, true, "date", strftime($sFormatDate)); + $this->_replaceTag($sMessageHTML, true, "time", strftime($sFormatTime)); + $this->_replaceTag($sMessageHTML, true, "unsubscribe", $sPath."unsubscribe=".$sKey); + $this->_replaceTag($sMessageHTML, true, "change", $sPath."change=".$sKey); + $this->_replaceTag($sMessageHTML, true, "stop", $sPath."stop=".$sKey); + $this->_replaceTag($sMessageHTML, true, "goon", $sPath."goon=".$sKey); + } + + if ($bSimulatePlugins) { + // Enabling plugin interface + if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") { + if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $sPlugin) { + plugin_include("recipients", $sPlugin."/".$sPlugin.".php"); + if (function_exists("recipients_".$sPlugin."_wantedVariables")) { + $aPluginVars = array(); + $aPluginVars = call_user_func("recipients_".$sPlugin."_wantedVariables"); + + foreach ($aPluginVars as $sPluginVar) { + // Replace tags in text message + $this->_replaceTag($sMessageText, false, $sPluginVar, ":: ".$sPlugin.": ".$sPluginVar." ::"); + // Replace tags in html message + if ($bIsHTML) { + $this->_replaceTag($sMessageHTML, true, $sPluginVar, ":: ".$sPlugin.": ".$sPluginVar." ::"); + } + } + } + } + } + } else { + setSystemProperty("newsletter", "newsletter-recipients-plugin", "false"); + } + } + + if (!isValidMail($sEMail) || strtolower($sEMail) == "sysadmin@ihresite.de") { + // No valid destination mail address specified + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter to %s could not be sent: No valid e-mail address"); + } else { + $sError = "Newsletter to %s could not be sent: No valid e-mail address"; + } + $this->_sError = $sName." (".$sEMail."): ".sprintf($sError, $sEMail); + return false; + } else { + $oMail = new PHPMailer(); + $oMail->CharSet = $sEncoding; + $oMail->IsHTML($bIsHTML); + $oMail->From = $sFrom; + $oMail->FromName = $sFromName; + $oMail->AddAddress($sEMail); + $oMail->Mailer = "mail"; + $oMail->Subject = $sSubject; + + if ($bIsHTML) { + $oMail->Body = $sMessageHTML; + $oMail->AltBody = $sMessageText."\n\n"; + } else { + $oMail->Body = $sMessageText."\n\n"; + } + + if (!$oMail->Send()) { + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter to %s could not be sent"); + } else { + $sError = "Newsletter to %s could not be sent"; + } + $this->_sError = $sName." (".$sEMail."): ".sprintf($sError, $sEMail); + return false; + } else { + return true; + } + } + } + + /** + * Sends test newsletter directly to specified recipients (single or group) + * + * Note: Sending in chunks not supported! Only usable for tests and only a few + * recipients. + * + * @param integer $iIDCatArt idcatart of newsletter handler article + * @param integer $iIDNewsRcp If specified, newsletter recipient id, ignored, if group specified + * @param integer $iIDNewsGroup If specified, newsletter recipient group id + * @param array $aSendRcps As reference: Filled with a list of succesfull recipients + * @param string $sEncoding Message (and header) encoding, e.g. iso-8859-1 + */ + public function sendDirect($iIDCatArt, $iIDNewsRcp = false, $iIDNewsGroup = false, &$aSendRcps, $sEncoding = "iso-8859-1") + { + global $lang, $client, $cfg, $cfgClient, $contenido, $recipient; + + // Initialization + $aMessages = array(); + + $oLanguage = new cApiLanguage($lang); + $sFormatDate = $oLanguage->getProperty("dateformat", "date"); + $sFormatTime = $oLanguage->getProperty("dateformat", "time"); + unset ($oLanguage); + + if ($sFormatDate == "") { + $sFormatDate = "%d.%m.%Y"; + } + if ($sFormatTime == "") { + $sFormatTime = "%H:%M"; + } + + $sPath = $cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$iIDCatArt."&"; + + // Get newsletter data + $sFrom = $this->get("newsfrom"); + $sFromName = $this->get("newsfromname"); + if ($sFromName == "") { + $sFromName = $sFrom; + } + $sSubject = $this->get("subject"); + $sMessageText = $this->get("message"); + + $bIsHTML = false; + if ($this->get("type") == "html") { + $sMessageHTML = $this->getHTMLMessage(); + + if ($sMessageHTML === false) { + // There was a problem getting the html message (maybe article + // deleted). Exit with error instead of sending as text message only + + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter could not be sent: No html message available"); + } else { + $sError = "Newsletter could not be sent: No html message available"; + } + $this->_sError = $sError; + return false; + } else { + $bIsHTML = true; + } + } + + // Preventing double lines in mail, you may wish to disable this function on windows servers + if (!getSystemProperty("newsletter", "disable-rn-replacement")) { + $sMessageText = str_replace("\r\n", "\n", $sMessageText); + } + + // Single replacements + // Replace message tags (text message) + $this->_replaceTag($sMessageText, false, "date", strftime($sFormatDate)); + $this->_replaceTag($sMessageText, false, "time", strftime($sFormatTime)); + + // Replace message tags (html message) + if ($bIsHTML) { + $this->_replaceTag($sMessageHTML, true, "date", strftime($sFormatDate)); + $this->_replaceTag($sMessageHTML, true, "time", strftime($sFormatTime)); + } + + // Enabling plugin interface + if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") { + $bPluginEnabled = true; + $aPlugins = array(); + + if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $sPlugin) { + plugin_include("recipients", $sPlugin."/".$sPlugin.".php"); + if (function_exists("recipients_".$sPlugin."_wantedVariables")) { + $aPlugins[$sPlugin] = call_user_func("recipients_".$sPlugin."_wantedVariables"); + } + } + } + } else { + setSystemProperty("newsletter", "newsletter-recipients-plugin", "false"); + $bPluginEnabled = false; + } + + $aRecipients = array(); + if ($iIDNewsGroup !== false) { + $oGroupMembers = new RecipientGroupMemberCollection; + $aRecipients = $oGroupMembers->getRecipientsInGroup ($iIDNewsGroup, false); + } else if ($iIDNewsRcp !== false) { + $aRecipients[] = $iIDNewsRcp; + } + + $iCount = count($aRecipients); + if ($iCount > 0) { + $this->_replaceTag($sMessageText, false, "number", $iCount); + + // Replace message tags (html message) + if ($bIsHTML) { + $this->_replaceTag($sMessageHTML, true, "number", $iCount); + } + + foreach ($aRecipients as $iID) { + $sRcpMsgText = $sMessageText; + $sRcpMsgHTML = $sMessageHTML; + + // Don't change name of $recipient variable as it is used in plugins! + $recipient = new Recipient; + $recipient->loadByPrimaryKey($iID); + + $sEMail = $recipient->get("email"); + $sName = $recipient->get("name"); + if (empty ($sName)) { + $sName = $sEMail; + } + $sKey = $recipient->get("hash"); + + $bSendHTML = false; + if ($recipient->get("news_type") == 1) { + $bSendHTML = true; // Recipient accepts html newsletter + } + + $this->_replaceTag($sRcpMsgText, false, "name", $sName); + $this->_replaceTag($sRcpMsgText, false, "unsubscribe", $sPath."unsubscribe=".$sKey); + $this->_replaceTag($sRcpMsgText, false, "change", $sPath."change=".$sKey); + $this->_replaceTag($sRcpMsgText, false, "stop", $sPath."stop=".$sKey); + $this->_replaceTag($sRcpMsgText, false, "goon", $sPath."goon=".$sKey); + + // Replace message tags (html message) + if ($bIsHTML && $bSendHTML) { + $this->_replaceTag($sRcpMsgHTML, true, "name", $sName); + $this->_replaceTag($sRcpMsgHTML, true, "unsubscribe", $sPath."unsubscribe=".$sKey); + $this->_replaceTag($sRcpMsgHTML, true, "change", $sPath."change=".$sKey); + $this->_replaceTag($sRcpMsgHTML, true, "stop", $sPath."stop=".$sKey); + $this->_replaceTag($sRcpMsgHTML, true, "goon", $sPath."goon=".$sKey); + } + + if ($bPluginEnabled) { + foreach ($aPlugins as $sPlugin => $aPluginVar) { + foreach ($aPluginVar as $sPluginVar) { + // Replace tags in text message + $this->_replaceTag($sRcpMsgText, false, $sPluginVar, call_user_func("recipients_".$sPlugin."_getvalue", $sPluginVar)); + // Replace tags in html message + if ($bIsHTML && $bSendHTML) { + $this->_replaceTag($sRcpMsgHTML, true, $sPluginVar, call_user_func("recipients_".$sPlugin."_getvalue", $sPluginVar)); + } + } + } + } + + if (strlen($sKey) != 30) { // Prevents sending without having a key + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter to %s could not be sent: Recipient has an incompatible or empty key"); + } else { + $sError = "Newsletter to %s could not be sent: Recipient has an incompatible or empty key"; + } + $aMessages[] = $sName." (".$sEMail."): ".sprintf($sError, $sEMail); + } else if (!isValidMail($sEMail)) { + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter to %s could not be sent: No valid e-mail address specified"); + } else { + $sError = "Newsletter to %s could not be sent: No valid e-mail address specified"; + } + $aMessages[] = $sName." (".$sEMail."): ".sprintf($sError, $sEMail); + } else { + $oMail = new PHPMailer(); + $oMail->CharSet = $sEncoding; + $oMail->IsHTML($bIsHTML && $bSendHTML); + $oMail->From = $sFrom; + $oMail->FromName = $sFromName; + $oMail->AddAddress($sEMail); + $oMail->Mailer = "mail"; + $oMail->Subject = $sSubject; + + if ($bIsHTML && $bSendHTML) { + $oMail->Body = $sRcpMsgHTML; + $oMail->AltBody = $sRcpMsgText."\n\n"; + } else { + $oMail->Body = $sRcpMsgText."\n\n"; + } + + if ($oMail->Send()) { + $aSendRcps[] = $sName." (".$sEMail.")"; + } else { + if ($contenido) { // Use i18n only in backend + $sError = i18n("Newsletter to %s could not be sent"); + } else { + $sError = "Newsletter to %s could not be sent"; + } + $aMessages[] = $sName." (".$sEMail."): ".sprintf($sError, $sEMail); + } + } + } + } else { + if ($contenido) { // Use i18n only in backend + $sError = i18n("No recipient with specified recipient/group id %s/%s found"); + } else { + $sError = "No recipient with specified recpient/group id %s/%s found"; + } + $aMessages[] = sprintf($sError, $iIDNewsRcp, $iIDNewsGroup); + } + + if (count($aMessages) > 0) { + $this->_sError = implode("
    ", $aMessages); + return false; + } else { + return true; + } + } + + /** + * @deprecated >V4.6.15 - 21.05.2007 + * + * Sends a newsletter + * @param $idcatart integer specifies id of the 'BlackBox'-acrticle containing the 'BlackBox'-module for management + * @param $destination string specifies, who will receive the newsletter ("all", "default" = defaultgroup, + * "selection" = selected groups, "single" = one recepient [e.g. Welcome-Newsletter]) + * @param $to array specifies, which group of recipients shall receive the + * newsletter ("all", "default" = defaultgroup, "4,5,6" = group IDs) + * @param $iChunkSize integer specifies size of chunks when sending in chunks, 0 = don't send in chunks + * @param $iChunk integer specifies current chunk number when sending in chunks + * result array array of recipient names/e-mails + */ + public function send($idcatart, $destination = "other", $to = "", $iChunkSize = 0, $iChunk = 0, $sEncoding = "iso-8859-1") + { + // What should we do with this deprecated method? + $aResult = array(); + $aResult[] = 0; + $aResult[] = "Newsletter->send() not supported anymore (class.newsletter.php)"; + return $aResult; + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/classes/class.newsletter.recipients.php b/conlite/plugins/newsletter/classes/class.newsletter.recipients.php new file mode 100644 index 0000000..3b87973 --- /dev/null +++ b/conlite/plugins/newsletter/classes/class.newsletter.recipients.php @@ -0,0 +1,289 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01 + * modified 2008-06-30, Dominik Ziegler, add security fix + * modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting + * + * $Id: class.newsletter.recipients.php 119 2012-08-07 17:35:39Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Recipient management class + */ +class RecipientCollection extends ItemCollection +{ + /** + * Constructor Function + * @param none + */ + public function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["news_rcp"], "idnewsrcp"); + $this->_setItemClass("Recipient"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function RecipientCollection() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Creates a new recipient + * @param string $sEMail Specifies the e-mail adress + * @param string $sName Specifies the recipient name (optional) + * @param int $iConfirmed Specifies, if the recipient is confirmed (optional) + * @param string $sJoinID Specifies additional recipient group ids to join (optional, e.g. 47,12,...) + * @param int $iMessageType Specifies the message type for the recipient (0 = text, 1 = html) + */ + public function create($sEMail, $sName = "", $iConfirmed = 0, $sJoinID = "", $iMessageType = 0) + { + global $client, $lang, $auth; + + $iConfirmed = (int)$iConfirmed; + $iMessageType = (int)$iMessageType; + + /* Check if the e-mail adress already exists */ + $email = strtolower($email); // e-mail always lower case + $this->setWhere("idclient", $client); + $this->setWhere("idlang", $lang); + $this->setWhere("email", $sEMail); + $this->query(); + + if ($this->next()) { + return $this->create($sEMail."_".substr(md5(rand()),0,10), $sName, 0, $sJoinID, $iMessageType); // 0: Deactivate 'confirmed' + } + $oItem = parent::create(); + $oItem->set("idclient", $client); + $oItem->set("idlang", $lang); + $oItem->set("name", $sName); + $oItem->set("email", $sEMail); + $oItem->set("hash", substr(md5(rand()),0,17) . uniqid("")); // Generating UID, 30 characters + $oItem->set("confirmed", $iConfirmed); + $oItem->set("news_type", $iMessageType); + + if ($iConfirmed) { + $oItem->set("confirmeddate", date("Y-m-d H:i:s"), false); + } + $oItem->set("deactivated", 0); + $oItem->set("created", date("Y-m-d H:i:s"), false); + $oItem->set("author", $auth->auth["uid"]); + $oItem->store(); + + $iIDRcp = $oItem->get("idnewsrcp"); // Getting internal id of new recipient + + // Add this recipient to the default recipient group (if available) + $oGroups = new RecipientGroupCollection(); + $oGroupMembers = new RecipientGroupMemberCollection(); + + $oGroups->setWhere("idclient", $client); + $oGroups->setWhere("idlang", $lang); + $oGroups->setWhere("defaultgroup", 1); + $oGroups->query(); + + while ($oGroup = $oGroups->next()) { + $iIDGroup = $oGroup->get("idnewsgroup"); + $oGroupMembers->create($iIDGroup, $iIDRcp); + } + + // Add to other recipient groups as well? Do so! + if ($sJoinID != "") { + $aJoinID = explode(",", $sJoinID); + + if (count($aJoinID) > 0) { + foreach ($aJoinID as $iIDGroup) { + $oGroupMembers->create($iIDGroup, $iIDRcp); + } + } + } + + return $oItem; + } + + /** + * Overridden delete method to remove recipient from groupmember table + * before deleting recipient + * + * @param $itemID int specifies the recipient + */ + public function delete($itemID) + { + $oAssociations = new RecipientGroupMemberCollection(); + $oAssociations->setWhere("idnewsrcp", $itemID); + $oAssociations->query(); + + While ($oItem = $oAssociations->next()) { + $oAssociations->delete($oItem->get("idnewsgroupmember")); + } + parent::delete($itemID); + } + + /** + * Purge method to delete recipients which hasn't been confirmed since over a month + * @param $timeframe int Days after creation a not confirmed recipient will be removed + * @return int Count of deleted recipients + */ + public function purge($timeframe) + { + global $client, $lang; + + $oRecipientCollection = new RecipientCollection(); + + // DATEDIFF(created, NOW()) > 30 would be better, but it's only available in MySQL V4.1.1 and above + // Note, that, TO_DAYS or NOW may not be available in other database systems than MySQL + $oRecipientCollection->setWhere("idclient", $client); + $oRecipientCollection->setWhere("idlang", $lang); + $oRecipientCollection->setWhere("confirmed", 0); + $oRecipientCollection->setWhere("(TO_DAYS(NOW()) - TO_DAYS(created))", $timeframe, ">"); + $oRecipientCollection->query(); + + while ($oItem = $oRecipientCollection->next()) { + $oRecipientCollection->delete($oItem->get("idnewsrcp")); + } + return $oRecipientCollection->count(); + } + + + /** + * checkEMail returns true, if there is no recipient with the same e-mail address; otherwise false + * @param $email string e-mail + * @return recpient item if item with e-mail exists, false otherwise + */ + public function emailExists($sEmail) + { + global $client, $lang; + + $oRecipientCollection = new RecipientCollection(); + + $oRecipientCollection->setWhere("idclient", $client); + $oRecipientCollection->setWhere("idlang", $lang); + $oRecipientCollection->setWhere("email", strtolower($sEmail)); + $oRecipientCollection->query(); + + if ($oItem = $oRecipientCollection->next()) { + return $oItem; + } else { + return false; + } + } + + /** + * Sets a key for all recipients without key or an old key (len(key) <> 30) + * @param none + */ + public function updateKeys() + { + $this->setWhere("LENGTH(hash)", 30, "<>"); + $this->query(); + + $iUpdated = $this->count(); + while ($oItem = $this->next()) { + $oItem->set("hash", substr(md5(rand()),0,17) . uniqid("")); /* Generating UID, 30 characters */ + $oItem->store(); + } + + return $iUpdated; + } +} + + +/** + * Single Recipient Item + */ +class Recipient extends Item +{ + /** + * Constructor Function + * @param mixed $mId Specifies the ID of item to load + */ + public function __construct($mId = false) + { + global $cfg; + parent::__construct($cfg["tab"]["news_rcp"], "idnewsrcp"); + if ($mId !== false) { + $this->loadByPrimaryKey($mId); + } + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + public function Recipient($mId = false) + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct($mId); + } + + /** + * Checks if the given md5 matches the md5(email) in the database + * @param $md5email string md5 of E-Mail to check + * @return boolean True if the hash matches, false otherwise + * @deprecated 4.6.15 - 10.08.2006 + */ + public function checkMD5Email($md5email) + { + if ($md5email == md5($this->get("email"))) { + return true; + } else { + return false; + } + } + + public function store() + { + global $auth; + + $this->set("lastmodified", date("Y-m-d H:i:s"), false); + $this->set("modifiedby", $auth->auth["uid"]); + parent::store(); + + // Update name, email and newsletter type for recipients in pending newsletter jobs + $sName = $this->get("name"); + $sEmail = $this->get("email"); + if ($sName == "") { + $sName = $sEmail; + } + $iNewsType = $this->get("news_type"); + + $oLogs = new cNewsletterLogCollection(); + $oLogs->setWhere("idnewsrcp", $this->get($this->primaryKey)); + $oLogs->setWhere("status", "pending"); + $oLogs->query(); + + while ($oLog = $oLogs->next()) { + $oLog->set("rcpname", $sName); + $oLog->set("rcpemail", $sEmail); + $oLog->set("rcpnewstype", $iNewsType); + $oLog->store(); + } + } +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/config.autoloader.php b/conlite/plugins/newsletter/includes/config.autoloader.php new file mode 100644 index 0000000..24a7edc --- /dev/null +++ b/conlite/plugins/newsletter/includes/config.autoloader.php @@ -0,0 +1,32 @@ + + * @copyright 2012 CL-Team + * @link http://www.conlite.org + * + * $Id: config.autoloader.php 283 2014-01-09 14:48:38Z oldperl $ + */ + +$sAutoloadClassPath = 'conlite/plugins/newsletter/classes/'; +return array( + 'RecipientGroupCollection' => $sAutoloadClassPath.'class.newsletter.groups.php', + 'RecipientGroup' => $sAutoloadClassPath.'class.newsletter.groups.php', + 'RecipientGroupMemberCollection' => $sAutoloadClassPath.'class.newsletter.groups.php', + 'RecipientGroupMember' => $sAutoloadClassPath.'class.newsletter.groups.php', + 'cNewsletterJobCollection' => $sAutoloadClassPath.'class.newsletter.jobs.php', + 'cNewsletterJob' => $sAutoloadClassPath.'class.newsletter.jobs.php', + 'cNewsletterLogCollection' => $sAutoloadClassPath.'class.newsletter.logs.php', + 'cNewsletterLog' => $sAutoloadClassPath.'class.newsletter.logs.php', + 'NewsletterCollection' => $sAutoloadClassPath.'class.newsletter.php', + 'Newsletter' => $sAutoloadClassPath.'class.newsletter.php', + 'RecipientCollection' => $sAutoloadClassPath.'class.newsletter.recipients.php', + 'Recipient' => $sAutoloadClassPath.'class.newsletter.recipients.php', +); +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/config.plugin.php b/conlite/plugins/newsletter/includes/config.plugin.php new file mode 100644 index 0000000..c6a1f33 --- /dev/null +++ b/conlite/plugins/newsletter/includes/config.plugin.php @@ -0,0 +1,20 @@ + + * @copyright 2012 CL-Team + * @link http://www.conlite.org + * + * $Id: config.plugin.php 121 2012-08-08 11:34:33Z oldperl $ + */ + +// security check +defined('CON_FRAMEWORK') or die('Illegal call'); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_edit.php b/conlite/plugins/newsletter/includes/include.newsletter_edit.php new file mode 100644 index 0000000..bd9a616 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_edit.php @@ -0,0 +1,582 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-12-14, Dominik Ziegler, newsletter encoding is ignored due to wrong parameter values [#CON-374] + * + * $Id: include.newsletter_edit.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// Initialization +$oPage = new cPage; +$oRcpGroups = new RecipientGroupCollection; +$oClientLang = new cApiClientLanguage(false, $client, $lang); +$oNewsletters = new NewsletterCollection; + +// Include plugins +if (is_array($cfg['plugins']['newsletters'])) { + foreach ($cfg['plugins']['newsletters'] as $plugin) { + plugin_include("newsletters", $plugin."/".$plugin.".php"); + } +} + +if ($action == "news_create" && $perm->have_perm_area_action($area, "news_create")) +{ + // Create new newsletter + $oNewsletter = $oNewsletters->create(i18n("-- new newsletter --")); + $idnewsletter = $oNewsletter->get("idnews"); + $oPage->setSubnav("idnewsletter=$idnewsletter", "news"); + $oPage->setReload(); + + // Populating default values + $oNewsletter->set("newsfrom", $oClientLang->getProperty("newsletter", "newsfrom")); + $oNewsletter->set("newsfromname", $oClientLang->getProperty("newsletter", "newsfromname")); + + $sValue = $oClientLang->getProperty("newsletter", "sendto"); + if ($sValue == "") { + $sValue = "all"; + } + $oNewsletter->set("send_to", $sValue); + + $oNewsletter->set("send_ids", $oClientLang->getProperty("newsletter", "sendids")); + + $iValue = $oClientLang->getProperty("newsletter", "use_cronjob"); + if (!is_numeric($iValue)) { + $iValue = 0; + } + $oNewsletter->set("use_cronjob", $iValue); + + $iValue = $oClientLang->getProperty("newsletter", "dispatch"); + if (!is_numeric($iValue)) { + $iValue = 0; + } + $oNewsletter->set("dispatch", $iValue); + + $iValue = $oClientLang->getProperty("newsletter", "dispatchcount"); + if (!is_numeric($iValue)) { + $iValue = 50; + } + $oNewsletter->set("dispatch_count", $iValue); + + $iValue = $oClientLang->getProperty("newsletter", "dispatchdelay"); + if (!is_numeric($iValue)) { + $iValue = 5; + } + $oNewsletter->set("dispatch_delay", $iValue); + $oNewsletter->store(); +} else if ($action == "news_duplicate" && $perm->have_perm_area_action($area, "news_create")) { + // Copy newsletter + $oNewsletter = $oNewsletters->duplicate($idnewsletter); + + // Update subnav with new ID + $oPage->setSubnav("idnewsletter=".$oNewsletter->get("idnews"), "news"); + $oPage->setReload(); +} else if ($action == "news_delete" && $perm->have_perm_area_action($area, "news_delete")) { + // Delete newsletter + // If it is an html newsletter, delete html message article, also + $oNewsletter = new Newsletter($idnewsletter); + + if ($oNewsletter->get("type") == "html" && $oNewsletter->get("idart") > 0) { + conDeleteArt($oNewsletter->get("idart")); + } + + // Delete newsletter + $oNewsletters->delete($idnewsletter); + $oNewsletter = new Newsletter; // Generate empty newsletter object + + // Setting blank subnav - "blank" doesn't mean anything special, it just can't be empty + // and must not contain "idnewsletter" as this is checked in the _subnav file. + $oPage->setSubnav("blank", "news"); + $oPage->setReload(); +} else if ($action == "news_add_job" && $perm->have_perm_area_action($area, "news_add_job")) { + // Create job + $oJobs = new cNewsletterJobCollection; + $oJob = $oJobs->create($idnewsletter, $oClientLang->getProperty("newsletter", "idcatart")); + unset ($oJobs); + + if ($oJob) { + $notis = $notification->returnNotification("info", i18n("Newsletter dispatch job has been added for this newsletter")) . "
    "; + } else { + $notis = $notification->returnNotification("error", i18n("Newsletter dispatch job has been not been added! Please check newsletter details")) . "
    "; + } + + $oNewsletter = new Newsletter($idnewsletter); +} else if ($action == "news_send_test" && + ($perm->have_perm_area_action($area, "news_create") || + $perm->have_perm_area_action($area, "news_save") || + $perm->have_perm_area_action($area, "news_add_job"))) { + // Send test newsletter + $oUser = new cApiUser($auth->auth["uid"]); + + // Subnav gets not updated otherwise (no multilink from newsletter_menu) + $oPage->setSubnav("idnewsletter=" . $idnewsletter, "news"); + + // Get test destination + if ($perm->have_perm_area_action($area, "news_send_test")) { + $iTestIDNewsGroup = (int)$oUser->getProperty("newsletter", "test_idnewsgrp_lang" . $lang); + } else { + $iTestIDNewsGroup = 0; // If user doesn't have the news_send_test right, just send to himself + } + + // Get encoding + $oLang = new cApiLanguage($lang); + $sEncoding = $oLang->get("encoding"); + unset ($oLang); + + // Send test newsletter + $oNewsletter = new Newsletter($idnewsletter); + $aRecipients = array(); + if ($iTestIDNewsGroup == 0) + { + // Send test newsletter to current user email address + $sName = $oUser->get("realname"); + $sEMail = $oUser->get("email"); + + $bSend = $oNewsletter->sendEMail($oClientLang->getProperty("newsletter", "idcatart"), $sEMail, $sName, true, $sEncoding); + if ($bSend) { + $aRecipients[] = $sName . " (" . $sEMail . ")"; + } else { + $aRecipients[] = i18n("None"); + } + } else { + $bSend = $oNewsletter->sendDirect($oClientLang->getProperty("newsletter", "idcatart"), 0, $iTestIDNewsGroup, $aRecipients, $sEncoding); + } + unset($oUser); + + if ($bSend) { + $notis = $notification->returnNotification("info", i18n("Test newsletter has been sent to:") . "
    " . implode("
    ", $aRecipients) . "
    "); + } else { + $notis = $notification->returnNotification("warning", i18n("Test newsletter has not been sent (partly or completely):") . "
    " . + i18n("Successful:") . "
    " . implode("
    ", $aRecipients) . "
    " . + i18n("Error messages:") . "
    " . $oNewsletter->_sError); + } +} else { + // No action, just get selected newsletter + $oNewsletter = new Newsletter($idnewsletter); +} + +if ($oNewsletter->virgin == false && $oNewsletter->get("idclient") == $client && $oNewsletter->get("idlang") == $lang) +{ + // Check and set values + if ($_REQUEST["optSendTo"] == "") { + $_REQUEST["optSendTo"] = $oNewsletter->get("send_to"); + } + + if (!is_numeric($_REQUEST["ckbWelcome"])) { + $_REQUEST["ckbWelcome"] = 0; + } + + if (!is_numeric($_REQUEST["txtDispatchCount"]) || $_REQUEST["txtDispatchCount"] <= 0) { + $_REQUEST["txtDispatchCount"] = $oNewsletter->get("dispatch_count"); + } + + // Note, that for DispatchDelay 0 is possible (= send chunks manually) + if (!is_numeric($_REQUEST["txtDispatchDelay"]) || $_REQUEST["txtDispatchDelay"] < 0) { + $_REQUEST["txtDispatchDelay"] = $oNewsletter->get("dispatch_delay"); + } + + // Only set template id to 0 if it has been specified (as something not useful). + // This prevents deleting of the template id, if type setting is changed to "text" + if (isset($_REQUEST["selTemplate"]) && !is_numeric($_REQUEST["selTemplate"])) { + $_REQUEST["selTemplate"] = 0; + } + + if ($action == "news_save" && $perm->have_perm_area_action($area, $action)) + { + // Save changes + $aMessages = array(); + + // Changing e.g. \' back to ' (magic_quotes) + $sName = stripslashes($_REQUEST["txtName"]); + $sFromEMail = stripslashes($_REQUEST["txtFromEMail"]); + $sFromName = stripslashes($_REQUEST["txtFromName"]); + $sSubject = stripslashes($_REQUEST["txtSubject"]); + + if ($oNewsletter->get("name") != $sName || + $oNewsletter->get("welcome") != $_REQUEST["ckbWelcome"] || + !isValidMail($oNewsletter->get("newsfrom")) && isValidMail($sFromEMail)) + { + // Only reload, if something visible has changed + $oPage->setReload(); + } + + if ($oNewsletter->get("name") != $sName) + { + // Check, if item with same name exists + $oNewsletters->setWhere("name", $sName); + $oNewsletters->setWhere("idclient", $client); + $oNewsletters->setWhere("idlang", $lang); + $oNewsletters->setWhere($oNewsletter->primaryKey, $oNewsletter->get($oNewsletter->primaryKey), "!="); + $oNewsletters->query(); + + if ($oNewsletters->next()) + { + $aMessages[] = i18n("Could not set new newsletter name: name already exists"); + } else { + $oNewsletter->set("name", $sName); + if ($oNewsletter->get("idart") > 0) + { + // Update also HTML newsletter article title, if newsletter name has been changed + $oArticles = new cApiArticleLanguageCollection; + $oArticles->setWhere("idlang", $lang); + $oArticles->setWhere("idart", $oNewsletter->get("idart")); + $oArticles->query(); + + if ($oArticle = $oArticles->next()) + { + $oArticle->set("title", sprintf(i18n("Newsletter: %s"), $oNewsletter->get("name"))); + $oArticle->store(); + } + unset ($oArticle); + unset ($oArticles); + } + } + } + if ($oClientLang->getProperty("newsletter", "html_newsletter") == "true") + { + $oNewsletter->set("type", $selType); + } else { + $oNewsletter->set("type", "text"); + } + $oNewsletter->set("newsfrom", $sFromEMail); + $oNewsletter->set("newsfromname", $sFromName); + $oNewsletter->set("subject", $sSubject); + + // Options + $oNewsletter->set("welcome", $_REQUEST["ckbWelcome"]); + + // Check out if there are any plugins + if (is_array($cfg['plugins']['newsletters'])) + { + foreach ($cfg['plugins']['newsletters'] as $plugin) + { + if (function_exists("newsletters_".$plugin."_wantedVariables") && function_exists("newsletters_".$plugin."_store")) + { + $wantVariables = call_user_func("newsletters_".$plugin."_wantedVariables"); + + if (is_array($wantVariables)) + { + $varArray = array(); + + foreach ($wantVariables as $value) { + $varArray[$value] = stripslashes($GLOBALS[$value]); + } + } + $store = call_user_func("newsletters_".$plugin."_store", $varArray); + } + } + } + + // If "selected groups" have been selected and no group specified, set + // selection to "all" + if ($_REQUEST["optSendTo"] == "selection" && !is_array($_REQUEST["selGroup"])) { + $aMessages[] = i18n("'Send to recipients in selected groups' has been selected, but no group has been specified. Selection has been set to 'Send to all recipients'"); + $_REQUEST["optSendTo"] = "all"; + } + $oNewsletter->set("send_to", $_REQUEST["optSendTo"]); + $oNewsletter->set("send_ids", serialize($_REQUEST["selGroup"])); + + if (getEffectiveSetting("newsletter", "option-cronjob-available", "false") == "true") + { + // Only store changes, if cronjob option is available + if (isset($_REQUEST["ckbCronJob"])) { + $oNewsletter->set("use_cronjob", 1); + } else { + $oNewsletter->set("use_cronjob", 0); + } + } + + if (isset($_REQUEST["ckbDispatch"])) { + $oNewsletter->set("dispatch", 1); + } else { + $oNewsletter->set("dispatch", 0); + } + + $oNewsletter->set("dispatch_count", $_REQUEST["txtDispatchCount"]); + $oNewsletter->set("dispatch_delay", $_REQUEST["txtDispatchDelay"]); + + $oNewsletter->store(); // Note, that the properties are stored, anyway + + // Storing from (e-mail), from (name) and options as default + if ($_REQUEST["ckbSetDefault"]) + { + $oClientLang->setProperty("newsletter", "newsfrom", $sFromEMail); + $oClientLang->setProperty("newsletter", "newsfromname", $sFromName); + $oClientLang->setProperty("newsletter", "sendto", $_REQUEST["optSendTo"]); + $oClientLang->setProperty("newsletter", "sendgroups", serialize($_REQUEST["selGroup"])); + if (isset($_REQUEST["ckbCronJob"])) { + $oClientLang->setProperty("newsletter", "use_cronjob", "1"); + } else { + $oClientLang->setProperty("newsletter", "use_cronjob", "0"); + } + if (isset($_REQUEST["ckbDispatch"])) { + $oClientLang->setProperty("newsletter", "dispatch", "1"); + } else { + $oClientLang->setProperty("newsletter", "dispatch", "0"); + } + $oClientLang->setProperty("newsletter", "dispatchcount", $_REQUEST["txtDispatchCount"]); + $oClientLang->setProperty("newsletter", "dispatchdelay", $_REQUEST["txtDispatchDelay"]); + } + + if (count($aMessages) > 0) { + $notis .= $notification->returnNotification("warning", implode("
    ", $aMessages)) . "
    "; + } + } else { + $_REQUEST["selGroup"] = unserialize ($oNewsletter->get("send_ids")); + if (!is_array($_REQUEST["selGroup"])) + { + $_REQUEST["selGroup"] = unserialize($oClientLang->getProperty("newsletter", "sendgroups")); + if (!is_array($_REQUEST["selGroup"])) { + $_REQUEST["selGroup"] = array(); + } + } + + $_REQUEST["ckbDispatch"] = false; + if ($oNewsletter->get("dispatch") == 1) { + $_REQUEST["ckbDispatch"] = true; + } else if ($oNewsletter->get("dispatch") == "" && $oClientLang->getProperty("newsletter", "dispatch") == "true") { + $_REQUEST["ckbDispatch"] = true; + } + } + + $oForm = new UI_Table_Form("properties"); + $oForm->setVar("frame", $frame); + $oForm->setVar("area", $area); + $oForm->setVar("action", "news_save"); + $oForm->setVar("idnewsletter", $oNewsletter->get("idnews")); + + $oForm->addHeader(i18n("Edit newsletter")); + + $oTxtName = new cHTMLTextbox("txtName", $oNewsletter->get("name"),40); + $oForm->add(i18n("Name"), $oTxtName->render()); + + $oSelType = new cHTMLSelectElement("selType"); + $aItems = array(); + $aItems[] = array("text", i18n("Text only")); + if ($oClientLang->getProperty("newsletter", "html_newsletter") == "true") { + $aItems[] = array("html", i18n("HTML and text")); + } else { + $oNewsletter->set("type", "text"); // just in case the global setting was switched off + // TODO: Should this setting be stored? + } + $oSelType->autoFill($aItems); + $oSelType->setDefault($oNewsletter->get("type")); + + $oForm->add(i18n("Type"), $oSelType->render()); + + $oTxtFromEMail = new cHTMLTextbox("txtFromEMail", $oNewsletter->get("newsfrom"), 40); + $oTxtFromName = new cHTMLTextbox("txtFromName", $oNewsletter->get("newsfromname"), 40); + $oTxtSubject = new cHTMLTextarea("txtSubject", $oNewsletter->get("subject"), 80, 2); + + $oForm->add(i18n("From (E-Mail)"), $oTxtFromEMail->render()); + $oForm->add(i18n("From (Name)"), $oTxtFromName->render()." ".i18n("optional")); + $oForm->add(i18n("Subject"), $oTxtSubject->render()); + + // Send options + $oSendToAll = new cHTMLRadiobutton("optSendTo", "all"); + $oSendToAll->setEvent("Click", "checkSelection(this.value)"); + $oSendToDefault = new cHTMLRadiobutton("optSendTo", "default"); + $oSendToDefault->setEvent("Click", "checkSelection(this.value)"); + $oSendToGroups = new cHTMLRadiobutton("optSendTo", "selection"); + $oSendToGroups->setEvent("Click", "checkSelection(this.value)"); + + $oRcpGroups->setWhere("idclient", $client); + $oRcpGroups->setWhere("idlang", $lang); + $oRcpGroups->setOrder("defaultgroup DESC, groupname ASC"); + $oRcpGroups->query(); + + $aItems = array(); + while ($oRcpGroup = $oRcpGroups->next()) + { + $sGroupName = $oRcpGroup->get("groupname"); + if ($oRcpGroup->get("defaultgroup")) { + $sGroupName = $sGroupName . "*"; + } + $aItems[] = array($oRcpGroup->get("idnewsgroup"), $sGroupName); + } + + $oSelGroup = new cHTMLSelectElement("selGroup[]","","groupselect"); + $oSelGroup->setSize(10); + $oSelGroup->setStyle("width: 350px; margin-top: 5px; margin-bottom: 5px; margin-left: 25px;"); + $oSelGroup->setMultiSelect(); + $oSelGroup->setAlt(i18n("Note: Hold to select multiple items.")); + $oSelGroup->autoFill($aItems); + + // No groups in the list, sendToGroups and group listbox disabled + if (count($aItems) == 0) + { + $oSendToGroups->setDisabled(true); + if ($_REQUEST["optSendTo"] == "selection") { + $_REQUEST["optSendTo"] == "all"; + } + } else if (is_array($_REQUEST["selGroup"])) { + foreach ($_REQUEST["selGroup"] as $sValue) + { + if (array_key_exists($sValue, $oSelGroup->_options)) { + // only select, if item still exists + $oSelGroup->_options[$sValue]->setSelected(true); + } + } + } + + switch ($_REQUEST["optSendTo"]) + { + case "default": + $oSendToDefault->setChecked(true); + $oSelGroup->setDisabled(true); + break; + case "selection": + $oSendToGroups->setChecked(true); + break; + default: + $oSendToAll->setChecked(true); + $oSelGroup->setDisabled(true); + } + + // Recipients + $oForm->add(i18n("Recipients"), + $oSendToAll->toHTML(false)." ".i18n("Send newsletter to all recipients")."
    ".chr(10). + $oSendToDefault->toHTML(false)." ".i18n("Send newsletter to the members of the default group")."
    ".chr(10). + $oSendToGroups->toHTML(false)." ".i18n("Send newsletter to the members of the selected group(s):")."
    ".chr(10). + $oSelGroup->render()); + + /* TODO: Work in progress + // Files + $oSelFiles = new cHTMLSelectElement("selFiles[]", "", "fileselect"); + $oSelFiles->setSize(5); + //$oSelGroup->setStyle("width: 350px; margin-top: 5px; margin-bottom: 5px; margin-left: 25px;"); + $oSelFiles->setMultiSelect(); + $oSelFiles->setAlt(i18n("Note: Hold to select multiple items.")); + //$oSelGroup->autoFill($aItems); + $sFileSelScript = ''; + $oPage->addScript('selFile', $sFileSelScript); + $oForm->add(i18n("Attachments"), $oSelFiles->render().'
    Test'); + */ + + // Options + $ckbWelcome = new cHTMLCheckbox("ckbWelcome", "1"); + $ckbWelcome->setChecked($oNewsletter->get("welcome")); + + // Generate disabled cronjob element + // Provide only "Use cronjob" option, if it has been explicitely enabled + // (and the admin knows, what he is doing - like using a real cronjob, not a simulated one...) + // Note, that the run_newsletter_job.php file has not been added to the cronjob + // list in the cronjobs folder - as it may be used, but not via cronjob simulation + $ckbCronJob = new cHTMLCheckbox("ckbCronJob", "1", "", $oNewsletter->get("use_cronjob"), true); + + if (getEffectiveSetting("newsletter", "option-cronjob-available", "false") == "true") { + // Enable cronjob checkbox + $ckbCronJob->setDisabled(""); + } else { + // Give the user a hint + $ckbCronJob->setAlt(i18n("Option has to be enabled as client setting - see techref for details")); + } + + $oCkbDispatch = new cHTMLCheckbox("ckbDispatch", "enabled"); + $oCkbDispatch->setChecked($oNewsletter->get("dispatch")); + $oTxtDispatchCount = new cHTMLTextbox("txtDispatchCount", $oNewsletter->get("dispatch_count"), 4); + $oTxtDispatchDelay = new cHTMLTextbox("txtDispatchDelay", $oNewsletter->get("dispatch_delay"), 4); + $oTxtDispatchDelay->setAlt(i18n("Note: Set to 0 to send chunks manually.")); + $oCkbSaveAsDefault = new cHTMLCheckbox("ckbSetDefault", "1"); + + $oForm->add(i18n("Options"), + $ckbWelcome->toHTML(false)." ".i18n("Welcome-Newsletter")."
    ". + $ckbCronJob->toHTML(false)." ".i18n("Use cronjob")."
    ". + $oCkbDispatch->toHTML(false)." ".i18n("Send in blocks:")."   ". + i18n("Recipients per block:")." ".$oTxtDispatchCount->render()." ". + i18n("Delay between blocks:")." ".$oTxtDispatchDelay->render()." ".i18n("sec.")."
    ". + $oCkbSaveAsDefault->toHTML(false)." ".i18n("Save option settings as default")); + + $oForm->add(i18n("Author"), $classuser->getUserName($oNewsletter->get("author")) . " (". $oNewsletter->get("created").")" ); + $oForm->add(i18n("Last modified by"), $classuser->getUserName($oNewsletter->get("modifiedby")). " (". $oNewsletter->get("modified").")" ); + + $sExecScript = ' + '; + $oPage->addScript('exec', $sExecScript); + + $oPage->setContent($notis . $oForm->render(true)); +} else { + $oPage->setContent($notis . ""); +} + +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_edit_message.php b/conlite/plugins/newsletter/includes/include.newsletter_edit_message.php new file mode 100644 index 0000000..b151196 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_edit_message.php @@ -0,0 +1,276 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.newsletter_edit_message.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +cInclude("includes", "functions.con.php"); // For conDeleteArt and conCopyArt + +// Initialization +$oPage = new cPage; +$oClientLang = new cApiClientLanguage(false, $client, $lang); + +// Include plugins +if (is_array($cfg['plugins']['newsletters'])) { + foreach ($cfg['plugins']['newsletters'] as $plugin) { + plugin_include("newsletters", $plugin."/".$plugin.".php"); + } +} + +// Exec actions +$oNewsletter = new Newsletter; +$oNewsletter->loadByPrimaryKey($idnewsletter); + +if ($oNewsletter->virgin == false && $oNewsletter->get("idclient") == $client && $oNewsletter->get("idlang") == $lang) { + // Check and set values + if (!is_numeric($_REQUEST["selTemplate"])) { + $_REQUEST["selTemplate"] = 0; + } + + // Saving message changes; note, that if a user doesn't have the right to save the + // text message he may still have the right to change the html article. To prevent + // changing the html article, give the user only read access right for the newsletter + // article category - the article will be shown also, if he doesn't have any rights at all... + if ($action == "news_save" && $perm->have_perm_area_action("news", $action)) // Don't use $area! + { + // Changing e.g. \' back to ' (magic_quotes) + $sMessage = Contenido_Security::unescapeDB($_REQUEST["txtMessage"]); + $oNewsletter->set("message", $sMessage); + + if ($oNewsletter->get("template_idart") != $_REQUEST["selTemplate"]) + { + if ($oNewsletter->get("idart") > 0) + { + // Template has been changed: Delete old article + // (this discards the current html content as it deletes the existing newsletter article) + conDeleteArt($oNewsletter->get("idart")); + $iIDArt = 0; + } + + if ($_REQUEST["selTemplate"] > 0) + { + // Template has been changed, but specified: Store template article as new newsletter article + $iIDArt = conCopyArticle($_REQUEST["selTemplate"], + $oClientLang->getProperty("newsletter", "html_newsletter_idcat"), + sprintf(i18n("Newsletter: %s"), $oNewsletter->get("name"))); + conMakeOnline($iIDArt, $lang); // Article has to be online for sending... + } + + $oNewsletter->set("idart", $iIDArt); + $oNewsletter->set("template_idart", $_REQUEST["selTemplate"]); + } + + $oNewsletter->store(); + } else if ($oNewsletter->get("idart") > 0) { + // Check, if html message article and template article are still available + $oArticles = new cApiArticleLanguageCollection; + $oArticles->setWhere("idlang", $lang); + $oArticles->setWhere("idart", $oNewsletter->get("idart")); + $oArticles->query(); + + if ($oArticles->count() == 0) + { + // Ups, article lost, reset idart and template_idart for newsletter + $notis = $notification->returnNotification("error", sprintf(i18n("The html newsletter article has been deleted (idart: %s), the html message is lost"), $oNewsletter->get("idart"))) . "
    "; + + $oNewsletter->set("idart", 0); + $oNewsletter->set("template_idart", 0); + $oNewsletter->store(); + } else { + $oArticles->resetQuery(); + $oArticles->setWhere("idlang", $lang); + $oArticles->setWhere("idart", $oNewsletter->get("template_idart")); + $oArticles->query(); + + if ($oArticles->count() == 0) + { + // Ups, template has been deleted: Restore from current newsletter message article + $notis = $notification->returnNotification("warning", i18n("The html newsletter template article has been deleted, it has been restored using the html message article of this newsletter")) . "
    "; + + $iIDArt = conCopyArticle($oNewsletter->get("idart"), + $oClientLang->getProperty("newsletter", "html_template_idcat"), + sprintf(i18n("%s (Template restored)"), $oNewsletter->get("name"))); + $oNewsletter->set("template_idart", $iIDArt); + $oNewsletter->store(); + } + } + } + + $oForm = new UI_Table_Form("frmNewsletterMsg"); + $oForm->setVar("frame", $frame); + $oForm->setVar("area", $area); + $oForm->setVar("action", "news_save"); + $oForm->setVar("idnewsletter", $idnewsletter); + $oForm->setWidth("100%"); + + $oForm->addHeader(sprintf(i18n("Edit newsletter message (%s)"), $oNewsletter->get("name"))); + $oForm->add(i18n("Subject"), $oNewsletter->get("subject")); + + $sTagInfoText = ''.i18n("Tag information").''. + '"; + + $iTplIDArt = 0; // Used later for on change event + if ($oNewsletter->get("type") == "html") + { + $iTplIDArt = $oNewsletter->get("template_idart"); + $oSelTemplate = new cHTMLSelectElement("selTemplate"); + $oSelTemplate->setEvent("change", "askSubmitOnTplChange(this);"); + $aOptions = array( "idcat" => $oClientLang->getProperty("newsletter", "html_template_idcat"), + "start" => true, + "offline" => true, + "order" => "title"); + $oTemplateArticles = new ArticleCollection($aOptions); + + $aItems = array(); + $aItems[] = array(0, i18n("-- none --")); + while ($oArticle = $oTemplateArticles->nextArticle()) + { + $aItems[] = array($oArticle->get("idart"), $oArticle->get("title")); + } + + $oSelTemplate->autoFill($aItems); + $oSelTemplate->setDefault($iTplIDArt); + unset ($aItems); + unset ($oArticles); + unset ($oTemplateArticles); + + $oForm->add(i18n("HTML Template"), $oSelTemplate->render()." ".i18n("Note, that changing the template discards the current html message content")); + + if ($iTplIDArt != 0) + { + $sFrameSrc = $cfgClient[$client]["path"]["htmlpath"]."front_content.php?changeview=edit&action=con_editart&idart=".$oNewsletter->get("idart")."&idcat=".$oClientLang->getProperty("newsletter", "html_newsletter_idcat")."&lang=".$lang."&contenido=".$sess->id; + $oForm->add(i18n("HTML Message"), '
    '.$sTagInfoHTML); + } else { + // Add a real note, that a template has to be specified + $notis .= $notification->returnNotification("warning", i18n("Newsletter type has been set to HTML/text, please remember to select an html template")) . "
    "; + + $oForm->add(i18n("HTML Message"), i18n("Please choose a template first")); + } + } + + $oTxtMessage = new cHTMLTextarea("txtMessage", $oNewsletter->get("message"), 80, 20); + $oForm->add(i18n("Text Message"), $oTxtMessage->render()."
    ".$sTagInfoText); + + $sExecScript = ' + '; + $oPage->addScript('messagebox', ''); + $oPage->addScript('execscript', $sExecScript); + $oPage->setContent($notis . $oForm->render(true)); +} else { + $oPage->setContent($notis . ""); +} + +$oPage->render(); +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_jobs_details.php b/conlite/plugins/newsletter/includes/include.newsletter_jobs_details.php new file mode 100644 index 0000000..4327e97 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_jobs_details.php @@ -0,0 +1,398 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.newsletter_jobs_details.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// Initialization +$oPage = new cPage; + +if ($action == "news_job_run" && $perm->have_perm_area_action($area, $action) && is_numeric($_REQUEST["idnewsjob"])) { + // Run job + $oJob = new cNewsletterJob($_REQUEST["idnewsjob"]); + $iSendCount = $oJob->runJob(); + + if ($oJob->get("dispatch") == 1 && $oJob->get("sendcount") < $oJob->get("rcpcount")) { + // Send in chunks + $sPathNext = $sess->url("main.php?area=$area&action=news_job_run&frame=4&idnewsjob=".$_REQUEST["idnewsjob"]); + + // Calculating some statistics + $iChunk = ceil($oJob->get("sendcount") / $oJob->get("dispatch_count")); + $iChunks = ceil($oJob->get("rcpcount") / $oJob->get("dispatch_count")); + + // Dispatch count > send/recipient count, set values to 1, at least + if ($iChunk == 0) { + $iChunk = 1; + } + if ($iChunks == 0) { + $iChunks = 1; + } + + if ($oJob->get("dispatch_delay") == 0) { + // Send manually + $oForm = new UI_Table_Form("properties", $sPathNext); + $oForm->addHeader(i18n("Report:")); + $oForm->add("", ""); + + $oForm->add("", sprintf(i18n("Sending newsletter ... (chunk %s of %s, recipients: %s, sent: %s)"), + $iChunk, $iChunks, $oJob->get("rcpcount"), $oJob->get("sendcount"))); + + $oForm->setActionButton("cancel", $cfg['path']['contenido_fullhtml']."images/but_cancel.gif", i18n("Stop sending"), "c"); + $oForm->setActionButton("submit", $cfg['path']['contenido_fullhtml']."images/but_ok.gif", i18n("Send next chunk"), "s", "news_job_run"); + } else { + // Send automatically + $oForm = new UI_Table_Form("properties"); + $oForm->addHeader(i18n("Report:")); + $oForm->add("", ""); + + $oForm->add("", sprintf(i18n("Sending newsletter ... (chunk %s of %s, recipients: %s, sent: %s)"), + $iChunk, $iChunks, $oJob->get("rcpcount"), $oJob->get("sendcount"))); + + $oPage->addScript("Refresh", ''); + $oForm->unsetActionButton("submit"); + $oForm->setActionButton("cancel", $cfg['path']['contenido_fullhtml']."images/but_cancel.gif", i18n("Stop sending"), "c"); + } + } else { + // All newsletters should have been sent + $oForm = new UI_Table_Form("properties"); + $oForm->addHeader(i18n("Report:")); + $oForm->add("", ""); + + $oForm->add("", sprintf(i18n("The newsletter has been sent to %s recipients"), $oJob->get("sendcount"))); + $oPage->setReload(); + } + + $oPage->setContent($notis . $oForm->render(true)); +} else if ($action == "news_job_delete" && $perm->have_perm_area_action($area, $action) && is_numeric($_REQUEST["idnewsjob"])) { + $oJobs = new cNewsletterJobCollection; + $oJobs->delete($_REQUEST["idnewsjob"]); + + $oPage->setSubnav("blank", "news_jobs"); + $oPage->setReload(); + $oPage->setContent($notis); +} else if ($action == "news_job_details" || $action == "news_job_detail_delete") { + // Show job details (recipients) + + $oLogs = new cNewsletterLogCollection; + + // Remove recipient from a job + if ($action == "news_job_detail_delete" && is_numeric($_REQUEST["idnewslog"]) && $perm->have_perm_area_action($area, "news_job_detail_delete")) + { + $oLogs->delete($_REQUEST["idnewslog"]); + } + + // Initialize + $iNextPage = Contenido_Security::toInteger($_GET['nextpage']); + if ($iNextPage <= 0) { + $iNextPage = 1; + } + + if ($_REQUEST["sortmode"] !== "DESC") { + $_REQUEST["sortmode"] = "ASC"; + } + + $sDateFormat = getEffectiveSetting("backend", "timeformat", "d.m.Y H:i"); + + // Set default values + $oUser = new cApiUser($auth->auth["uid"]); + if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST["elemperpage"]) || $_REQUEST["elemperpage"] < 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area."_job_details"); + } + if (!is_numeric($_REQUEST["elemperpage"])) { + $_REQUEST["elemperpage"] = 50; + } + if ($_REQUEST["elemperpage"] > 0) { + // - All - will not be saved + $oUser->setProperty("itemsperpage", $area."_job_details", $_REQUEST["elemperpage"]); + } + + $oFrmOptions = new UI_Table_Form("frmOptions"); + $oFrmOptions->setVar("contenido", $sess->id); + $oFrmOptions->setVar("area", $area); + $oFrmOptions->setVar("action", $action); + $oFrmOptions->setVar("frame", $frame); + $oFrmOptions->setVar("sortmode", $_REQUEST["sortmode"]); + $oFrmOptions->setVar("sortby", $_REQUEST["sortby"]); + $oFrmOptions->setVar("idnewsjob", $_REQUEST["idnewsjob"]); + //$oFrmOptions->setVar("startpage", $startpage); + //$oFrmOptions->setVar("appendparameters", $appendparameters); + $oFrmOptions->addHeader(i18n("List options")); + + $oSelElements = new cHTMLSelectElement("elemperpage"); + $oSelElements->setEvent("onchange", "document.forms.frmOptions.submit();"); + + $aData = Array("0" => i18n("-All-"), + "50" => "50", + "100" => "100", + "250" => "250", + "500" => "500"); + + foreach ($aData as $sKey => $sValue) + { + $oOption = new cHTMLOptionElement($sValue, $sKey); + $oSelElements->addOptionElement($sKey, $oOption); + } + + $oSelElements->setDefault($_REQUEST["elemperpage"]); + + //$oSelElements->setStyle('border:1px;border-style:solid;border-color:black;'); + $oFrmOptions->add(i18n("Items per page:"), $oSelElements->render()); + + // Ouput data + $oList = new cScrollList (true, "news_job_details"); + $oList->setCustom("idnewsjob", $_REQUEST["idnewsjob"]); + $oList->setCustom("nextpage", $iNextPage); + $oList->setCustom("elemperpage", $_REQUEST["elemperpage"]); + + $aCols = array("rcpname", "rcpemail", "", "status", "sent"); + $oList->setHeader(i18n("Recipient"), i18n("E-Mail"), i18n("Type"), i18n("Status"), i18n("Sent"), i18n("Actions")); + $oList->setSortable(0, true); + $oList->setSortable(1, true); + $oList->setSortable(2, false); + $oList->setSortable(3, true); + $oList->setSortable(4, true); + + // Get data + $oLogs->resetQuery(); + $oLogs->setWhere("idnewsjob", $_REQUEST["idnewsjob"]); + + $sBrowseLinks = "1"; + if ($_REQUEST["elemperpage"] > 0) + { + // First, get total data count + $oLogs->query(); + $iRecipients = $oLogs->count(); // Getting item count without limit (for page function) - better idea anybody (performance)? + + if ($iRecipients > 0 && $iRecipients > $_REQUEST["elemperpage"]) + { + $sBrowseLinks = ""; + for ($i = 1; $i <= ceil($iRecipients / $_REQUEST["elemperpage"]); $i++) + { + //$iNext = (($i - 1) * $_REQUEST["elemperpage"]) + 1; + if ($sBrowseLinks !== "") { + $sBrowseLinks .= " "; + } + if ($iNextPage == $i) + { + $sBrowseLinks .= $i."\n"; // I'm on the current page, no link + } else { + $sBrowseLinks .= ''.$i.''."\n"; + } + } + } + + $oLogs->setLimit($_REQUEST["elemperpage"] * ($iNextPage - 1), $_REQUEST["elemperpage"]); + } + + if (!array_key_exists($_REQUEST["sortby"], $aCols)) { + $_REQUEST["sortby"] = 0; // Sort by rcpname by default + } + $oLogs->setOrder($aCols[$_REQUEST["sortby"]] . " " . $_REQUEST["sortmode"]); + $oLogs->query(); + + $oImgDelete = new cHTMLImage("images/delete.gif"); + $oImgDelete->setAlt(i18n("Delete item")); + $sImgDelete = $oImgDelete->render(); + unset ($oImgDelete); + + $iCount = 0; + $aNewsType[] = array(); // Performance + $aNewsType[0] = i18n("Text only"); + $aNewsType[1] = i18n("HTML/Text"); + while ($oLog = $oLogs->next()) + { + $sName = $oLog->get("rcpname"); + $sEMail = $oLog->get("rcpemail"); + + switch ($oLog->get("status")) + { + case "pending": + $sStatus = i18n("Waiting for sending"); + break; + case "sending": + $sStatus = i18n("Sending"); + break; + case "successful": + $sStatus = i18n("Successful"); + break; + default: + $sStatus = sprintf(i18n("Error: %s"), $oLog->get("status")); + } + + if ($oLog->get("sent") == "0000-00-00 00:00:00") { + $sSent = "-"; + } else { + $sSent = date($sDateFormat, strtotime($oLog->get("sent"))); + } + + $sLnkRemove = ""; + if ($oLog->get("status") == "pending" && $perm->have_perm_area_action($area, "news_job_detail_delete")) + { + $oLnkRemove = new cHTMLLink; + $oLnkRemove->setCLink("news_jobs", 4, "news_job_detail_delete"); + $oLnkRemove->setCustom("idnewsjob", $_REQUEST["idnewsjob"]); + $oLnkRemove->setCustom("idnewslog", $oLog->get($oLog->primaryKey)); + $oLnkRemove->setCustom("sortby", $_REQUEST["sortby"]); + $oLnkRemove->setCustom("sortmode", $_REQUEST["sortmode"]); + $oLnkRemove->setContent($sImgDelete); + + $sLnkRemove = $oLnkRemove->render(); + } + + $oList->setData($iCount, $sName, $sEMail, $aNewsType[$oLog->get("rcpnewstype")], $sStatus, $sSent, $sLnkRemove); + + $iCount++; + } + + // A little bit senseless, as the data is already sorted, but + // we need the sortmode in the header link + $oList->sort($_REQUEST["sortby"], $_REQUEST["sortmode"]); + + // HerrB: Hardcore UI for browsing elements ... sorry + $sBrowseHTML = ' + + + + + + +
    ' . + sprintf(i18n("Go to page: %s"), $sBrowseLinks) . '
    '; + + $oPage->setContent($oFrmOptions->render() . "
    " . $oList->render() . $sBrowseHTML); +} else { + // Just show the job data + $oJob = new cNewsletterJob($_REQUEST["idnewsjob"]); + + $oForm = new UI_Table_Form("properties"); + $oForm->setVar("frame", $frame); + $oForm->setVar("area", $area); + $oForm->setVar("action", ""); + $oForm->setVar("idnewsjob", $idnewsjob); + + $oForm->addHeader(i18n("Newsletter Dispatch Job")); + + $oForm->add(i18n("Name"), $oJob->get("name")); + + $sDateFormat = getEffectiveSetting("backend", "timeformat", "d.m.Y H:i"); + switch ($oJob->get("status")) + { + case 1: + $oForm->add(i18n("Status"), i18n("Pending")); + break; + case 2: + $oForm->add(i18n("Status"), sprintf(i18n("Sending (started: %s)"), + date($sDateFormat, strtotime($oJob->get("started"))))); + break; + case 9: + $oForm->add(i18n("Status"), sprintf(i18n("Finished (started: %s, finished: %s)"), + date($sDateFormat, strtotime($oJob->get("started"))), + date($sDateFormat, strtotime($oJob->get("finished"))))); + break; + } + + $oForm->add(i18n("Statistics"), sprintf(i18n("Planned: %s, Send: %s"), $oJob->get("rcpcount"), $oJob->get("sendcount"))); + $oForm->add(i18n("From"), $oJob->get("newsfrom") . " (" . $oJob->get("newsfromname") . ")"); + $oForm->add(i18n("Subject"), $oJob->get("subject")); + + if ($oJob->get("type") == "html") + { + $oForm->add(i18n("Type"), i18n("HTML and text")); + + $txtMessageHTML = new cHTMLTextarea("txtMessageHTML", $oJob->get("message_html"), 80, 20); + $txtMessageHTML->setDisabled("disabled"); + + $oForm->add(i18n("HTML Message"), $txtMessageHTML->render()); + } else { + $oForm->add(i18n("Type"), i18n("Text only")); + } + $txtMessageText = new cHTMLTextarea("txtMessageText", $oJob->get("message_text"), 80, 20); + $txtMessageText->setDisabled("disabled"); + + $oForm->add(i18n("Text Message"), $txtMessageText->render()); + + $aSendTo = unserialize($oJob->get("send_to")); + switch ($aSendTo[0]) + { + case "all": + $sSendToInfo = i18n("Send newsletter to all recipients"); + break; + case "default": + $sSendToInfo = i18n("Send newsletter to the members of the default group"); + break; + case "selection": + $sSendToInfo = i18n("Send newsletter to the members of the selected group(s):"); + + unset ($aSendTo[0]); + foreach ($aSendTo as $sGroup) + { + $sSendToInfo .= "
    " . $sGroup; + } + break; + case "single": + $sSendToInfo = i18n("Send newsletter to single recipient:"); + $sSendToInfo .= "
    " . $aSendTo[1] . " (" . $aSendTo[2] . ")"; + break; + default: + } + unset ($aSendTo); + + $oForm->add(i18n("Recipients"), $sSendToInfo); + + if ($oJob->get("use_cronjob") == 1) { + $sOptionsInfo = i18n("Use cronjob: Enabled"); + } else { + $sOptionsInfo = i18n("Use cronjob: Not enabled"); + } + + if ($oJob->get("dispatch")) { + $sOptionsInfo .= "
    " . sprintf(i18n("Dispatch: Enabled (block size: %s, delay: %s sec.)"), $oJob->get("dispatch_count"), $oJob->get("dispatch_delay")); + } else { + $sOptionsInfo .= "
    " . i18n("Dispatch: Disabled"); + } + + $oForm->add(i18n("Options"), $sOptionsInfo); + + $oForm->add(i18n("Author"), $oJob->get("authorname")); + $oForm->add(i18n("Created"), $oJob->get("created")); + + // Just remove the "save changes" message (as it is not possible to remove the image completely in ui_table_form) + $oForm->setActionButton("submit", $cfg['path']['contenido_fullhtml']."images/but_ok.gif", "", "s"); + + $oPage->setContent($oForm->render(true)); +} + +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_jobs_menu.php b/conlite/plugins/newsletter/includes/include.newsletter_jobs_menu.php new file mode 100644 index 0000000..0b16dd2 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_jobs_menu.php @@ -0,0 +1,344 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.newsletter_jobs_menu.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +################################## +# Initialization +################################## +$oPage = new cPage; +$oMenu = new UI_Menu; +$oJobs = new cNewsletterJobCollection; +$oUser = new cApiUser($auth->auth["uid"]); + +// Specify fields for search, sort and validation. Design makes enhancements +// using plugins possible (currently not implemented). If you are changing things here, +// remember to update include.newsletter_left_top.php, also. +// field: Field name in the db +// caption: Shown field name (-> user) +// base: Elements from core code (other type may be: "plugin") +// sort: Element can be used to be sorted by +// search: Element can be used to search in +$aFields = array(); +$aFields["name"] = array("field" => "name", "caption" => i18n("Name"), "type" => "base,sort,search"); +$aFields["created"] = array("field" => "created", "caption" => i18n("Created"), "type" => "base,sort"); +$aFields["status"] = array("field" => "status", "caption" => i18n("Status"), "type" => "base,sort"); +// Not needed, as no sort/search, but keep as memo: $aFields["cronjob"] = array("field" => "use_cronjob", "caption" => i18n("Use cronjob"), "type" => "base"); + +################################## +# Check external input +################################## +// Items per page (value stored per area in user property) +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST["elemperpage"]) || $_REQUEST["elemperpage"] < 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); +} +if (!is_numeric($_REQUEST["elemperpage"])) { + // This is the case, if the user property has never been set (first time user) + $_REQUEST["elemperpage"] = 25; +} +if ($_REQUEST["elemperpage"] > 0) { + // -- All -- will not be stored, as it may be impossible to change this back to something more useful + $oUser->setProperty("itemsperpage", $area, $_REQUEST["elemperpage"]); +} +unset ($oUser); + +$_REQUEST["page"] = (int)$_REQUEST["page"]; +if ($_REQUEST["page"] <= 0 || $_REQUEST["elemperpage"] == 0) { + $_REQUEST["page"] = 1; +} +// Sort order +if ($_REQUEST["sortorder"] != "ASC") { + $_REQUEST["sortorder"] = "DESC"; // Note, default is DESC (as default sortby is "created" date) +} + +// Check sort by and search in criteria +$bSortByFound = false; +$bSearchInFound = false; +foreach ($aFields as $sKey => $aData) +{ + if ($aData["field"] == $_REQUEST["sortby"] && strpos($aData["type"], "sort") !== false) { + $bSortByFound = true; + } + if ($aData["field"] == $_REQUEST["searchin"] && strpos($aData["type"], "search") !== false) { + $bSearchInFound = true; + } +} + +if (!$bSortByFound) { + $_REQUEST["sortby"] = "created"; // Default sort by field, possible values see above +} +if (!$bSearchInFound) { + $_REQUEST["searchin"] = "--all--"; +} + +// Author +if ($_REQUEST["selAuthor"] == "") { + $_REQUEST["selAuthor"] = $auth->auth["uid"]; +} + +// Free memory +unset($oUser); + +################################## +# Get data +################################## + +$oJobs->setWhere("idclient", $client); +$oJobs->setWhere("idlang", $lang); +$oJobs->setWhere("author", $_REQUEST["selAuthor"]); + +if ($_REQUEST["filter"] != "") +{ + if ($_REQUEST["searchin"] == "--all--" || $_REQUEST["searchin"] == "") + { + foreach ($aFields as $sKey => $aData) + { + if (strpos($aData["type"], "search") !== false) { + $oJobs->setWhereGroup("filter", $aData["field"], $_REQUEST["filter"], "LIKE"); + } + } + $oJobs->setInnerGroupCondition("filter", "OR"); + } else { + $oJobs->setWhere($_REQUEST["searchin"], $_REQUEST["filter"], "LIKE"); + } +} + +if ($_REQUEST["elemperpage"] > 0) +{ + $oJobs->query(); + + // Getting item count without limit (for page function) - better idea anyone (performance)? + $iItemCount = $oJobs->count(); + + if ($_REQUEST["elemperpage"]*($_REQUEST["page"]) >= $iItemCount+$_REQUEST["elemperpage"] && $_REQUEST["page"] != 1) { + $_REQUEST["page"]--; + } + $oJobs->setLimit($_REQUEST["elemperpage"] * ($_REQUEST["page"] - 1), $_REQUEST["elemperpage"]); +} else { + $iItemCount = 0; +} + +$oJobs->setOrder($_REQUEST["sortby"] . " " . $_REQUEST["sortorder"]); +$oJobs->query(); + +// Output data +$oMenu = new UI_Menu; +$iMenu = 0; +$sDateFormat = getEffectiveSetting("backend", "timeformat", "d.m.Y H:i"); + +// Store messages for repeated use (speeds performance, as i18n translation is only needed once) +$aMsg = array(); +$aMsg["DelTitle"] = i18n("Delete dispatch job"); +$aMsg["DelDescr"] = i18n("Do you really want to delete the following newsletter dispatch job:
    "); + +$aMsg["SendTitle"] = i18n("Run job"); +$aMsg["SendDescr"] = i18n("Do you really want to run the following job:
    "); + +// Prepare "send link" template +$sTplSend = ''.$aMsg['; + +while ($oJob = $oJobs->next()) +{ + $iMenu++; + $iID = $oJob->get("idnewsjob"); + $sName = $oJob->get("name") . " (" . date($sDateFormat, strtotime($oJob->get("created"))) .")"; + + $oLnk = new cHTMLLink; + $oLnk->setMultiLink($area, "", $area, ""); + $oLnk->setCustom("idnewsjob", $iID); + + // Is at present redundant + // HerrB: No, it's just not used/set... + //$oMenu->setImage($iMenu, "images/newsletter_16.gif"); + $oMenu->setTitle($iMenu, $sName); + + switch ($oJob->get("status")) + { + case 1: + // Pending + if ($oJob->get("cronjob") == 0) + { + // Standard job can be run if user has the right to do so + if ($perm->have_perm_area_action($area, "news_job_run")) + { + $sLnkSend = str_replace('{ID}', $iID, $sTplSend); + $sLnkSend = str_replace('{NAME}', addslashes($sName), $sLnkSend); + + $oMenu->setActions($iMenu, 'send', $sLnkSend); + } + } else if ($oJob->get("cronjob") == 1) { + // It's a cronjob job - no manual sending, show it blue + $oLnk->updateAttributes(array("style" => "color:#0000FF")); + } + + if ($perm->have_perm_area_action($area, "news_job_delete")) { + // Job may be deleted, if user has the right to do so + $oMenu->setActions($iMenu, 'delete', ''.$aMsg['); + } + break; + case 2: + // Sending job + if ($perm->have_perm_area_action($area, "news_job_run")) + { + // User may try to start sending, again - if he has the right to do so + $sLnkSend = str_replace('{ID}', $iID, $sTplSend); + $sLnkSend = str_replace('{NAME}', addslashes($sName), $sLnkSend); + + $oMenu->setActions($iMenu, 'send', $sLnkSend); + } + + $oLnk->updateAttributes(array("style" => "color:#da8a00")); + + $sDelete = ''.$aMsg['; + break; + case 9: + // Job finished, don't do anything + $oLnk->updateAttributes(array("style" => "color:#808080")); + + if ($perm->have_perm_area_action($area, "news_job_delete")) { + // You have the right, but you can't delete the job after sending + $oMenu->setActions($iMenu, 'delete', ''.$aMsg['); + } + break; + } + + $oMenu->setLink($iMenu, $oLnk); +} + +$sExecScript = ' + '; + +$oPage->setMargin(0); +// Messagebox JS has to be included before ExecScript! +$oPage->addScript('messagebox', ''); +$oPage->addScript('exec', $sExecScript); +$oPage->addScript('parameterCollector.js', ''); + +//generate current content for Object Pager +$sPagerId = '0ed6d632-6adf-4f09-a0c6-1e38ab60e303'; +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("selAuthor", $_REQUEST["selAuthor"]); +$oPagerLink->setCustom("elemperpage", $_REQUEST["elemperpage"]); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("searchin", $_REQUEST["searchin"]); +$oPagerLink->setCustom("frame", $frame); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); +// Note, that after the "page" parameter no "pagerlink" parameter is specified - +// it is not used, as the JS below only uses the INNER html and the "pagerlink" parameter is +// set by ...left_top.html for the foldingrow itself +$oPager = new cObjectPager($sPagerId, $iItemCount, $_REQUEST["elemperpage"], $_REQUEST["page"], $oPagerLink, "page"); + +// Add slashes, to insert in javascript +$sPagerContent = $oPager->render(1); +$sPagerContent = str_replace('\\', '\\\\', $sPagerContent); +$sPagerContent = str_replace('\'', '\\\'', $sPagerContent); + +// Send new object pager to left_top +$oPage->addScript('setpager', ''); + +$sRefreshPager = ' + '; + +$oPage->addScript('refreshpager', $sRefreshPager); + +//$oPage->setContent(array('', $oListOptionRow, '
    ', $oMenu->render(false))); +$oPage->setContent($oMenu->render(false)); +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_jobs_subnav.php b/conlite/plugins/newsletter/includes/include.newsletter_jobs_subnav.php new file mode 100644 index 0000000..065add9 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_jobs_subnav.php @@ -0,0 +1,67 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.newsletter_jobs_subnav.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if (isset($_GET['idnewsjob']) && (int)$_GET['idnewsjob'] > 0) +{ + $sCaption = i18n("View"); + $tmp_area = "foo2"; + + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$sCaption.''); + $tpl->next(); + + $sCaption = i18n("Details"); + $tmp_area = "foo2"; + + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$sCaption.''); + $tpl->next(); + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_left_top.php b/conlite/plugins/newsletter/includes/include.newsletter_left_top.php new file mode 100644 index 0000000..3d89512 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_left_top.php @@ -0,0 +1,960 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2008-08-03, Bj�rn Behrens (HerrB), complete makeover to fix bugs and reduce memory waste + * + * $Id: include.newsletter_left_top.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +###################################### +# Initialization +###################################### +if (!is_object($oTpl)) { + $oTpl = new Template; +} +if (!is_object($oDB)) { + $oDB = new DB_ConLite; // We have really to send a special SQL statement - we need a DB object +} + +$oUser = new cApiUser($auth->auth["uid"]); +$oClient = new cApiClient($client); +$oClientLang = new cApiClientLanguage(false, $client, $lang); + +###################################### +# 0. BUTTONS +###################################### +// Newsletter +$sId = 'img_newsletter'; +$oTpl->set('s', 'INEWSLETTER', $sId); +if ($perm->have_perm_area_action('news')) { + $sButtonRow = ''; + $sButtonRow .= ''.i18n('; + $sButtonRow .= ''; +} + +// Job dispatch +$sId = 'img_dispatch'; +$oTpl->set('s', 'IDISPATCH', $sId); +if ($perm->have_perm_area_action('news_jobs')) { + $sButtonRow .= ''; + $sButtonRow .= ''.i18n('; + $sButtonRow .= ''; +} + +// Recipients +$sId = 'img_recipient'; +$oTpl->set('s', 'IRECIPIENTS', $sId); +if ($perm->have_perm_area_action('recipients')) { + $sButtonRow .= ''; + $sButtonRow .= ''.i18n('; + $sButtonRow .= ''; +} + +// Recipient groups +$sId = 'img_recipientgroup'; +$oTpl->set('s', 'IRECIPIENTGROUP', $sId); +if ($perm->have_perm_area_action('recipientgroups')) { + $sButtonRow .= ''; + $sButtonRow .= ''.i18n('; + $sButtonRow .= ''; +} + +$oTpl->set('s', 'BUTTONROW', $sButtonRow); +unset($sButtonRow); + +###################################### +# 1. NEWSLETTER +###################################### + +###################################### +# 1.1 Newsletter: Actions folding row +###################################### +$sLink = "actionlink"; // ID for HTML element +$oActionsRow = new cFoldingRow("28cf9b31-e6d7-4657-a9a7-db31478e7a5c",i18n("Actions"), $sLink); +$oTpl->set('s', 'ACTIONLINK', $sLink); + +if ($perm->have_perm_area_action("news", "news_create")) +{ + // Create the link to add a newsletter + $sContent = '
    '."\n"; + + $oLink = new cHTMLLink; + $oLink->setMultiLink("news", "", "news", "news_create"); + $oLink->setContent(''.i18n("Create newsletter")); + + $sContent .= $oLink->render() . '
    '."\n"; + $oActionsRow->setContentData($sContent); +} else { + $oActionsRow->setContentData(""); +} + +###################################### +# 1.2 Newsletter: Settings folding row +###################################### +$sLink = "settingslink"; +$oSettingsRow = new cFoldingRow("d64baf0a-aea9-47b3-8490-54a00fce02b5",i18n("Settings"), $sLink); +$oTpl->set('s', 'SETTINGSLINK', $sLink); + +// HTML Newsletter: Template and newsletter category +// Note, that in PHP 5 it is not possible to have a truely working copy of an object +// so, we are filling two almost identical objects with the same data ("clone" may work, but is not available in PHP4 ...) +$oSelHTMLTemplateIDCat = new cHTMLSelectElement("selHTMLTemplateCat"); +$oSelHTMLTemplateIDCat->setStyle("width: 220px;"); + +$oSelHTMLNewsletterIDCat = new cHTMLSelectElement("selHTMLNewsletterCat"); +$oSelHTMLNewsletterIDCat->setStyle("width: 220px;"); + +$oOptionTemplate = new cHTMLOptionElement("--".i18n("Please select")."--", 0); +$oSelHTMLTemplateIDCat->addOptionElement(0, $oOptionTemplate); +$oOptionNewsletter = new cHTMLOptionElement("--".i18n("Please select")."--", 0); +$oSelHTMLNewsletterIDCat->addOptionElement(0, $oOptionNewsletter); + +$sSQL = "SELECT tblCat.idcat AS idcat, tblCatLang.name AS name, tblCatTree.level AS level, "; +$sSQL .= "tblCatLang.visible AS visible, tblCatLang.public AS public FROM "; +$sSQL .= $cfg["tab"]["cat"]." AS tblCat, ".$cfg["tab"]["cat_lang"]." AS tblCatLang, "; +$sSQL .= $cfg["tab"]["cat_tree"]." AS tblCatTree "; +$sSQL .= "WHERE tblCat.idclient = '".Contenido_Security::toInteger($client)."' AND tblCatLang.idlang = '".Contenido_Security::toInteger($lang)."' AND "; +$sSQL .= "tblCatLang.idcat = tblCat.idcat AND tblCatTree.idcat = tblCat.idcat "; +$sSQL .= "ORDER BY tblCatTree.idtree"; + +$oDB->query($sSQL); + +while ($oDB->next_record()) { + $sSpaces = "  "; + + for ($i = 0; $i < $oDB->f("level"); $i ++) { + $sSpaces .= "     "; + } + + $oOptionTemplate = new cHTMLOptionElement($sSpaces.$oDB->f("name"), $oDB->f("idcat")); + $oOptionNewsletter = new cHTMLOptionElement($sSpaces.$oDB->f("name"), $oDB->f("idcat")); + if ($oDB->f("visible") == 0 || $oDB->f("public") == 0) { + $oOptionTemplate->setStyle("color: #666666;"); + $oOptionNewsletter->setStyle("color: #666666;"); + } + + $oSelHTMLTemplateIDCat->addOptionElement($oDB->f("idcat"), $oOptionTemplate); + $oSelHTMLNewsletterIDCat->addOptionElement($oDB->f("idcat"), $oOptionNewsletter); +} + +// Get html template category +$iHTMLTemplateIDCat = (int)$oClientLang->getProperty("newsletter", "html_template_idcat"); +if ($iHTMLTemplateIDCat < 0) { + $iHTMLTemplateIDCat = 0; +} +$oSelHTMLTemplateIDCat->setDefault($iHTMLTemplateIDCat); + +// Get html newsletter article category +$iHTMLNewsletterIDCat = (int)$oClientLang->getProperty("newsletter", "html_newsletter_idcat"); +if ($iHTMLNewsletterIDCat < 0) { + $iHTMLNewsletterIDCat = 0; +} +$oSelHTMLNewsletterIDCat->setDefault($iHTMLNewsletterIDCat); + +// Global HTML newsletter option +$bHTMLNewsletter = false; +if ($iHTMLTemplateIDCat > 0 && $iHTMLNewsletterIDCat > 0 && $oClientLang->getProperty("newsletter", "html_newsletter") == "true") { + // If necessary idcats are not specified or the option is disabled, + // then HTML are not used + $bHTMLNewsletter = true; +} +$oCkbHTMLNewsletter = new cHTMLCheckbox("ckbHTMLNewsletter", "enabled", "", $bHTMLNewsletter); + +// Disable HTML options, if user has no rights +if (!$perm->have_perm_area_action($area, "news_html_settings")) +{ + $oSelHTMLTemplateIDCat->setDisabled("disabled"); + $oSelHTMLNewsletterIDCat->setDisabled("disabled"); + $oCkbHTMLNewsletter->setDisabled("disabled"); +} + +// Destination for sending test newsletter +$oSelTestDestination = new cHTMLSelectElement("selTestDestination"); +$oSelTestDestination->setStyle("width: 220px;"); + +$oOption = new cHTMLOptionElement(i18n("My mail address"), 0); +$oSelTestDestination->addOptionElement(0, $oOption); + +$oRcpGroups = new RecipientGroupCollection; +$oRcpGroups->setWhere("idclient", (int)$client); +$oRcpGroups->setWhere("idlang", (int)$lang); +$oRcpGroups->setOrder("groupname"); +$oRcpGroups->query(); + +$bTestTargetFound = false; +// Get client and language specific test destination. As lang is client specific, lang is sufficient +$iTestDestination = (int)$oUser->getProperty("newsletter", "test_idnewsgrp_lang" . $lang); +while ($oRcpGroup = $oRcpGroups->next()) +{ + $iID = $oRcpGroup->get($oRcpGroup->primaryKey); + + if ($iTestDestination == $iID) { + $bTestTargetFound = true; + } + + $oOption = new cHTMLOptionElement($oRcpGroup->get("groupname"), $iID); + $oSelTestDestination->addOptionElement($iID, $oOption); +} +unset($oRcpGroups); + +if (!$bTestTargetFound) { + // Currently specified test target doesn't exist anymore, get back to "my mail" + $iTestDestination = 0; +} +if (!$perm->have_perm_area_action($area, "news_send_test")) +{ + // No right to send somewhere else than to yourself + $iTestDestination = 0; + $oSelTestDestination->setDisabled("disabled"); +} +$oSelTestDestination->setDefault($iTestDestination); + +$oBtnSave = new cHTMLButton("submit", i18n("Save")); + +$sContent = '
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= '
    '.$oCkbHTMLNewsletter->toHTML(false).' '.i18n("Enable HTML Newsletter").'
    '.i18n("HTML Template Category:").'
    '.$oSelHTMLTemplateIDCat->render().'
    '.i18n("HTML Newsletter Category:").'
    '.$oSelHTMLNewsletterIDCat->render().'
    '.i18n("Send test destination:").'
    '.$oSelTestDestination->render().'
    '.$oBtnSave->render().'
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= '
    '."\n"; +$oSettingsRow->setContentData($sContent); + +###################################### +# 1.3 Newsletter: List options folding row +###################################### +// Items per Page +$iItemsPerPage = (int)$oUser->getProperty("itemsperpage", "news"); // Also used in query below +if ($iItemsPerPage == 0) { + $iItemsPerPage = 25; // All can't be saved +} + +$oSelItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelItemsPerPage->setDefault($iItemsPerPage); +// Sort By +$oSelSortBy = new cHTMLSelectElement("sortby"); +$oOption = new cHTMLOptionElement("Name", "name"); +$oSelSortBy->addOptionElement($sKey, $oOption); +$oSelSortBy->setDefault("name"); +// Sort Order +$oSelSortOrder = new cHTMLSelectElement("sortorder"); +$oSelSortOrder->autoFill(array("ASC" => i18n("Ascending"), "DESC" => i18n("Descending"))); +$oSelSortOrder->setDefault("ASC"); +// Search For +$oTextboxFilter = new cHTMLTextbox("filter", "", 16); +// Search In +$oSelSearchIn = new cHTMLSelectElement("searchin"); +$oOption = new cHTMLOptionElement(i18n("-- All fields --"), "--all--"); +$oSelSearchIn->addOptionElement("all", $oOption); +$oOption = new cHTMLOptionElement("Name", "name"); +$oSelSearchIn->addOptionElement($sKey, $oOption); +$oSelSearchIn->setDefault("name"); +// Apply button +$oBtnApply = new cHTMLButton("submit", i18n("Apply")); + +$sContent = '
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= '
    '. i18n("Items / page").''.$oSelItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelSortBy->render().'
    '. i18n("Sort order").''.$oSelSortOrder->render().'
    '. i18n("Search for").''.$oTextboxFilter->render().'
    '. i18n("Search in").''.$oSelSearchIn->render().'
     '.$oBtnApply->render().'
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= '
    '."\n"; + +// To template +$sLink = "listoption"; +$oListOptionsRow = new cFoldingRow("9d0968be-601d-44f8-a666-99d51c9c777d",i18n("List options"), $sLink); +$oListOptionsRow->setContentData($sContent); +$oTpl->set('s', 'LISTOPTIONLINK', $sLink); + +###################################### +# 1.4 Newsletter: Paging folding row +###################################### + +// Add paging folding row (current page = 1) to get HTML paging container (later on updated by ...menu.php) +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame("left_bottom"); +$oPagerLink->setCustom("elemperpage", $iItemsPerPage); +$oPagerLink->setCustom("filter", ""); +//$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("sortby", "name"); +$oPagerLink->setCustom("sortorder", "ASC"); +$oPagerLink->setCustom("searchin", "name"); +$oPagerLink->setCustom("frame", "2"); +$oPagerLink->setCustom("area", "news"); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +$sLink = "pagerlink"; +$oTpl->set('s', 'PAGINGLINK', $sLink); +//$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e302", $iItemCount, $iItemsPerPage, 1, $oPagerLink, 'page', $sLink); +$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e302", 0, 1, 1, $oPagerLink, 'page', $sLink); + +###################################### +# Newsletter: Container +###################################### +$sContainerId = 'cont_newsletter'; +$sContainer = '
    '; +$sContainer .= ''; +if ($perm->have_perm_area_action("news", "news_create")) { + $sContainer .= $oActionsRow->render(); +} +if ($perm->have_perm_area_action("news", "news_html_settings")) { + $sContainer .= $oSettingsRow->render(); +} +$sContainer .= $oListOptionsRow->render(); +$sContainer .= $oPagerRow->render(); +$sContainer .= '
    '; +$sContainer .= '
    '; +$oTpl->set('s', 'CNEWSLETTER', $sContainer); +$oTpl->set('s', 'ID_CNEWSLETTER', $sContainerId); + +###################################### +# 2. Job dispatch +###################################### +// Specify fields for search, sort and validation. Design makes enhancements +// using plugins possible (currently not implemented). If you are changing things here, +// remember to update include. ... menu.php, also. +// field: Field name in the db +// caption: Shown field name (-> user) +// base: Elements from core code (other type may be: "plugin") +// sort: Element can be used to be sorted by +// search: Element can be used to search in +$aFields = array(); +$aFields["name"] = array("field" => "name", "caption" => i18n("Name"), "type" => "base,sort,search"); +$aFields["created"] = array("field" => "created", "caption" => i18n("Created"), "type" => "base,sort"); +$aFields["status"] = array("field" => "status", "caption" => i18n("Status"), "type" => "base,sort"); +$aFields["cronjob"] = array("field" => "use_cronjob", "caption" => i18n("Use cronjob"), "type" => "base"); + +###################################### +# 2.1 Job dispatch: List options folding row +###################################### +// Author +$oSelAuthor = new cHTMLSelectElement("selAuthor"); + +// Get possible authors/users from available jobs +// For this query genericdb can't be used, as the class id is always included (distinct won't work) +$sSQL = "SELECT DISTINCT author, authorname FROM ".$cfg["tab"]["news_jobs"]." ORDER BY authorname"; +$oDB->query($sSQL); + +$aItems = array(); +$bUserInList = false; +while ($oDB->next_record()) +{ + if ($oDB->f("author") == $auth->auth["uid"]) { + $bUserInList = true; + } + $aItems[] = array($oDB->f("author"), urldecode($oDB->f("authorname"))); +} +$oSelAuthor->autoFill($aItems); + +if (!$bUserInList) { + // Current ser hasn't sent newsletter jobs, yet - add him to the list (it's the default author) + $oOption = new cHTMLOptionElement($auth->auth["uname"], $auth->auth["uid"]); + $oSelAuthor->addOptionElement($auth->auth["uid"], $oOption); +} +$oSelAuthor->setDefault($auth->auth["uid"]); + +// Items per page +$iItemsPerPage = (int)$oUser->getProperty("itemsperpage", "news_jobs"); // Used also below in query +if ($iItemsPerPage == 0) { + $iItemsPerPage = 25; // All can't be saved +} + +$oSelItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelItemsPerPage->setDefault($iItemsPerPage); + +// Sort by +$oSelSortBy = new cHTMLSelectElement("sortby"); +foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "sort") !== false) + { + $oOption = new cHTMLOptionElement($aData["caption"], $sKey); + $oSelSortBy->addOptionElement($sKey, $oOption); + } +} +$oSelSortBy->setDefault("created"); + +// Sort order +$oSelSortOrder = new cHTMLSelectElement("sortorder"); +$oSelSortOrder->autoFill(array("ASC" => i18n("Ascending"), "DESC" => i18n("Descending"))); +$oSelSortOrder->setDefault("DESC"); + +// Filter +$oTxtFilter = new cHTMLTextbox("filter", "", 16); + +//Search in +$oSelSearchIn = new cHTMLSelectElement("searchin"); +$oOption = new cHTMLOptionElement(i18n("-- All fields --"), "--all--"); +$oSelSearchIn->addOptionElement("all", $oOption); + +foreach ($aFields as $sKey => $aData) +{ + if (strpos($aData["type"], "search") !== false) + { + $oOption = new cHTMLOptionElement($aData["caption"], $sKey); + $oSelSearchIn->addOptionElement($sKey, $oOption); + } +} +$oSelSearchIn->setDefault("--all--"); + +$oBtnApply = new cHTMLButton("submit", i18n("Apply")); + +$sContent = '
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= '
    '. i18n("Author").''.$oSelAuthor->render().'
    '. i18n("Items / page").''.$oSelItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelSortBy->render().'
    '. i18n("Sort order").''.$oSelSortOrder->render().'
    '. i18n("Search for").''.$oTxtFilter->render().'
    '. i18n("Search in").''.$oSelSearchIn->render().'
     '.$oBtnApply->render().'
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= '
    '."\n"; + +// To template +$sLink = "listoptiondisp"; +$oListOptionsRow = new cFoldingRow("dfa6cc00-0acf-11db-9cd8-0800200c9a66",i18n("List options"), $sLink); +$oListOptionsRow->setContentData($sContent); +$oTpl->set('s', 'LISTOPTIONLINKDISP', $sLink); + +###################################### +# 2.2 Job dispatch: Paging folding row +###################################### +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("selAuthor", $auth->auth["uid"]); +$oPagerLink->setCustom("elemperpage", $iItemsPerPage); +$oPagerLink->setCustom("filter", ""); +//$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("sortby", "created"); +$oPagerLink->setCustom("sortorder", "DESC"); +$oPagerLink->setCustom("searchin", "--all--"); +$oPagerLink->setCustom("frame", "2"); // HIER!!! Stimmt das? +$oPagerLink->setCustom("area", "news_jobs"); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +$sLink = "pagerlinkdisp"; +$oTpl->set('s', 'PAGINGLINKDISP', $sLink); +//$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e303", $iItemCount, $iItemsPerPage, 1, $oPagerLink, "page", $sLink); +$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e303", 0, 1, 1, $oPagerLink, 'page', $sLink); + +###################################### +# Job dispatch: Container +###################################### +$sContainerId = 'cont_dispatch'; +$sContainer = '
    '; +$sContainer .= ''; +$sContainer .= $oListOptionsRow->render(); +$sContainer .= $oPagerRow->render(); +$sContainer .= '
    '; +$sContainer .= '
    '; +$oTpl->set('s', 'CDISPATCH', $sContainer); +$oTpl->set('s', 'ID_CDISPATCH', $sContainerId); + +###################################### +# 3. Recipients +###################################### +// See comment at 2. Job dispatch +$aFields = array(); +$aFields["name"] = array("field" => "name", "caption" => i18n("Name"), "type" => "base,sort,search"); +$aFields["email"] = array("field" => "email", "caption" => i18n("E-Mail"), "type" => "base,sort,search"); +$aFields["confirmed"] = array("field" => "confirmed", "caption" => i18n("Confirmed"), "type" => "base"); +$aFields["deactivated"] = array("field" => "deactivated", "caption" => i18n("Deactivated"), "type" => "base"); + +###################################### +# 3.1 Recipients: Actions folding row +###################################### +$sContent = '
    '."\n"; + +// Create a link to add a recipient +if ($perm->have_perm_area_action("recipients", "recipients_create")) +{ + $oLink = new cHTMLLink; + $oLink->setMultiLink("recipients","","recipients","recipients_create"); + $oLink->setContent(''.i18n("Create recipient").''); + + $sContent .= $oLink->render().'
    '."\n"; +} + +// Create a link to import recipients +if ($perm->have_perm_area_action("recipients", "recipients_create")) +{ + $oLink = new cHTMLLink; + $oLink->setMultiLink("recipients", "", "recipients_import", "recipients_import"); + $oLink->setContent(''.i18n("Import recipients").''); + + $sContent .= $oLink->render().'
    '."\n"; +} + +// Create a link to purge subscribed but not confirmed recipients +$iTimeframe = (int)$oClient->getProperty("newsletter", "purgetimeframe"); +if ($iTimeframe <= 0) { + $iTimeframe = 30; +} + +if ($perm->have_perm_area_action("recipients", "recipients_delete")) +{ + $oLink = new cHTMLLink; + $oLink->setLink('javascript:showPurgeMsg("'.i18n('Purge recipients').'", "'.sprintf(i18n("Do you really want to remove recipients, that have not been confirmed since %s days and over?"), '"+purgetimeframe+"').'")'); + + $oLink->setContent(''.i18n("Purge recipients").''); + + $sContent .= $oLink->render(); +} +$sContent .= '
    '."\n"; +$oTpl->set('s', 'VALUE_PURGETIMEFRAME', $iTimeframe); + +// To template +$sLink = "actionrec"; +$oListActionsRow = new cFoldingRow("f0d7bf80-e73e-11d9-8cd6-0800200c9a66", i18n("Actions"), $sLink); +$oListActionsRow->setContentData($sContent); +$oTpl->set('s', 'ACTIONLINKREC', $sLink); + +###################################### +# 3.2 Recipients: Settings folding row +###################################### +$oTxtTimeframe = new cHTMLTextbox("txtPurgeTimeframe", $iTimeframe, 5); +$oBtnSave = new cHTMLButton("submit", i18n("Save")); + +$sContent = '
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= '
    '. i18n("Purge timeframe").':'.$oTxtTimeframe->render().' '.i18n("days").'
     '.$oBtnSave->render().'
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= '
    '."\n"; + +// To template +$sLink = "settingsrec"; +$oSettingsRow = new cFoldingRow("5ddbe820-e6f1-11d9-8cd6-0800200c9a69",i18n("Settings"), $sLink); +$oSettingsRow->setContentData($sContent); +$oTpl->set('s', 'SETTINGSLINKREC', $sLink); + +###################################### +# 3.3 Recipients: List options folding row +###################################### +$iItemsPerPage = (int)$oUser->getProperty("itemsperpage", "recipients"); +if ($iItemsPerPage == 0) { + $iItemsPerPage = 25; // All can't be saved +} + +$oSelItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelItemsPerPage->setDefault($iItemsPerPage); + +$oSelSortBy = new cHTMLSelectElement("sortby"); +foreach ($aFields as $sKey => $aData) +{ + if (strpos($aData["type"], "sort") !== false) { + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSortBy->addOptionElement($aData["field"], $oOption); + } +} +$oSelSortBy->setDefault("name"); + +$oSelSortOrder = new cHTMLSelectElement("sortorder"); +$oSelSortOrder->autoFill(array("ASC" => i18n("Ascending"), "DESC" => i18n("Descending"))); +$oSelSortOrder->setDefault("ASC"); + +$oSelRestrictGroup = new cHTMLSelectElement("restrictgroup"); +$oOption = new cHTMLOptionElement(i18n("-- All groups --"), "--all--"); +$oSelRestrictGroup->addOptionElement("all", $oOption); + +// Fetch recipient groups +$oRGroups = new RecipientGroupCollection; +$oRGroups->setWhere("idclient", $client); +$oRGroups->setWhere("idlang", $lang); +$oRGroups->setOrder("defaultgroup DESC, groupname ASC"); +$oRGroups->query(); + +$i = 1; +while ($oRGroup = $oRGroups->next()) +{ + if ($oRGroup->get("defaultgroup") == 1) { + $sGroupname = $oRGroup->get("groupname") . "*"; + } else { + $sGroupname = $oRGroup->get("groupname"); + } + $oOption = new cHTMLOptionElement($sGroupname, $oRGroup->get("idnewsgroup")); + $oSelRestrictGroup->addOptionElement($i, $oOption); + $i++; +} + +$oSelRestrictGroup->setDefault("--all--"); + +$oTxtFilter = new cHTMLTextbox("filter", "", 16); + +$oSelSearchIn = new cHTMLSelectElement("searchin"); +$oOption = new cHTMLOptionElement(i18n("-- All fields --"), "--all--"); +$oSelSearchIn->addOptionElement("all", $oOption); + +foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "search") !== false) { + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSearchIn->addOptionElement($aData["field"], $oOption); + } +} +$oSelSearchIn->setDefault("--all--"); + +$oBtnApply = new cHTMLButton("submit", i18n("Apply")); + +$sContent = '
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= '
    '. i18n("Items / page").''.$oSelItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelSortBy->render().'
    '. i18n("Sort order").''.$oSelSortOrder->render().'
    '. i18n("Show group").''.$oSelRestrictGroup->render().'
    '. i18n("Search for").''.$oTxtFilter->render().'
    '. i18n("Search in").''.$oSelSearchIn->render().'
     '.$oBtnApply->render().'
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= '
    '."\n"; + +// To template +$sLink = "listoptionsrec"; +$oListOptionsRow = new cFoldingRow("5ddbe820-e6f1-11d9-8cd6-0800200c9a66",i18n("List options"), $sLink); +$oListOptionsRow->setContentData($sContent); +$oTpl->set('s', 'LISTOPTIONLINKREC', $sLink); + +###################################### +# 3.4 Recipients: Paging +###################################### +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("elemperpage", $iItemsPerPage); +$oPagerLink->setCustom("filter", ""); +$oPagerLink->setCustom("restrictgroup", "--all--"); +$oPagerLink->setCustom("sortby", "name"); +$oPagerLink->setCustom("sortorder", "ASC"); +$oPagerLink->setCustom("searchin", "--all--"); +$oPagerLink->setCustom("frame", "2"); +$oPagerLink->setCustom("area", "recipients"); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +// To template +$sLink = "pagingrec"; +$oTpl->set('s', 'PAGINGLINKREC', $sLink); +//$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e304", $iItemCount, $iItemsPerPage, 1, $oPagerLink, "page", $sLink); +$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e304", 0, 1, 1, $oPagerLink, 'page', $sLink); + +###################################### +# Recipients: Container +###################################### +$sContainerId = 'cont_recipients'; +$sContainer = '
    '; +$sContainer .= ''; +if ($perm->have_perm_area_action('recipients', "recipients_delete") || $perm->have_perm_area_action("recipients", "recipients_create")) { + $sContainer .= $oListActionsRow->render(); +} +$sContainer .= $oSettingsRow->render(); +$sContainer .= $oListOptionsRow->render(); +$sContainer .= $oPagerRow->render(); +$sContainer .= '
    '; +$sContainer .= '
    '; +$oTpl->set('s', 'CRECIPIENTS', $sContainer); +$oTpl->set('s', 'ID_CRECIPIENTS', $sContainerId); + +###################################### +# 4 Recipient groups +###################################### +// See comment at 2. Job dispatch +$aFields = array(); +$aFields["name"] = array("field" => "groupname", "caption" => i18n("Name"), "type" => "base,sort,search"); + +###################################### +# 4.1 Recipient groups: Actions +###################################### +$sContent = '
    '."\n"; + +// Create a link to add a group +if ($perm->have_perm_area_action("recipientgroups", "recipientgroup_create")) +{ + $oLnk = new cHTMLLink; + $oLnk->setMultiLink("recipientgroups","","recipientgroups","recipientgroup_create"); + $oLnk->setContent(''.i18n("Create group").''); + $sContent .= $oLnk->render().'
    '."\n"; +} + +$sContent .= '
    '."\n"; + +$sLink = "actiongroup"; +$oListActionsRow = new cFoldingRow("f0d7bf80-e73e-11d9-8cd6-0800200c9a67",i18n("Actions"), $sLink); +$oListActionsRow->setContentData($sContent); +$oTpl->set('s', 'ACTIONLINKGROUP', $sLink); + +###################################### +# 4.2 Recipient groups: List Options +###################################### +$iItemsPerPage = (int)$oUser->getProperty("itemsperpage", "recipientgroups"); +if ($iItemsPerPage == 0) { + $iItemsPerPage = 25; // All can't be saved +} + +$oSelItemsPerPage = new cHTMLSelectElement("elemperpage"); +$oSelItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); +$oSelItemsPerPage->setDefault($iItemsPerPage); + +$oSelSortBy = new cHTMLSelectElement("sortby"); +foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "sort") !== false) { + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSortBy->addOptionElement($aData["field"], $oOption); + } +} +$oSelSortBy->setDefault("name"); + +$oSelSortOrder = new cHTMLSelectElement("sortorder"); +$oSelSortOrder->autoFill(array("ASC" => i18n("Ascending"), "DESC" => i18n("Descending"))); +$oSelSortOrder->setDefault("ASC"); + +$oTxtFilter = new cHTMLTextbox("filter", "", 16); + +$oSelSearchIn = new cHTMLSelectElement("searchin"); +$oOption = new cHTMLOptionElement(i18n("-- All fields --"), "--all--"); +$oSelSearchIn->addOptionElement("all", $oOption); + +foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "search") !== false) { + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSearchIn->addOptionElement($aData["field"], $oOption); + } +} +$oSelSearchIn->setDefault("--all--"); + +$oBtnApply = new cHTMLButton("submit", i18n("Apply")); + +$sContent = '
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= ' '."\n"; +$sContent .= '
    '. i18n("Items / page").''.$oSelItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelSortBy->render().'
    '. i18n("Sort order").''.$oSelSortOrder->render().'
    '. i18n("Search for").''.$oTxtFilter->render().'
    '. i18n("Search in").''.$oSelSearchIn->render().'
     '.$oBtnApply->render().'
    '."\n"; +$sContent .= '
    '."\n"; +$sContent .= '
    '."\n"; + +// To template +$sLink = "listoptionsgroup"; +$oListOptionsRow = new cFoldingRow("79efc1fc-111d-11dc-8314-0800200c9a66",i18n("List options"), $sLink); +$oListOptionsRow->setContentData($sContent); +$oTpl->set('s', 'LISTOPTIONLINKGROUP', $sLink); + +###################################### +# 4.3 Recipient groups: Paging +###################################### +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("elemperpage", $iItemsPerPage); +$oPagerLink->setCustom("filter", ""); +$oPagerLink->setCustom("sortby", "name"); +$oPagerLink->setCustom("sortorder", "ASC"); +$oPagerLink->setCustom("searchin", "--all--"); +$oPagerLink->setCustom("frame", "2"); +$oPagerLink->setCustom("area", "recipientgroups"); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); + +// To template +$sLink = "paginggroup"; +$oTpl->set('s', 'PAGINGLINKGROUP', $sLink); +//$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e305", $iItemCount, $iItemsPerPage, 1, $oPagerLink, "page", $sLink); +$oPagerRow = new cObjectPager("0ed6d632-6adf-4f09-a0c6-1e38ab60e305", 0, 1, 1, $oPagerLink, 'page', $sLink); + +###################################### +# Recipient Groups: Container +###################################### +$sContainerId = 'cont_recipientgroup'; +$sContainer = '
    '; +$sContainer .= ''; +if ($perm->have_perm_area_action("recipientgroups", "recipientgroup_create")) { + $sContainer .= $oListActionsRow->render(); +} +$sContainer .= $oListOptionsRow->render(); +$sContainer .= $oPagerRow->render(); +$sContainer .= '
    '; +$sContainer .= '
    '; +$oTpl->set('s', 'CRECIPIENTGROUP', $sContainer); +$oTpl->set('s', 'ID_CRECIPIENTGROUP', $sContainerId); + +$oTpl->set('s', 'SESSID', $sess->id); +$oTpl->generate($cfg['path']['templates'] . $cfg['templates']['newsletter_left_top']); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_menu.php b/conlite/plugins/newsletter/includes/include.newsletter_menu.php new file mode 100644 index 0000000..fb03ebf --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_menu.php @@ -0,0 +1,380 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.newsletter_menu.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +################################## +# Initialization +################################## +$oPage = new cPage; +$oUser = new cApiUser($auth->auth["uid"]); +$oClientLang = new cApiClientLanguage(false, $client, $lang); + +// Get idCatArt to check, if we may send a test newsletter +$lIDCatArt = (int)$oClientLang->getProperty("newsletter", "idcatart"); + +// Specify fields for search, sort and validation. Design makes enhancements +// using plugins possible (currently not implemented). If you are changing things here, +// remember to update include.newsletter_left_top.php, also. +// field: Field name in the db +// caption: Shown field name (-> user) +// base: Elements from core code (other type may be: "plugin") +// sort: Element can be used to be sorted by +// search: Element can be used to search in +$aFields = array(); +$aFields["name"] = array("field" => "name", "caption" => i18n("Name"), "type" => "base,sort,search"); + +################################## +# Store settings/Get basic data +################################## +if (isset($_REQUEST['action_html']) && $_REQUEST['action_html'] == 'save_newsletter_properties' && $perm->have_perm_area_action($area, "news_html_settings")) { + // Storing settings + if (isset($_REQUEST["ckbHTMLNewsletter"])) { + $oClientLang->setProperty("newsletter", "html_newsletter", "true"); + } else { + $oClientLang->setProperty("newsletter", "html_newsletter", "false"); + } + $oClientLang->setProperty("newsletter", "html_template_idcat", (int)$_REQUEST["selHTMLTemplateCat"]); + $oClientLang->setProperty("newsletter", "html_newsletter_idcat", (int)$_REQUEST["selHTMLNewsletterCat"]); + $oUser->setProperty("newsletter", "test_idnewsgrp_lang" . $lang, (int)$_REQUEST["selTestDestination"]); +} else { + // No settings to be stored, get current settings (language sepcific, as lang is client specific, lang is sufficient) + $_REQUEST["selTestDestination"] = (int)$oUser->getProperty("newsletter", "test_idnewsgrp_lang" . $lang); +} +// Default value: Current user mail +$sSendTestTarget = $oUser->get("realname"). " (" . $oUser->get("email") . ")"; + +################################## +# Check external input +################################## +// Items per page (value stored per area in user property) +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST["elemperpage"]) || $_REQUEST["elemperpage"] < 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); +} +if (!is_numeric($_REQUEST["elemperpage"])) { + // This is the case, if the user property has never been set (first time user) + $_REQUEST["elemperpage"] = 25; +} +if ($_REQUEST["elemperpage"] > 0) { + // -- All -- will not be stored, as it may be impossible to change this back to something more useful + $oUser->setProperty("itemsperpage", $area, $_REQUEST["elemperpage"]); +} +$_REQUEST["page"] = (int)$_REQUEST["page"]; +if ($_REQUEST["page"] <= 0 || $_REQUEST["elemperpage"] == 0) { + $_REQUEST["page"] = 1; +} +// Sort order +if ($_REQUEST["sortorder"] != "DESC") { + $_REQUEST["sortorder"] = "ASC"; +} + +// Check sort by and search in criteria +$bSortByFound = false; +$bSearchInFound = false; +foreach ($aFields as $sKey => $aData) +{ + if ($aData["field"] == $_REQUEST["sortby"] && strpos($aData["type"], "sort") !== false) { + $bSortByFound = true; + } + if ($aData["field"] == $_REQUEST["searchin"] && strpos($aData["type"], "search") !== false) { + $bSearchInFound = true; + } +} + +if (!$bSortByFound) { + $_REQUEST["sortby"] = "name"; // Default sort by field, possible values see above +} +if (!$bSearchInFound) { + $_REQUEST["searchin"] = "--all--"; +} + +// Free memory +unset ($oClientLang); +unset ($oUser); + +################################## +# Get data +################################## +$oNewsletters = new NewsletterCollection; +$oNewsletters->setWhere("idclient", $client); +$oNewsletters->setWhere("idlang", $lang); + +if ($_REQUEST["filter"] != "") +{ + if ($_REQUEST["searchin"] == "--all--" || $_REQUEST["searchin"] == "") + { + foreach ($aFields as $sKey => $aData) + { + if (strpos($aData["type"], "search") !== false) { + $oNewsletters->setWhereGroup("filter", $aData["field"], $_REQUEST["filter"], "LIKE"); + } + } + $oNewsletters->setInnerGroupCondition("filter", "OR"); + } else { + $oNewsletters->setWhere($_REQUEST["searchin"], $_REQUEST["filter"], "LIKE"); + } +} + +if ($_REQUEST["elemperpage"] > 0) +{ + // Getting item count without limit (for page function) - better idea anyone (performance)? + $oNewsletters->query(); + $iItemCount = $oNewsletters->count(); + + if ($_REQUEST["elemperpage"]*($_REQUEST["page"]) >= $iItemCount+$_REQUEST["elemperpage"] && $_REQUEST["page"] != 1) { + $_REQUEST["page"]--; + } + + $oNewsletters->setLimit($_REQUEST["elemperpage"] * ($_REQUEST["page"] - 1), $_REQUEST["elemperpage"]); +} else { + $iItemCount = 0; +} + +$oNewsletters->setOrder("welcome DESC, " . $_REQUEST["sortby"] . " " . $_REQUEST["sortorder"]); +$oNewsletters->query(); + +// Output data +$oMenu = new UI_Menu; +$iMenu = 0; + +// Store messages for repeated use (speeds performance, as i18n translation is only needed once) +$aMsg = array(); +$aMsg["DelTitle"] = i18n("Delete newsletter"); +$aMsg["DelDescr"] = i18n("Do you really want to delete the following newsletter:
    "); + +$aMsg["SendTestTitle"] = i18n("Send test newsletter"); +$aMsg["SendTestTitleOff"] = i18n("Send test newsletter (disabled, check newsletter sender e-mail address and handler article selection)"); +$aMsg["AddJobTitle"] = i18n("Add newsletter dispatch job"); +$aMsg["AddJobTitleOff"] = i18n("Add newsletter dispatch job (disabled, check newsletter sender e-mail address and handler article selection)"); +$aMsg["CopyTitle"] = i18n("Duplicate newsletter"); + +while ($oNewsletter = $oNewsletters->next()) +{ + $idnewsletter = $oNewsletter->get("idnews"); + $iMenu++; + + $sName = $oNewsletter->get("name"); + if ($oNewsletter->get("welcome")) { + $sName = $sName . "*"; + } + + // Create the link to show/edit the newsletter + $oLnk = new cHTMLLink; + $oLnk->setMultiLink($area, "", $area, ""); + $oLnk->setCustom("idnewsletter", $idnewsletter); + + $oMenu->setTitle($iMenu, $sName); + $oMenu->setLink($iMenu, $oLnk); + + if ($perm->have_perm_area_action($area, "news_add_job") || + $perm->have_perm_area_action($area, "news_create") || + $perm->have_perm_area_action($area, "news_save")) + { + // Rights: If you are able to add a job, you should be able to test it + // If you are able to add or change a newsletter, you should be able to test it + // Usability: If no e-mail has been specified, you can't send a test newsletter + if (isValidMail($oNewsletter->get("newsfrom")) && $lIDCatArt > 0) { + $sLnkSendTest = ''.$aMsg['; + } else { + $sLnkSendTest = ''.$aMsg['; + } + $oMenu->setActions($iMenu, 'test', $sLnkSendTest); + } + + if ($perm->have_perm_area_action($area, "news_add_job")) + { + if (isValidMail($oNewsletter->get("newsfrom")) && $lIDCatArt > 0) + { + $oLnkAddJob = new Link; + $oLnkAddJob->setMultiLink("news","","news","news_add_job"); + $oLnkAddJob->setCustom("idnewsletter", $idnewsletter); + $oLnkAddJob->setAlt($aMsg["AddJobTitle"]); + $oLnkAddJob->setContent(''.$aMsg['); + + $sLnkAddJob = $oLnkAddJob->render(); + } else { + $sLnkAddJob = ''.$aMsg['; + } + + $oMenu->setActions($iMenu, 'dispatch', $sLnkAddJob); + } + + if ($perm->have_perm_area_action($area, "news_create")) + { + $oLnkCopy = new Link; + $oLnkCopy->setMultiLink("news", "", "news", "news_duplicate"); + $oLnkCopy->setCustom("idnewsletter", $idnewsletter); + $oLnkCopy->setAlt($aMsg["CopyTitle"]); + $oLnkCopy->setContent(''.$aMsg['); + + $oMenu->setActions($iMenu, 'copy', $oLnkCopy->render()); + } + + if ($perm->have_perm_area_action($area, "news_delete")) + { + $sDelete = ''.$aMsg['; + $oMenu->setActions($iMenu, 'delete', $sDelete); + } +} + +// Check destination for sending test newsletter +if ($_REQUEST["selTestDestination"] > 0 && $perm->have_perm_area_action($area, "news_send_test")) +{ + $oRcpGroups = new RecipientGroupCollection; + $oRcpGroups->setWhere("idclient", $client); + $oRcpGroups->setWhere("idlang", $lang); + $oRcpGroups->setWhere($oRcpGroups->primaryKey, $_REQUEST["selTestDestination"]); + $oRcpGroups->query(); + + if ($oRcpGroup = $oRcpGroups->next()) { + $sSendTestTarget = sprintf(i18n("Recipient group: %s"), $oRcpGroup->get("groupname")); + } + unset ($oRcpGroups); +} + +$aMsg["SendTestDescr"] = sprintf(i18n("Do you really want to send the newsletter to:
    %s"), $sSendTestTarget); + +$sExecScript = ' + '; + +$oPage->setMargin(0); + +// Messagebox JS has to be included before ExecScript! +$oPage->addScript('messagebox', ''); +$oPage->addScript('exec', $sExecScript); +$oPage->addScript('parameterCollector.js', ''); + +// Generate current content for Object Pager +$sPagerId = "0ed6d632-6adf-4f09-a0c6-1e38ab60e302"; +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("elemperpage", $_REQUEST["elemperpage"]); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("searchin", $_REQUEST["searchin"]); +$oPagerLink->setCustom("restrictgroup", $_REQUEST["restrictgroup"]); +$oPagerLink->setCustom("frame", 2); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); +// Note, that after the "page" parameter no "pagerlink" parameter is specified - +// it is not used, as the JS below only uses the INNER html and the "pagerlink" parameter is +// set by ...left_top.html for the foldingrow itself +$oPager = new cObjectPager($sPagerId, $iItemCount, $_REQUEST["elemperpage"], $_REQUEST["page"], $oPagerLink, "page"); + +// Add slashes, to insert in javascript +$sPagerContent = $oPager->render(1); +$sPagerContent = str_replace('\\', '\\\\', $sPagerContent); +$sPagerContent = str_replace('\'', '\\\'', $sPagerContent); + +// Send new object pager to left_top +$oPage->addScript('setpager', ''); + +$sRefreshPager = ' + '; + +$oPage->addScript('refreshpager', $sRefreshPager); + +$oPage->setContent($oMenu->render(false)); +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.newsletter_subnav.php b/conlite/plugins/newsletter/includes/include.newsletter_subnav.php new file mode 100644 index 0000000..f1272fa --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.newsletter_subnav.php @@ -0,0 +1,65 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.newsletter_subnav.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if (isset($_GET['idnewsletter'])) +{ + # Set template data + $sCaption = i18n("Edit"); + + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$sCaption.''); + $tpl->next(); + + # Set template data + $sCaption = i18n("Edit Message"); + + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$sCaption.''); + $tpl->next(); + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.recipients.group.subnav.php b/conlite/plugins/newsletter/includes/include.recipients.group.subnav.php new file mode 100644 index 0000000..3f93149 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.recipients.group.subnav.php @@ -0,0 +1,74 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.recipients.group.subnav.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +if (isset($_GET['idrecipientgroup']) && (int)$_GET['idrecipientgroup'] > 0) +{ + $caption = i18n("Overview"); + $tmp_area = "foo2"; + + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + + if (is_array($cfg['plugins']['recipientslogic'])) { + foreach ($cfg['plugins']['recipientslogic'] as $plugin) { + cInclude("plugins", "recipientslogic/$plugin/".$plugin.".php"); + + $className = "recipientslogic_".$plugin; + $class = new $className; + + $caption = $class->getFriendlyName(); + $tmp_area = "foo2"; + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + $tpl->next(); + } + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + + # Generate the third navigation layer + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); +} else { + include ($cfg["path"]["contenido"].$cfg["path"]["templates"] . $cfg["templates"]["right_top_blank"]); +} + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.recipients.group_edit.php b/conlite/plugins/newsletter/includes/include.recipients.group_edit.php new file mode 100644 index 0000000..da4989a --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.recipients.group_edit.php @@ -0,0 +1,586 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2004-08-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.recipients.group_edit.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +// Initialization +$oPage = new cPage; +$oRGroups = new RecipientGroupCollection; +$oRGroupMembers = new RecipientGroupMemberCollection; +$oRGroup = new RecipientGroup; + +$aFields = array(); +$aFields["name"] = array("field" => "name", "caption" => i18n("Name"), "type" => "base,sort,search"); +$aFields["email"] = array("field" => "email", "caption" => i18n("E-Mail"), "type" => "base,sort,search"); +$aFields["confirmed"] = array("field" => "confirmed", "caption" => i18n("Confirmed"), "type" => "base"); +$aFields["deactivated"] = array("field" => "deactivated", "caption" => i18n("Deactivated"), "type" => "base"); + +if ($action == "recipientgroup_create" && $perm->have_perm_area_action($area, $action)) +{ + $oRGroup = $oRGroups->create(" ".i18n("-- new group --")); + $_REQUEST["idrecipientgroup"] = $oRGroup->get("idnewsgroup"); + $oPage->setReload(); + $sRefreshLeftTopScript = ''; + $oPage->addScript('refreshlefttop', $sRefreshLeftTopScript); +} elseif ($action == "recipientgroup_delete" && $perm->have_perm_area_action($area, $action)) { + $oRGroups->delete($_REQUEST["idrecipientgroup"]); + $sRefreshLeftTopScript = ''; + $oPage->addScript('refreshlefttop', $sRefreshLeftTopScript); + + $_REQUEST["idrecipientgroup"] = 0; + $oRGroup = new RecipientGroup; + $oPage->setReload(); +} else { + $oRGroup->loadByPrimaryKey($_REQUEST["idrecipientgroup"]); +} + +if ($oRGroup->virgin == false && $oRGroup->get("idclient") == $client && $oRGroup->get("idlang") == $lang) +{ + if ($action == "recipientgroup_save_group" && $perm->have_perm_area_action($area, $action)) + { + // Saving changes + $aMessages = array(); + $bReload = false; + + $sGroupName = stripslashes($_REQUEST["groupname"]); + if ($oRGroup->get("groupname") != $sGroupName) + { + $oRGroups->resetQuery(); + $oRGroups->setWhere("groupname", $sGroupName); + $oRGroups->setWhere("idclient", $client); + $oRGroups->setWhere("idlang", $lang); + $oRGroups->setWhere($oRGroup->primaryKey, $oRGroup->get($oRGroup->primaryKey), "!="); + $oRGroups->query(); + + if ($oRGroups->next()) { + $aMessages[] = i18n("Could not set new group name: Group already exists"); + } else { + $bReload = true; + + $oRGroup->set("groupname", $sGroupName); + } + } + + if (count($_REQUEST["adduser"]) > 0) + { + foreach ($_REQUEST["adduser"] as $iRcpID) + { + if (is_numeric($iRcpID)) { + $oRGroupMembers->create($_REQUEST["idrecipientgroup"], $iRcpID); + } + } + } + + if ($oRGroup->get("defaultgroup") != (int)$_REQUEST["defaultgroup"]) + { + $bReload = true; + $oRGroup->set("defaultgroup", $_REQUEST["defaultgroup"]); + } + + $oRGroup->store(); + + if ($bReload) { + $oPage->setReload(); + } + + // Removing users from group (if specified) + //print_r ($_REQUEST["deluser"]); + if ($perm->have_perm_area_action($area, "recipientgroup_recipient_delete") && is_array($_REQUEST["deluser"])) + { + foreach ($_REQUEST["deluser"] as $iRcpID) + { + if (is_numeric($iRcpID)) { + echo "yo: " . $iRcpID; + $oRGroupMembers->remove($_REQUEST["idrecipientgroup"], $iRcpID); + } + } + } + + $sRefreshLeftTopScript = ''; + $oPage->addScript('refreshlefttop', $sRefreshLeftTopScript); + } + + if (count($aMessages) > 0) { + $sNotis = $notification->returnNotification("warning", implode("
    ", $aMessages)) . "
    "; + } + + // Set default values + $oUser = new cApiUser($auth->auth["uid"]); + if (!isset($_REQUEST["member_elemperpage"]) || !is_numeric($_REQUEST["member_elemperpage"]) || $_REQUEST["member_elemperpage"] < 0) { + $_REQUEST["member_elemperpage"] = $oUser->getProperty("itemsperpage", $area."_edit_member"); + } + if (!is_numeric($_REQUEST["member_elemperpage"])) { + $_REQUEST["member_elemperpage"] = 25; + } + if ($_REQUEST["member_elemperpage"] > 0) { + // -- All -- will not be stored, as it may be impossible to change this back to something more useful + $oUser->setProperty("itemsperpage", $area."_edit_member", $_REQUEST["member_elemperpage"]); + } + + if (!isset($_REQUEST["outsider_elemperpage"]) || !is_numeric($_REQUEST["outsider_elemperpage"]) || $_REQUEST["outsider_elemperpage"] < 0) { + $_REQUEST["outsider_elemperpage"] = $oUser->getProperty("itemsperpage", $area."_edit_outsider"); + } + if (!is_numeric($_REQUEST["outsider_elemperpage"])) { + $_REQUEST["outsider_elemperpage"] = 25; + } + if ($_REQUEST["outsider_elemperpage"] > 0) { + // -- All -- will not be stored, as it may be impossible to change this back to something more useful + $oUser->setProperty("itemsperpage", $area."_edit_outsider", $_REQUEST["outsider_elemperpage"]); + } + unset ($oUser); + + if (!isset($_REQUEST["member_page"]) || !is_numeric($_REQUEST["member_page"]) || $_REQUEST["member_page"] <= 0 || $_REQUEST["member_elemperpage"] == 0) { + $_REQUEST["member_page"] = 1; + } + if ($_REQUEST["member_sortorder"] != "DESC") { + $_REQUEST["member_sortorder"] = "ASC"; + } + if (!isset($_REQUEST["outsider_page"]) || !is_numeric($_REQUEST["outsider_page"]) || $_REQUEST["outsider_page"] <= 0 || $_REQUEST["outsider_elemperpage"] == 0) { + $_REQUEST["outsider_page"] = 1; + } + if ($_REQUEST["outsider_sortorder"] != "DESC") { + $_REQUEST["outsider_sortorder"] = "ASC"; + } + + // Output form + $oForm = new UI_Table_Form("properties", "main.php?1", "get"); // Use "get" for folding rows... + $oForm->setVar("frame", $frame); + $oForm->setVar("area", $area); + $oForm->setVar("action", "recipientgroup_save_group"); + $oForm->setVar("idrecipientgroup", $_REQUEST["idrecipientgroup"]); + $oForm->setSubmitJS("append_registered_parameters(this);"); + + $oForm->addHeader(i18n("Edit group")); + + $oTxtGroupName = new cHTMLTextbox("groupname", $oRGroup->get("groupname"),40); + $oForm->add(i18n("Group name"), $oTxtGroupName->render()); + + $oCkbDefault = new cHTMLCheckbox("defaultgroup", "1"); + $oCkbDefault->setChecked($oRGroup->get("defaultgroup")); + $oForm->add(i18n("Default group"), $oCkbDefault->toHTML(false)); + + // Member list options folding row + $oMemberListOptionRow = new cFoldingRow("a91f5540-52db-11db-b0de-0800200c9a66",i18n("Member list options")); + + $oSelItemsPerPage = new cHTMLSelectElement("member_elemperpage"); + $oSelItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); + $oSelItemsPerPage->setDefault($_REQUEST["member_elemperpage"]); + + $oSelSortBy = new cHTMLSelectElement("member_sortby"); + foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "sort") !== false) { + if ($_REQUEST["member_sortby"] == "") { + $_REQUEST["member_sortby"] = $aData["field"]; + } + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSortBy->addOptionElement($aData["field"], $oOption); + } + } + $oSelSortBy->setDefault($_REQUEST["member_sortby"]); + + $oSelSortOrder = new cHTMLSelectElement("member_sortorder"); + $oSelSortOrder->autoFill(array("ASC" => i18n("Ascending"), "DESC" => i18n("Descending"))); + $oSelSortOrder->setDefault($_REQUEST["member_sortorder"]); + + $oTxtFilter = new cHTMLTextbox("member_filter", $_REQUEST["member_filter"], 16); + + $oSelSearchIn = new cHTMLSelectElement("member_searchin"); + $oOption = new cHTMLOptionElement(i18n("-- All fields --"), "--all--"); + $oSelSearchIn->addOptionElement("all", $oOption); + + foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "search") !== false) { + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSearchIn->addOptionElement($aData["field"], $oOption); + } + } + $oSelSearchIn->setDefault($_REQUEST["member_searchin"]); + + $oSubmit = new cHTMLButton("submit", i18n("Apply")); + + $sContent = '
    '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= '
    '. i18n("Items / page").''.$oSelItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelSortBy->render().'
    '. i18n("Sort order").''.$oSelSortOrder->render().'
    '. i18n("Search for").''.$oTxtFilter->render().'
    '. i18n("Search in").''.$oSelSearchIn->render().'
     '.$oSubmit->render().'
    '.chr(10); + $sContent .= '
    '.chr(10); + $oMemberListOptionRow->setContentData($sContent); + + // Members + $oAddedRecipientList = new UI_List; + $oAddedRecipientList->setWidth("100%"); + $oAddedRecipientList->setBorder(1); + + $oAddedRecipientList->setCell(0, 1, "".i18n("Name").""); + $oImgDel = new cHTMLImage("images/but_invert_selection.gif"); + $sLnkDelIcon = ''.$oImgDel->render().''; + $oAddedRecipientList->setCell(0, 2, $sLnkDelIcon); + $oAddedRecipientList->setCellAlignment(0, 2, "right"); + + $oInsiders = new RecipientCollection; + + $oInsiders->link("RecipientGroupMemberCollection"); + $oInsiders->setWhere("recipientcollection.idclient", $client); + $oInsiders->setWhere("recipientcollection.idlang", $lang); + $oInsiders->setWhere("RecipientGroupMemberCollection.idnewsgroup", $_REQUEST["idrecipientgroup"]); + + // Get insiders for outsiders list (*sigh!*) + // TODO: Ask user to have at least mySQL 4.1... + $oInsiders->query(); + + $aInsiders = array(); + if ($oInsiders->count() > 0) + { + while ($oInsider = $oInsiders->next()) + { + $aInsiders[] = $oInsider->get($oInsider->primaryKey); + } + } + + // Filter + if ($_REQUEST["member_filter"] != "") { + if ($_REQUEST["member_searchin"] == "--all--" || $_REQUEST["member_searchin"] == "") { + foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "search") !== false) { + $oInsiders->setWhereGroup("filter", "recipientcollection.".$aData["field"], $_REQUEST["member_filter"], "LIKE"); + } + } + $oInsiders->setInnerGroupCondition("filter", "OR"); + } else { + $oInsiders->setWhere("recipientcollection.".$_REQUEST["member_searchin"], $_REQUEST["member_filter"], "LIKE"); + } + } + + // If elemperpage is something else than "all", get item count based on filters + if ($_REQUEST["member_elemperpage"] > 0) { + $oInsiders->query(); + $iMembers = $oInsiders->count(); // Getting item count without limit (for page function) - better idea anybody (performance)? + + $oInsiders->setLimit($_REQUEST["member_elemperpage"] * ($_REQUEST["member_page"] - 1), $_REQUEST["member_elemperpage"]); + } else { + $iMembers = 0; + } + + // Get data + $sSortSQL = "recipientcollection.".$_REQUEST["member_sortby"]." ".$_REQUEST["member_sortorder"]; + if ($_REQUEST["member_sortby"] == "name") + { + // Name field may be empty, add email as sort criteria + $sSortSQL .= ", email ".$_REQUEST["member_sortorder"]; + } + + $oInsiders->setOrder($sSortSQL); + $oInsiders->query(); + + $iItems = $oInsiders->count(); + if ($iItems == 0 && $_REQUEST["member_filter"] == "" && ($_REQUEST["member_elemperpage"] == 0 || $iMembers == 0)) { + $oAddedRecipientList->setCell(1, 1, i18n("No recipients are added to this group yet")); + $oAddedRecipientList->setCell(1, 2, ' '); + } else if ($iItems == 0) { + $oAddedRecipientList->setCell(1, 1, i18n("No recipients found")); + $oAddedRecipientList->setCell(1, 2, ' '); + } else { + while ($oRcp = $oInsiders->next()) + { + $iID = $oRcp->get("idnewsrcp"); + + $sName = $oRcp->get("name"); + $sEMail = $oRcp->get("email"); + if (empty($sName)) { + $sName = $sEMail; + } + $oAddedRecipientList->setCell($iID, 1, $sName." (".$sEMail.")"); + + if ($perm->have_perm_area_action($area, "recipientgroup_recipient_delete")) + { + $oCkbDel = new cHTMLCheckbox("deluser[]", $iID); + $oAddedRecipientList->setCell($iID, 2, $oCkbDel->toHTML(false)); + } else { + $oAddedRecipientList->setCell($iID, 2, " "); + } + $oAddedRecipientList->setCellAlignment($iID, 2, "right"); + } + } + + // Member list pager (-> below data, as iMembers is needed) + $oPagerLink = new cHTMLLink; + $oPagerLink->setLink("main.php"); + $oPagerLink->setCustom("member_elemperpage", $_REQUEST["member_elemperpage"]); + $oPagerLink->setCustom("member_filter", $_REQUEST["member_filter"]); + $oPagerLink->setCustom("member_sortby", $_REQUEST["member_sortby"]); + $oPagerLink->setCustom("member_sortorder", $_REQUEST["member_sortorder"]); + $oPagerLink->setCustom("member_searchin", $_REQUEST["member_searchin"]); + $oPagerLink->setCustom("outsider_elemperpage", $_REQUEST["outsider_elemperpage"]); + $oPagerLink->setCustom("outsider_filter", $_REQUEST["outsider_filter"]); + $oPagerLink->setCustom("outsider_sortby", $_REQUEST["outsider_sortby"]); + $oPagerLink->setCustom("outsider_sortorder", $_REQUEST["outsider_sortorder"]); + $oPagerLink->setCustom("outsider_searchin", $_REQUEST["outsider_searchin"]); + $oPagerLink->setCustom("idrecipientgroup", $_REQUEST["idrecipientgroup"]); + $oPagerLink->setCustom("frame", $frame); + $oPagerLink->setCustom("area", $area); + #$oPagerLink->enableAutomaticParameterAppend(); + $oPagerLink->setCustom("contenido", $sess->id); + + $oMemberPager = new cObjectPager("d82a3ff0-52d9-11db-b0de-0800200c9a66", $iMembers, $_REQUEST["member_elemperpage"], $_REQUEST["member_page"], $oPagerLink, "member_page"); + $oMemberPager->setCaption(i18n("Member navigation")); + + $oForm->add(i18n("Recipients in group"), ''. + $oMemberListOptionRow->render(). + $oMemberPager->render(). + '
    '.$oAddedRecipientList->render().'
    '); + unset ($oInsiders); + unset ($oMemberListOptionRow); + unset ($oMemberPager); + unset ($oAddedRecipientList); + + // Outsiders + // Outsider list options folding row + $oOutsiderListOptionRow = new cFoldingRow("ca633b00-52e9-11db-b0de-0800200c9a66",i18n("Outsider list options")); + + $oSelItemsPerPage = new cHTMLSelectElement("outsider_elemperpage"); + $oSelItemsPerPage->autoFill(array(0 => i18n("-- All --"), 25 => 25, 50 => 50, 75 => 75, 100 => 100)); + $oSelItemsPerPage->setDefault($_REQUEST["outsider_elemperpage"]); + + $oSelSortBy = new cHTMLSelectElement("outsider_sortby"); + foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "sort") !== false) { + if ($_REQUEST["outsider_sortby"] == "") { + $_REQUEST["outsider_sortby"] = $aData["field"]; + } + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSortBy->addOptionElement($aData["field"], $oOption); + } + } + $oSelSortBy->setDefault($_REQUEST["outsider_sortby"]); + + $oSelSortOrder = new cHTMLSelectElement("outsider_sortorder"); + $oSelSortOrder->autoFill(array("ASC" => i18n("Ascending"), "DESC" => i18n("Descending"))); + $oSelSortOrder->setDefault($_REQUEST["outsider_sortorder"]); + + $oTxtFilter = new cHTMLTextbox("outsider_filter", $_REQUEST["outsider_filter"], 16); + + $oSelSearchIn = new cHTMLSelectElement("outsider_searchin"); + $oOption = new cHTMLOptionElement(i18n("-- All fields --"), "--all--"); + $oSelSearchIn->addOptionElement("all", $oOption); + + foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "search") !== false) { + $oOption = new cHTMLOptionElement($aData["caption"], $aData["field"]); + $oSelSearchIn->addOptionElement($aData["field"], $oOption); + } + } + $oSelSearchIn->setDefault($_REQUEST["outsider_searchin"]); + + $oSubmit = new cHTMLButton("submit", i18n("Apply")); + + $sContent = '
    '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= ' '.chr(10); + $sContent .= '
    '. i18n("Items / page").''.$oSelItemsPerPage->render().'
    '. i18n("Sort by").''.$oSelSortBy->render().'
    '. i18n("Sort order").''.$oSelSortOrder->render().'
    '. i18n("Search for").''.$oTxtFilter->render().'
    '. i18n("Search in").''.$oSelSearchIn->render().'
     '.$oSubmit->render().'
    '.chr(10); + $sContent .= '
    '.chr(10); + $oOutsiderListOptionRow->setContentData($sContent); + + // TODO: Try to enhance genericdb to get this working with the usual objects... + $oOutsiders = new RecipientCollection; + + # This requires mySQL V4.1, at least... + # TODO: Add mySQL server version switch + #$sSQL = "idclient = '".$client."' AND idlang = '".$lang."' AND ". + # "idnewsrcp NOT IN (SELECT idnewsrcp FROM ".$cfg["tab"]["news_groupmembers"]." WHERE idnewsgroup = '".$_REQUEST["idrecipientgroup"]."')"; + + // TODO: This works with every mySQL version but may be problematic, if a group + // contains a lot of members (e.g. Oracle can't handle more than 1000 items in the brackets) + $sSQL = "idclient = '".$client."' AND idlang = '".$lang."' AND ". + "idnewsrcp NOT IN ('" . implode ("','", $aInsiders) . "')"; + + if ($_REQUEST["outsider_filter"] != "") { + $sSQLSearchIn = ""; + if ($_REQUEST["outsider_searchin"] == "--all--" || $_REQUEST["outsider_searchin"] == "") { + foreach ($aFields as $sKey => $aData) { + if (strpos($aData["type"], "search") !== false) { + if ($sSQLSearchIn !== "") { + $sSQLSearchIn .= " OR "; + } + $sSQLSearchIn .= $aData["field"] . " LIKE '%" . urlencode($_REQUEST["outsider_filter"]) . "%'"; + } + } + } else { + $sSQLSearchIn .= urlencode($_REQUEST["outsider_searchin"]) . " LIKE '%" . urlencode($_REQUEST["outsider_filter"]) . "%'"; + } + $sSQL .= " AND (" . $sSQLSearchIn . ")"; + } + + // If elemperpage is something else than "all", get item count based on filters + if ($_REQUEST["outsider_elemperpage"] > 0) { + $oOutsiders->flexSelect("", "", $sSQL, ""); + $iOutsiders = $oOutsiders->count(); // Getting item count without limit (for page function) - better idea anyone (performance)? + + $sSQLLimit = " LIMIT " . $_REQUEST["outsider_elemperpage"] * ($_REQUEST["outsider_page"] - 1) . ", " . $_REQUEST["outsider_elemperpage"]; + } else { + $iMembers = 0; + $sSQLLimit = ""; + } + + // Get data + $sSQLSort = " ORDER BY ".urlencode($_REQUEST["outsider_sortby"])." ".$_REQUEST["outsider_sortorder"]; + if ($_REQUEST["outsider_sortby"] == "name") + { + // Name field may be empty, add email as sort criteria + $sSQLSort .= ", email ".$_REQUEST["outsider_sortorder"]; + } + + $sSQL .= $sSQLSort . $sSQLLimit; + $oOutsiders->flexSelect("", "", $sSQL, ""); + + $aItems = array(); + while ($oRecipient = $oOutsiders->next()) + { + $sName = $oRecipient->get("name"); + $sEMail = $oRecipient->get("email"); + + if (empty($sName)) { + $sName = $sEMail; + } + $aItems[] = array($oRecipient->get("idnewsrcp"), $sName." (".$sEMail.")"); + } + + $oSelUser = new cHTMLSelectElement("adduser[]"); + $oSelUser->setSize(25); + $oSelUser->setStyle("width: 100%;"); + $oSelUser->setMultiSelect(); + $oSelUser->autoFill($aItems); + + // Outsider list pager (-> below data, as iOutsiders is needed) + $oPagerLink = new cHTMLLink; + $oPagerLink->setLink("main.php"); + $oPagerLink->setCustom("member_elemperpage", $_REQUEST["member_elemperpage"]); + $oPagerLink->setCustom("member_filter", $_REQUEST["member_filter"]); + $oPagerLink->setCustom("member_sortby", $_REQUEST["member_sortby"]); + $oPagerLink->setCustom("member_sortorder", $_REQUEST["member_sortorder"]); + $oPagerLink->setCustom("member_searchin", $_REQUEST["member_searchin"]); + $oPagerLink->setCustom("outsider_elemperpage", $_REQUEST["outsider_elemperpage"]); + $oPagerLink->setCustom("outsider_filter", $_REQUEST["outsider_filter"]); + $oPagerLink->setCustom("outsider_sortby", $_REQUEST["outsider_sortby"]); + $oPagerLink->setCustom("outsider_sortorder", $_REQUEST["outsider_sortorder"]); + $oPagerLink->setCustom("outsider_searchin", $_REQUEST["outsider_searchin"]); + $oPagerLink->setCustom("idrecipientgroup", $_REQUEST["idrecipientgroup"]); + $oPagerLink->setCustom("frame", $frame); + $oPagerLink->setCustom("area", $area); + #$oPagerLink->enableAutomaticParameterAppend(); + $oPagerLink->setCustom("contenido", $sess->id); + + $oOutsiderPager = new cObjectPager("4d3a7330-52eb-11db-b0de-0800200c9a66", $iOutsiders, $_REQUEST["outsider_elemperpage"], $_REQUEST["outsider_page"], $oPagerLink, "outsider_page"); + $oOutsiderPager->setCaption(i18n("Outsider navigation")); + + $oForm->add(i18n("Add recipients"), ''. + $oOutsiderListOptionRow->render(). + $oOutsiderPager->render(). + '
    '.$oSelUser->render().'
    '.i18n("Note: Hold <Ctrl> to
    select multiple items.").'
    '); + unset ($oOutsiders); + unset ($oOutsiderListOptionRow); + unset ($oOutsiderPager); + + $sDelMarkScript = ' '; + + $oPage->addScript('DelMarkScript', $sDelMarkScript); + $oPage->addScript('cfoldingrow.js', ''); + $oPage->addScript('parameterCollector.js', ''); + + $oPage->setContent($sNotis.$oForm->render(true)); +} else { + $oPage->setContent($sNotis.""); +} +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.recipients.group_menu.php b/conlite/plugins/newsletter/includes/include.recipients.group_menu.php new file mode 100644 index 0000000..142eb2a --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.recipients.group_menu.php @@ -0,0 +1,240 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.recipients.group_menu.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +################################## +# Initialization +################################## +$oPage = new cPage; +$oMenu = new UI_Menu; +$oUser = new cApiUser($auth->auth["uid"]); + +// Specify fields for search, sort and validation. Design makes enhancements +// using plugins possible (currently not implemented). If you are changing things here, +// remember to update include.newsletter_left_top.php, also. +// field: Field name in the db +// caption: Shown field name (-> user) +// base: Elements from core code (other type may be: "plugin") +// sort: Element can be used to be sorted by +// search: Element can be used to search in +$aFields = array(); +$aFields["name"] = array("field" => "groupname", "caption" => i18n("Name"), "type" => "base,sort,search"); + +################################## +# Check external input +################################## +// Items per page (value stored per area in user property) +if (!isset($_REQUEST["elemperpage"]) || !is_numeric($_REQUEST["elemperpage"]) || $_REQUEST["elemperpage"] < 0) { + $_REQUEST["elemperpage"] = $oUser->getProperty("itemsperpage", $area); +} +if (!is_numeric($_REQUEST["elemperpage"])) { + // This is the case, if the user property has never been set (first time user) + $_REQUEST["elemperpage"] = 25; +} +if ($_REQUEST["elemperpage"] > 0) { + // -- All -- will not be stored, as it may be impossible to change this back to something more useful + $oUser->setProperty("itemsperpage", $area, $_REQUEST["elemperpage"]); +} +$_REQUEST["page"] = (int)$_REQUEST["page"]; +if ($_REQUEST["page"] <= 0 || $_REQUEST["elemperpage"] == 0) { + $_REQUEST["page"] = 1; +} +// Sort order +if ($_REQUEST["sortorder"] != "DESC") { + $_REQUEST["sortorder"] = "ASC"; +} + +// Don't need to check sort by and search in criteria - just set it +$_REQUEST["sortby"] = "groupname"; // Default sort by field, possible values see above +$_REQUEST["searchin"] = "--all--"; + +// Free memory +unset ($oUser); +unset ($oClient); + +################################## +# Get data +################################## +$oRcpGroups = new RecipientGroupCollection; +$oRcpGroups->setWhere("idclient", $client); +$oRcpGroups->setWhere("idlang", $lang); + +if ($_REQUEST["filter"] != "") +{ + if ($_REQUEST["searchin"] == "--all--" || $_REQUEST["searchin"] == "") + { + foreach ($aFields as $sKey => $aData) + { + if (strpos($aData["type"], "search") !== false) { + $oRcpGroups->setWhereGroup("filter", $aData["field"], $_REQUEST["filter"], "LIKE"); + } + } + $oRcpGroups->setInnerGroupCondition("filter", "OR"); + } else { + $oRcpGroups->setWhere($_REQUEST["searchin"], $_REQUEST["filter"], "LIKE"); + } +} + +if ($_REQUEST["elemperpage"] > 0) +{ + // Getting item count without limit (for page function) - better idea anyone (performance)? + $oRcpGroups->query(); + $iItemCount = $oRcpGroups->count(); + + if ($_REQUEST["elemperpage"]*($_REQUEST["page"]) >= $iItemCount+$_REQUEST["elemperpage"] && $_REQUEST["page"] != 1) { + $_REQUEST["page"]--; + } + + $oRcpGroups->setLimit($_REQUEST["elemperpage"] * ($_REQUEST["page"] - 1), $_REQUEST["elemperpage"]); +} else { + $iItemCount = 0; +} + +$oRcpGroups->setOrder("defaultgroup DESC, ".$_REQUEST["sortby"]." ".$_REQUEST["sortorder"]); +$oRcpGroups->query(); + +// Output data +$oMenu = new UI_Menu; +$iMenu = 0; + +// Store messages for repeated use (speeds performance, as i18n translation is only needed once) +$aMsg = array(); +$aMsg["DelTitle"] = i18n("Delete recipient group"); +$aMsg["DelDescr"] = i18n("Do you really want to delete the following newsletter recipient group:
    "); + +while ($oRcpGroup = $oRcpGroups->next()) +{ + $iMenu++; + $iIDGroup = $oRcpGroup->get("idnewsgroup"); + + $sName = $oRcpGroup->get("groupname"); + if ($oRcpGroup->get("defaultgroup")) { + $sName = $sName . "*"; + } + + // Create the link to show/edit the recipient group + $oLnk = new cHTMLLink; + $oLnk->setMultiLink("recipientgroups","","recipientgroups",""); + $oLnk->setCustom("idrecipientgroup", $iIDGroup); + + #$oMenu->setImage($iMenu, $cfg["path"]["images"] . "groups.gif"); + $oMenu->setTitle($iMenu, $sName); + $oMenu->setLink($iMenu, $oLnk); + + if ($perm->have_perm_area_action($area, recipientgroup_delete)) { + $oMenu->setActions($iMenu, 'delete', ''.$aMsg['); + } +} + +$sExecScript = ' + '; + +$oPage->setMargin(0); +$oPage->addScript('messagebox', ''); +$oPage->addScript('delete', $sExecScript); +//$oPage->addScript('cfoldingrow.js', ''); +$oPage->addScript('parameterCollector.js', ''); + +// Generate current content for Object Pager +$sPagerId = "0ed6d632-6adf-4f09-a0c6-1e38ab60e305"; +$oPagerLink = new cHTMLLink; +$oPagerLink->setLink("main.php"); +$oPagerLink->setTargetFrame('left_bottom'); +$oPagerLink->setCustom("elemperpage", $_REQUEST["elemperpage"]); +$oPagerLink->setCustom("filter", $_REQUEST["filter"]); +$oPagerLink->setCustom("sortby", $_REQUEST["sortby"]); +$oPagerLink->setCustom("sortorder", $_REQUEST["sortorder"]); +$oPagerLink->setCustom("searchin", $_REQUEST["searchin"]); +$oPagerLink->setCustom("frame", $frame); +$oPagerLink->setCustom("area", $area); +$oPagerLink->enableAutomaticParameterAppend(); +$oPagerLink->setCustom("contenido", $sess->id); +// Note, that after the "page" parameter no "pagerlink" parameter is specified - +// it is not used, as the JS below only uses the INNER html and the "pagerlink" parameter is +// set by ...left_top.html for the foldingrow itself +$oPager = new cObjectPager($sPagerId, $iItemCount, $_REQUEST["elemperpage"], $_REQUEST["page"], $oPagerLink, "page"); + +// Add slashes, to insert in javascript +$sPagerContent = $oPager->render(1); +$sPagerContent = str_replace('\\', '\\\\', $sPagerContent); +$sPagerContent = str_replace('\'', '\\\'', $sPagerContent); + +// Send new object pager to left_top +// Send new object pager to left_top +$oPage->addScript('setpager', ''); + +$sRefreshPager = ' + '; + +$oPage->addScript('refreshpager', $sRefreshPager); + +//$oPage->setContent(array('', '
    ', $oMenu->render(false))); +$oPage->setContent($oMenu->render(false)); +$oPage->render(); + +?> \ No newline at end of file diff --git a/conlite/plugins/newsletter/includes/include.recipients_edit.php b/conlite/plugins/newsletter/includes/include.recipients_edit.php new file mode 100644 index 0000000..865c6b4 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.recipients_edit.php @@ -0,0 +1,250 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.recipients_edit.php 306 2014-03-13 23:03:26Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oPage = new cPage; +$oRecipients = new RecipientCollection; + +if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $plugin) { + plugin_include("recipients", $plugin."/".$plugin.".php"); + } +} + +// Note, that the object name has to be $recipient for plugins +if ($action == "recipients_create" && $perm->have_perm_area_action($area, $action)) { + $recipient = $oRecipients->create("mail@domain.tld"," ".i18n("-- new recipient --")); + $oPage->setReload(); +} elseif ($action == "recipients_delete" && $perm->have_perm_area_action($area, $action)) { + $oRecipients->delete($idrecipient); + $recipient = new Recipient; + $oPage->setReload(); +} elseif ($action == "recipients_purge" && $perm->have_perm_area_action($area, "recipients_delete")) { + $oClient = new cApiClient($client); + $timeframe = $oClient->getProperty("newsletter", "purgetimeframe"); + if (!$timeframe) { + $timeframe = 30; + } + $purgedrecipients = $oRecipients->purge($timeframe); + /* backslashdollar: There is a problem translating \$ - it is either not recognized or translated correctly (using poEdit) */ + if ($purgedrecipients > 0) { + $sNotis = $notification->messageBox("info", sprintf(str_replace("backslashdollar", "\$", i18n("%1backslashdollard recipients, which hasn't been confirmed since more than %2backslashdollard days has been removed.")),$purgedrecipients,$timeframe),0); + } else { + $sNotis = $notification->messageBox("info", sprintf(str_replace("backslashdollar", "\$", i18n("There are no recipients, which hasn't been confirmed since more than %2backslashdollard days has been removed.")), 0, $timeframe),0); + } + + $recipient = new Recipient; + $oPage->setReload(); +} else { + $recipient = new Recipient($idrecipient); +} + +if ($recipient->virgin == false && $recipient->get("idclient") == $client && $recipient->get("idlang") == $lang) { + if ($action == "recipients_save" && $perm->have_perm_area_action($area, $action)) { + $oPage->setReload(); + $aMessages = array(); + + $name = stripslashes($name); + $email = stripslashes($email); + $confirmed = (int)$confirmed; + $deactivated = (int)$deactivated; + $newstype = (int)$newstype; + + $recipient->set("name", $name); + + if (!isValidMail($email)) + { + $aMessages[] = i18n("Please specify a valid e-mail address"); + } else { + $email = strtolower($email); // e-mail always in lower case + if ($recipient->get("email") != $email) { + $oRecipients->resetQuery(); + $oRecipients->setWhere("email", $email); + $oRecipients->setWhere("idclient", $client); + $oRecipients->setWhere("idlang", $lang); + $oRecipients->setWhere($recipient->primaryKey, $recipient->get($recipient->primaryKey), "!="); + $oRecipients->query(); + + if ($oRecipients->next()) { + $aMessages[] = i18n("Could not set new e-mail adress: Other recipient with same e-mail address already exists"); + } else { + $recipient->set("email", $email); + } + } + } + + if ($recipient->get("confirmed") != $confirmed && $confirmed) { + $recipient->set("confirmeddate", date("Y-m-d H:i:s"), false); + } elseif (!$confirmed) { + $recipient->set("confirmeddate", "0000-00-00 00:00:00", false); + } + $recipient->set("confirmed", $confirmed); + $recipient->set("deactivated", $deactivated); + $recipient->set("news_type", $newstype); + + // Check out if there are any plugins + if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $plugin) { + if (function_exists("recipients_".$plugin."_wantedVariables") && function_exists("recipients_".$plugin."_store")) { + $wantVariables = call_user_func("recipients_".$plugin."_wantedVariables"); + + if (is_array($wantVariables)) { + $varArray = array(); + + foreach ($wantVariables as $value) { + $varArray[$value] = stripslashes($GLOBALS[$value]); + } + } + $store = call_user_func("recipients_".$plugin."_store", $varArray); + } + } + } + + $recipient->store(); + + // Remove group associations + if (isset($_REQUEST["ckbRemove"])) { + $oGroupMembers = new RecipientGroupMemberCollection; + + foreach ($_REQUEST["ckbRemove"] as $iGroupMemberID) { + if (is_numeric($iGroupMemberID)) { + $oGroupMembers->delete($iGroupMemberID); + } + } + } + } + + if (count($aMessages) > 0) { + $sNotis = $notification->returnNotification("warning", implode("
    ", $aMessages)) . "
    "; + } + + $oForm = new UI_Table_Form("properties"); + $oForm->setVar("frame", $frame); + $oForm->setVar("area", $area); + $oForm->setVar("action", "recipients_save"); + $oForm->setVar("idrecipient", $recipient->get("idnewsrcp")); + + $oForm->addHeader(i18n("Edit recipient")); + + $oTxtName = new cHTMLTextbox("name", $recipient->get("name"), 40); + $oTxtEMail = new cHTMLTextbox("email", $recipient->get("email"), 40); + $oCkbConfirmed = new cHTMLCheckbox("confirmed", "1"); + $oCkbConfirmed->setChecked($recipient->get("confirmed")); + $oCkbDeactivated = new cHTMLCheckbox("deactivated", "1"); + $oCkbDeactivated->setChecked($recipient->get("deactivated")); + + $oSelNewsType = new cHTMLSelectElement("newstype"); + $oOption = new cHTMLOptionElement(i18n("Text only"), "0"); + $oSelNewsType->addOptionElement(0, $oOption); + $oOption = new cHTMLOptionElement(i18n("HTML and text"), "1"); + $oSelNewsType->addOptionElement(1, $oOption); + $oSelNewsType->setDefault($recipient->get("news_type")); + + $oForm->add(i18n("Name"), $oTxtName->render()); + $oForm->add(i18n("E-Mail"), $oTxtEMail->render()); + $oForm->add(i18n("Confirmed"), $oCkbConfirmed->toHTML(false) . " (" . $recipient->get("confirmeddate") . ")"); + $oForm->add(i18n("Deactivated"), $oCkbDeactivated->toHTML(false)); + $oForm->add(i18n("Message type"), $oSelNewsType->render()); + + $aPluginOrder = trim_array(explode(",",getSystemProperty("plugin", "recipients-pluginorder"))); + + // Check out if there are any plugins + if (is_array($aPluginOrder)) { + foreach ($aPluginOrder as $sPlugin) { + if (function_exists("recipients_".$sPlugin."_getTitle") && + function_exists("recipients_".$sPlugin."_display")) { + $aPluginTitle = call_user_func("recipients_".$sPlugin."_getTitle"); + $aPluginDisplay = call_user_func("recipients_".$sPlugin."_display", $recipient); + + if (is_array($aPluginTitle) && is_array($aPluginDisplay)) { + foreach ($aPluginTitle as $sKey => $sValue) { + $oForm->add($sValue, $aPluginDisplay[$sKey]); + } + } else { + if (is_array($aPluginTitle) || is_array($aPluginDisplay)) { + $oForm->add(i18n("WARNING"), sprintf(i18n("The plugin %s delivered an array for the displayed titles, but did not return an array for the contents."), $sPlugin)); + } else { + $oForm->add($aPluginTitle, $aPluginDisplay); + } + } + } + } + } + + $oGroupList = new UI_List; + $oGroupList->setWidth("100%"); + $oGroupList->setBorder(1); + + $oAssocGroups = new RecipientGroupMemberCollection; + $oAssocGroups->link("RecipientGroupCollection"); + $oAssocGroups->setWhere("recipientgroupmembercollection.idnewsrcp", $recipient->get("idnewsrcp")); + $oAssocGroups->setOrder("recipientgroupcollection.groupname"); + $oAssocGroups->query(); + + if ($oAssocGroups->count() == 0) + { + $oGroupList->setCell(0, 1, i18n("Recipient is not member of any group")); + } else { + // Headline + $oGroupList->setCell(0, 1, "".i18n("Groupname").""); + $oImgDel = new cHTMLImage("images/delete.gif"); + $oGroupList->setCell(0, 2, $oImgDel->render()); + $oGroupList->setCellAlignment(0, 2, "right"); + + // Data + while ($oAssocGroup = $oAssocGroups->next()) + { + $oGroup = $oAssocGroups->fetchObject("RecipientGroupCollection"); + + $oCkbRemove = new cHTMLCheckbox("ckbRemove[]", $oAssocGroup->get("idnewsgroupmember")); + echo ($oGroup->get("idnewsgroupmember")); + $oGroupList->setCell($oAssocGroup->get("idnewsgroupmember"), 1, $oGroup->get("groupname")); + $oGroupList->setCell($oAssocGroup->get("idnewsgroupmember"), 2, $oCkbRemove->toHTML(false)); + $oGroupList->setCellAlignment($oAssocGroup->get("idnewsgroupmember"), 2, "right"); + } + } + + $oForm->add(i18n("Associated Groups"), $oGroupList->render()); + + $oForm->add(i18n("Author"), $classuser->getUserName($recipient->get("author")) . " (". $recipient->get("created").")" ); + $oForm->add(i18n("Last modified by"), $classuser->getUserName($recipient->get("modifiedby")). " (". $recipient->get("lastmodified").")" ); + + $oPage->setContent($sNotis . $oForm->render(true)); +} else { + $oPage->setContent($sNotis . ""); +} + +$oPage->render(); + +?> diff --git a/conlite/plugins/newsletter/includes/include.recipients_import.php b/conlite/plugins/newsletter/includes/include.recipients_import.php new file mode 100644 index 0000000..a430346 --- /dev/null +++ b/conlite/plugins/newsletter/includes/include.recipients_import.php @@ -0,0 +1,377 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.6 + * + * {@internal + * created 2007-01-01, Bj�rn Behrens (HerrB) + * modified 2008-06-27, Dominik Ziegler, add security fix + * + * $Id: include.recipients_import.php 312 2014-06-18 11:01:08Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$oPage = new cPage; +$oRecipients = new RecipientCollection; + +if (is_array($cfg['plugins']['recipients'])) { + foreach ($cfg['plugins']['recipients'] as $plugin) { + plugin_include("recipients", $plugin."/".$plugin.".php"); + } +} + +// Check form data +if ($_REQUEST["selDelimiter"] == "") { + $_REQUEST["selDelimiter"] = "tab"; +} + +$aFields = array(); +$aFieldDetails = array(); +$aFields["name"] = strtolower(i18n("Name")); +$aFieldDetails["name"]["fieldtype"] = "field"; // field, plugin or group +$aFieldDetails["name"]["mandatory"] = false; // true or false +$aFieldDetails["name"]["type"] = "string"; // string, boolean or date +$aFieldDetails["name"]["link"] = false; // plugin name for plugins, recipient group id for groups +$aFieldDetails["name"]["col"] = -1; // Stores column index where this field has been found +$aFields["email"] = strtolower(i18n("Mail")); +$aFieldDetails["email"]["fieldtype"] = "field"; +$aFieldDetails["email"]["mandatory"] = true; +$aFieldDetails["email"]["type"] = "string"; +$aFieldDetails["email"]["link"] = false; +$aFieldDetails["email"]["col"] = -1; +$aFields["deactivated"] = strtolower(i18n("Deactivated")); +$aFieldDetails["deactivated"]["fieldtype"] = "field"; +$aFieldDetails["deactivated"]["mandatory"] = false; +$aFieldDetails["deactivated"]["type"] = "boolean"; +$aFieldDetails["deactivated"]["link"] = false; +$aFieldDetails["deactivated"]["col"] = -1; +$aFields["confirmed"] = strtolower(i18n("Confirmed")); +$aFieldDetails["confirmed"]["fieldtype"] = "field"; +$aFieldDetails["confirmed"]["mandatory"] = false; +$aFieldDetails["confirmed"]["type"] = "boolean"; +$aFieldDetails["confirmed"]["link"] = false; +$aFieldDetails["confirmed"]["col"] = -1; +$aFields["confirmeddate"] = strtolower(i18n("Confirmed Date")); +$aFieldDetails["confirmeddate"]["fieldtype"]= "field"; +$aFieldDetails["confirmeddate"]["mandatory"]= false; +$aFieldDetails["confirmeddate"]["type"] = "date"; +$aFieldDetails["confirmeddate"]["link"] = false; +$aFieldDetails["confirmeddate"]["col"] = -1; +$aFields["news_type"] = strtolower(i18n("Message type")); +$aFieldDetails["news_type"]["fieldtype"] = "field"; +$aFieldDetails["news_type"]["mandatory"] = false; +$aFieldDetails["news_type"]["type"] = "boolean"; +$aFieldDetails["news_type"]["link"] = false; +$aFieldDetails["news_type"]["col"] = -1; + +// Check out if there are any plugins +if (is_array($cfg['plugins']['recipients'])) +{ + foreach ($cfg['plugins']['recipients'] as $sPlugin) + { + if (function_exists("recipients_".$sPlugin."_wantedVariables") && function_exists("recipients_".$sPlugin."_canonicalVariables")) + { + $aPluginTitles = call_user_func("recipients_".$sPlugin."_canonicalVariables"); + $aPluginFields = call_user_func("recipients_".$sPlugin."_wantedVariables"); + foreach ($aPluginFields as $sField) + { + //if ($_REQUEST["ckb".$sField]) { + $aFields[$sField] = strtolower(str_replace(" ","", $aPluginTitles[$sField])); + $aFieldDetails[$sField]["fieldtype"]= "plugin"; + $aFieldDetails[$sField]["mandatory"]= false; + $aFieldDetails[$sField]["type"] = "string"; + $aFieldDetails[$sField]["link"] = $sPlugin; + $aFieldDetails[$sField]["col"] = -1; + //} + } + } + } +} + +// Get groups +$oRcpGroups = new RecipientGroupCollection; +$oRcpGroups->setWhere("idclient", $client); +$oRcpGroups->setWhere("idlang", $lang); +$oRcpGroups->setOrder("groupname"); +$oRcpGroups->query(); + +while ($oRcpGroup = $oRcpGroups->next()) +{ + $sField = "g" . $oRcpGroup->get($oRcpGroup->primaryKey); + + $sGroupName = $oRcpGroup->get("groupname"); + $sGroupName = str_replace(" ", "", $sGroupName); + $sGroupName = str_replace("\t", "", $sGroupName); + $sGroupName = str_replace("\n", "", $sGroupName); + $sGroupName = str_replace("\r", "", $sGroupName); + $sGroupName = str_replace("\0", "", $sGroupName); + $sGroupName = str_replace("\x0B;", "", $sGroupName); + + // Only PHP5! + //$sGroupName = str_replace(str_split(" \t\n\r\0\x0B;"), "", $oRcpGroup->get("groupname")); + + $aFields[$sField] = strtolower(clHtmlEntities(trim(i18n("Group") . "_" . $sGroupName))); + $aFieldDetails[$sField]["fieldtype"]= "group"; + $aFieldDetails[$sField]["mandatory"]= false; + $aFieldDetails[$sField]["type"] = "string"; + $aFieldDetails[$sField]["link"] = $oRcpGroup->get($oRcpGroup->primaryKey); + $aFieldDetails[$sField]["col"] = -1; +} + +if ($action == "recipients_import_exec" && $perm->have_perm_area_action("recipients", "recipients_create")) { + $_REQUEST["txtData"] = trim(stripslashes($_REQUEST["txtData"])); + + if ($_REQUEST["txtData"]) { + switch ($_REQUEST["selDelimiter"]) + { + case "semicolon": + $sDelimiter = ";"; + break; + default: + $sDelimiter = "\t"; //chr(9); + } + + //echo "
    ".nl2br(stripslashes($_REQUEST["txtData"]))."
    "; + $aLines = explode("\n", stripslashes($_REQUEST["txtData"])); + $iAdded = 0; + $iDublettes = 0; + $iInvalid = 0; + $iRow = 0; + $iCol = 0; + $bStop = false; + $sMessage = ""; + $aMessage = array(); + $aInvalidLines = array(); + $oGroupMembers = new RecipientGroupMemberCollection; + + foreach($aLines as $sLine) { + $iRow++; + + $aParts = explode($sDelimiter, trim($sLine)); + + if ($iRow == 1) { + $aInvalidLines[] = $sLine; + + foreach ($aParts as $sHeader) { + $sKey = array_search(strtolower(clHtmlEntities(trim($sHeader))), $aFields); + if ($sKey === false) { + $aMessage[] = sprintf(i18n("Given column header '%s' unknown, column ignored"), $sHeader); + } else { + $aFieldDetails[$sKey]["col"] = $iCol; + $iCol++; + } + } + foreach ($aFieldDetails as $sKey => $aDetails) { + if ($aDetails["mandatory"] && $aDetails["col"] == -1) { + $aMessage[] = sprintf(i18n("Mandatory column '%s' wasn't found, import stopped"), $aDetails[$sKey]); + $bStop = true; + } + } + if ($bStop) { + exit; + } else { + $_REQUEST["txtData"] = ""; + } + } else { + $sEMail = trim($aParts[$aFieldDetails["email"]["col"]]); + if ($aFieldDetails["name"]["col"] > -1) { + $sName = trim($aParts[$aFieldDetails["name"]["col"]]); + if ($sName == "") { + $sName = $sEMail; + } + } else { + $sName = $sEMail; + } + if ($sEMail == "") { + $aMessage[] = sprintf(i18n("Item with empty mail address found, item ignored (name: %s, row: %s)"), $sName, $iRow); + $aInvalidLines[] = $sLine; + $iInvalid++; + } else if (!isValidMail($sEMail)) { + $aMessage[] = sprintf(i18n("Mail address '%s' is invalid, item ignored (row: %s)"), $sEMail, $iRow); + $aInvalidLines[] = $sLine; + $iInvalid++; + } else if ($oRecipients->emailExists($sEMail)) { + $aMessage[] = sprintf(i18n("Recipient with mail address '%s' already exists, item skipped (row: %s)"), $sEMail, $iRow); + $aInvalidLines[] = $sLine; + $iDublettes++; + } else { + unset ($sLine); + + // Must be $recipient for plugins + if ($recipient = $oRecipients->create($sEMail, $sName)) + { + $iID = $recipient->get($recipient->primaryKey); + $iAdded++; + + unset($aPluginValue); + $aPluginValue = array(); + + foreach ($aFieldDetails as $sKey => $aDetails) + { + if ($aDetails["col"] > -1) + { + switch ($aDetails["fieldtype"]) + { + case "field": + switch ($aDetails["type"]) + { + case "boolean": + $sValue = strtolower(trim($aParts[$aDetails["col"]])); + + // html is only treated as "true", to get html messages for recipients + // - quick and dirty... + if ($sValue == "yes" || $sValue == i18n("yes") || $sValue == "true" || + (is_numeric($sValue) && $sValue > 0) || + $sValue == "html") + { + $recipient->set($sKey, 1); + + if ($sKey == "confirmed") { + // Ensure, that if a recipient is confirmed, a confirmed date + // is available. As "confirmeddate" will be set after "confirmed" + // a specified confirmeddate will overwrite this default + $recipient->set("confirmeddate", date("Y-m-d H:i:s"), false); + } + } else { + $recipient->set($sKey, 0); + } + break; + case "date": + // TODO: Check conversion: Result may be unpredictable... + $sValue = trim($aParts[$aDetails["col"]]); + $recipient->set($sKey, date("Y-m-d H:i:s", strtotime($sValue)), false); + break; + default: + $sValue = trim($aParts[$aDetails["col"]]); + $recipient->set($sKey, $sValue); + } + break; + case "plugin": + // type may be mentioned here, also, but as plugins currently can't + // specify the type, just treat everything as string + + // There may be plugins which store more than one value per plugin_store- + // function. As the plugin_store parameter is an array of values, collect + // all values in an array for later storing... unfortunately, that means, + // that we have to go through the fields array second time per item *sigh* + $aPluginValue[$aDetails["link"]][$sKey] = trim($aParts[$aDetails["col"]]); + break; + case "group": + // Add recipient to group + $sValue = strtolower(trim($aParts[$aDetails["col"]])); + + if ($sValue == "yes" || $sValue == i18n("yes") || + $sValue == "true" || (is_numeric($sValue) && $sValue > 0)) + { + $oGroupMembers->create($aDetails["link"], $iID); + } + break; + } + } + } + // Store all base data + $recipient->store(); + + // Store plugin data (to store plugin data, only, where the column has been found in the data + // should be faster than going through all plugins and store mostly empty arrays) + $sCurrentPlugin = ""; + foreach ($aFieldDetails as $sKey => $aDetails) + { + if ($aDetails["col"] > -1 && + $aDetails["fieldtype"] == "plugin" && + $aDetails["link"] !== $sCurrentPlugin) + { + $sCurrentPlugin = $aDetails["link"]; + + call_user_func("recipients_".$sCurrentPlugin."_store", $aPluginValue[$sCurrentPlugin]); + } + } + } + } + } + } + if (count($aInvalidLines) > 1) { + $_REQUEST["txtData"] = implode("\n", $aInvalidLines); + } + if (count($aMessage) > 0) { + $sMessage = $notification->returnNotification("warning", implode("
    ", $aMessage))."
    "; + } + $sMessage .= $notification->returnNotification("info", sprintf(i18n("%d recipients added, %d recipients skipped (email already exists) and %d invalid recipients/e-mail adresses ignored. Invalid recipients are shown (if any)."), $iAdded, $iDublettes, $iInvalid)); + if ($iAdded > 0) { + $oPage->setReload(); + } + } +} + +$oForm = new UI_Table_Form("properties"); +$oForm->setVar("frame", $frame); +$oForm->setVar("area", $area); +$oForm->setVar("action", "recipients_import_exec"); + +$oForm->addHeader(i18n("Import recipients")); + +$oSelDelimiter = new cHTMLSelectElement("selDelimiter"); +$aItems = array(); +$aItems[] = array("tab", i18n("Tab")); +$aItems[] = array("semicolon", i18n("Semicolon")); +$oSelDelimiter->autoFill($aItems); +$oSelDelimiter->setDefault($_REQUEST["selDelimiter"]); +$oForm->add(i18n("Delimiter"), $oSelDelimiter->render()); + +$oAreaData = new cHTMLTextarea("txtData", $_REQUEST["txtData"], 80, 20); + +$sInfo = ''.i18n("Import information").''. + '
    */"); + + foreach ($aTabs as $key => $sTab) + { + echo 'this.customTabs[\''.$sTab.'\'] = new Object();'."\n"; + + $iterator = $_cecRegistry->getIterator("Contenido.Article.GetCustomTabProperties"); + + $aTabs = array(); + while ($chainEntry = $iterator->next()) + { + $aTmpArray = $chainEntry->execute($sTab); + + if (is_array($aTmpArray)) + { + break; + } + } + echo 'this.customTabs[\''.$sTab.'\'][\'area\'] = "'.$aTmpArray[0].'";'."\n"; + echo 'this.customTabs[\''.$sTab.'\'][\'action\'] = "'.$aTmpArray[1].'";'."\n"; + echo 'this.customTabs[\''.$sTab.'\'][\'custom\'] = "'.$aTmpArray[2].'";'."\n"; + } + ?> +} + +/** + * Define required global variables + * + * @return void + * @author Jan Lengowski + * @copyright four for business AG + */ +articleObject.prototype.setGlobalVars = function(sessid, client, lang) +{ + this.sessid = sessid; + this.client = client; + this.lang = lang; +} + +/** + * Sets href to overview page, which was last visited + * + * @return void + * @author Timo Trautmann + * @copyright four for business AG + */ +articleObject.prototype.setHrefOverview = function(href) +{ + /*copy url - cut all actions*/ + if (href.match(/backend_search.php$/g)) { + + this.hrefOverview = 'javascript:top.content.left.left_top.document.getElementById(\'backend_search\').submit.click();'; + } else if (href.match(/backend_search/g) || href.match(/area=con_workflow/g)) { + this.hrefOverview = href.replace(/action=([^&]*)&?/g, ''); + } else { + this.hrefOverview = null; + } +} + +/** + * Reset properties + * + * @return void + * @author Jan Lengowski + * @copyright four for business AG + */ +articleObject.prototype.reset = function() +{ + this.idart = 0; + this.idartlang = 0; + this.idcatlang = 0; + this.idcatart = 0; + this.idlang = 0; +} + +/** + * Define required global variables + * + * @return string with attached frame & session parameters + * @author Jan Lengowski + * @copyright four for business AG + */ +articleObject.prototype.sessUrl = function(str) +{ + var tmp_str = str; + tmp_str += '&frame=' + this.frame; + tmp_str += '&'+this.sessionName+'='+this.sessid; + return tmp_str; +} + +/** + * Execute an action + * + * @return bool Action executes Yes/No + * @author Jan Lengowski + * @copyright four for business AG + */ +articleObject.prototype.doAction = function(str) +{ + + /* Flag if action will be executed. */ + var doAction = false; + + /* create messageBox instance */ + var box = new messageBox("", "", "", 0, 0); + + /* Notify Headline */ + var headline = ""; + + /* Default error string */ + var err_str = ""; + + switch (str) + { + /* Article overview mask */ + case 'con': + /* Check if required parameters are set */ + if (this.hrefOverview) { + url_str = this.hrefOverview; + doAction = true; + } else { + if ( 0 != this.idcat ) { + url_str = this.sessUrl(this.filename + "area=" + str + "&idcat=" + this.idcat + "&next=" + this.next); + doAction = true; + } else { + /* This ERROR should never happen, i.e. the property idcat will not + be reseted once set. */ + err_str = ""; + } + } + break; + + /* Edit article properties */ + case 'con_editart': + if (this.lang != 0 && this.idlang != 0 && this.lang != this.idlang) + { + err_str = "".i18n("Can't edit articles in foreign languages."); ?>"; + + if (parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0")) + { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + } else { + /* Check if required parameters are set */ + if ( 0 != this.idart && 0 != this.idcat ) { + url_str = this.sessUrl(this.filename + "area=" + str + "&action=con_edit&idart=" + this.idart + "&idcat=" + this.idcat); + doAction = true; + } else { + /* There is no selected article, + we do not have the neccessary + data to display the Article- + properties mask */ + err_str = "".i18n("No article was selected"); ?>"; + + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + } + } + break; + + /* Template configuration */ + case 'con_tplcfg': + + /* Check if required parameters are set */ + if (this.lang != 0 && this.idlang != 0 && this.lang != this.idlang) + { + err_str = "".i18n("Can't edit articles in foreign languages."); ?>"; + + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + } else { + if ( 0 != this.idart && 0 != this.idcat ) { + url_str = this.sessUrl(this.filename + "area=" + str + "&action=tplcfg_edit&idart=" + this.idart + "&idcat=" + this.idcat); + doAction = true; + } else { + /* There is no selected article, + we do not have the neccessary + data to display the Template- + configuration mask */ + err_str = "".i18n("No article was selected"); ?>"; + + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + } + } + break; + + /* Edit article */ + case 'con_editcontent': + if (this.lang != 0 && this.idlang != 0 && this.lang != this.idlang) + { + err_str = "".i18n("Can't edit articles in foreign languages."); ?>"; + + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + } else { + + /* Check if required parameters are set */ + if ( 0 != this.idart && 0 != this.idartlang && 0 != this.idcat ) { + url_str = this.sessUrl(this.filename + "area=" + str + "&action=con_editart&changeview=edit&idart=" + this.idart + "&idartlang=" + this.idartlang + "&idcat=" + this.idcat); + doAction = true; + } else { + /* There is no selected article, + we do not have the neccessary + data to display the Editor */ + err_str = "".i18n("No article was selected"); ?>"; + + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + } + } + break; + + /* Preview article */ + case 'con_preview': + + /* Check if required parameters are set */ + if ( 0 != this.idart && 0 != this.idartlang && 0 != this.idcat ) { + url_str = this.sessUrl(this.filename + "area=con_editcontent&action=con_editart&changeview=prev&idart=" + this.idart + "&idartlang=" + this.idartlang + "&idcat=" + this.idcat + "&tmpchangelang="+ this.idlang); + doAction = true; + } else { + /* There is no selected article, + we do not have the neccessary + data to display the Editor */ + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + err_str = "".i18n("No article was selected"); ?>"; + } + break; + + default: + if (this.customTabs[str]) + { + var obj = this.customTabs[str]; + if ( 0 != this.idart && 0 != this.idartlang && 0 != this.idcat ) { + url_str = this.sessUrl(this.filename + "area=" + obj["area"] + "&action=" + obj["action"] + "&idart=" + this.idart + "&idartlang=" + this.idartlang + "&idcat=" + this.idcat + "&tmpchangelang="+ this.idlang + "&" + obj["custom"]); + doAction = true; + } else { + /* There is no selected article, + we do not have the neccessary + data to display the Editor */ + if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0") ) { + menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_0"); + parent.parent.frames["right"].frames["right_top"].sub.click(menuItem); + } + err_str = "".i18n("No article was selected"); ?>"; + } + } + break; + } + + if (doAction) { + this.actionFrame.location.href = url_str; + return true; + } else { + box.notify(headline, err_str); + } + + return false; +} + +/** + * Define article and category related properties + * + * @return void + * @author Jan Lengowski + * @copyright four for business AG + */ +articleObject.prototype.setProperties = function() +{ + this.idart = arguments[0]; + this.idartlang = arguments[1]; + this.idcat = arguments[2]; + this.idcatlang = arguments[3]; + this.idcatart = arguments[4]; + this.idlang = arguments[5]; +} + +/** + * Disables the navigation + * + * @param none + * @return void + */ +articleObject.prototype.disable = function() +{ + var oRef = []; + + oRef[0] = parent.parent.frames["right"].frames["right_top"].document.getElementById( "c_0" ); + oRef[1] = parent.parent.frames["right"].frames["right_top"].document.getElementById( "c_1" ); + oRef[2] = parent.parent.frames["right"].frames["right_top"].document.getElementById( "c_2" ); + oRef[3] = parent.parent.frames["right"].frames["right_top"].document.getElementById( "c_3" ); + oRef[4] = parent.parent.frames["right"].frames["right_top"].document.getElementById( "c_4" ); + oRef[5] = parent.parent.frames["right"].frames["right_top"].document.getElementById( "c_5" ); + + if (this.vis == 1) + { + for (i=1; i + * @copyright four for business AG + * @version 0.9 + */ +function browserCheck() +{ + var agent = navigator.userAgent.toLowerCase(); + + this.IE = false; + this.NS = false; + + if (agent.indexOf("msie") >= 0) + { + this.IE = true; + this.version = parseInt(agent.appVersion); + return; + } + + if (agent.indexOf("netscape") >= 0 || agent.indexOf("mozilla") >= 0) + { + this.NS = true; + this.version = parseInt(agent.appVersion); + return; + } + +} // browserCheck + +is = new browserCheck(); diff --git a/conlite/scripts/cfoldingrow.js b/conlite/scripts/cfoldingrow.js new file mode 100644 index 0000000..55c2d31 --- /dev/null +++ b/conlite/scripts/cfoldingrow.js @@ -0,0 +1,38 @@ +/** + * + * @version $Rev: 301 $ + * + * $Id: cfoldingrow.js 301 2014-02-03 22:30:20Z oldperl $ + */ +/***************************************** +* Project : Contenido +* Descr : cFoldingRow JavaScript helpers +* +* four for business AG, www.4fb.de +*/ + +/** + * + * @param {type} image + * @param {type} row + * @param {type} hidden + * @param {type} uuid + * @returns void + */ +function cFoldingRow_expandCollapse (image, row, hidden, uuid) +{ + if (document.getElementById(image).getAttribute("data-folding-row") == "collapsed") + { + document.getElementById(row).style.display = ''; + document.getElementById(image).setAttribute("src", "images/widgets/foldingrow/expanded.gif"); + document.getElementById(image).setAttribute("data-folding-row", "expanded"); + document.getElementById(hidden).setAttribute("value", "expanded"); + register_parameter("u_register[expandstate]["+uuid+"]", "true"); + } else { + document.getElementById(row).style.display = 'none'; + document.getElementById(image).setAttribute("src", "images/widgets/foldingrow/collapsed.gif"); + document.getElementById(image).setAttribute("data-folding-row", "collapsed"); + document.getElementById(hidden).setAttribute("value", "collapsed"); + register_parameter("u_register[expandstate]["+uuid+"]", "false"); + } +} \ No newline at end of file diff --git a/conlite/scripts/cmsDate.js b/conlite/scripts/cmsDate.js new file mode 100644 index 0000000..7b82462 --- /dev/null +++ b/conlite/scripts/cmsDate.js @@ -0,0 +1,177 @@ +/** + * Project: + * Contenido Content Management System + * + * Description: + * Contenido js class for handling DHTML Calendar in class cms_date for corresponding + * cms type. It extends DHTML Calender. A select box is added, which allows users to select + * the format in which the selected date is displayed. For this functionality there are some + * modifications in DHTML Calender (calender.js) which were commented in this file + * js calendar class CmsDate.js + * + * Requirements: + * + * + * @package Contenido Backend + * @version 1.0.0 + * @author Bilal Arslan, Timo Trautmann + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release <= 4.8.7 + * + * {@internal + * created 2007-07-14 Bilal Arslan, Timo Trautmann + * $Id + * }} + * + */ + + +var cal_is_open = false; + +/** + * + * + * @param {Object} cal is the current calendar object + * @param {string} date format, what will be change + */ + +// This function gets called when the end-user clicks on some date. +function selected(cal, date){ + //aEditdata is global variable defines in include.con_editcontent.php for storage + cal.sel.innerHTML = date; // just update the date in the input field. + aEditdata[cal.sel.id] = date; + if (cal.dateClicked) { + cal.callCloseHandler(); + } +} + +/** + * Destroy or close the calendar + * + * @param {Object} cal is the current calendar object + */ +function closeHandler(cal){ + cal.hide(); // hide the calendar + cal.sel2.style.display = "none"; + cal.destroy(); + cal_is_open = false; +} +/** + * The CmsDate object constructor. + * + * @param {string} id, if of input field + * @param {date_string} format, like "b%,m%,y%" + * @param {integer} showsTime, 12 or 24 + * @param {boolean} showsOtherMonths, true or false + * @param {string} sDivSelectId, div id from select-box + * @param {string} sConPath, contenido path + * @param {string} sSelectId, select id from select-box + */ +CmsDate = function(id, format, showsTime, showsOtherMonths, sDivSelectId, sConPath, sSelectId){ + // first-time call, create the calendar. + this.cal = new Calendar(1, null, selected, closeHandler); + + // inform it what input field we use (el) + this.cal.sel = document.getElementById(id); + // get the div element from select box + this.cal.sel2 = document.getElementById(sDivSelectId); + // get the select box + this.cal.sel3 = document.getElementById(sSelectId); + this.format = format; + this.showsTime = showsTime; + this.showsOtherMonths = showsOtherMonths; + this.cal.contenido_path = sConPath; + this.cal.contenido_call_handler = this; +} + +/** + * This function creats a Calendar. + */ +CmsDate.prototype.showCalendar = function(){ + if (cal_is_open == false) { + cal_is_open = true; + // uncomment the following line to hide the week numbers + // cal.weekNumbers = false; + if (typeof this.showsTime == "string") { + this.cal.showsTime = true; + this.cal.time24 = (this.showsTime == "24"); + } + if (this.showsOtherMonths) { + this.cal.showsOtherMonths = true; + } + + this.cal.setRange(1900, 2070); // min/max year allowed. + if (this.cal.sel3.value != "" && this.cal.sel3.value != 0) { + this.cal.setDateFormat(this.cal.sel3.value); // set the specified date format + }else{ + this.cal.setDateFormat(this.format); // set the specified date format + } + this.cal.create(); + + this.cal.showAtElement(this.cal.sel); // show the calendar + // thats important! if do not this, you can not edit html in body, all thinks is disabled + window._dynarch_popupCalendar = null; + + //Select box name + this.see(); + } + return false; +} + +/** + * This function returns position information for current Element + * + * @param {Object} oElement is the current node or elemen, what is required. + */ +CmsDate.prototype.getElementPostion = function(oElement){ + var iHeigth = oElement.offsetHeight; + var iWidth = oElement.offsetWidth; + var iTop = 0, iLeft = 0; + while (oElement) { + iTop += oElement.offsetTop || 0; + iLeft += oElement.offsetLeft || 0; + oElement = oElement.offsetParent; + }; + return [iLeft, iTop, iHeigth, iWidth]; +} + +/** + * This function is for select box. It styles (to dock) in right position below the calendar. + * + * @param {string} that is the id of select box + */ +CmsDate.prototype.see = function(){ + var idCal = null; + var aDivs = document.getElementsByTagName('div'); + for (var i = 0; i < aDivs.length; i++) { + if (aDivs[i].className == 'calendar') { + idCal = aDivs[i]; + break; + } + } + + if (idCal) { + var pos = this.getElementPostion(idCal); + + // Get the id of current select box + var iId = this.cal.sel2; + iId.style.position = "absolute"; + iId.style.left = pos[0] + "px"; + iId.style.top = pos[1] + pos[2] + "px"; + iId.style.display = "block"; + } +} + +/** + * Changes the specified date format, of currently calendar object. + * + * @param {string} format + */ +CmsDate.prototype.changeFormat = function(format){ + this.cal.setDateFormat(format); // set the specified date format + this.cal.refresh(); +} + diff --git a/conlite/scripts/cmsFileList.js b/conlite/scripts/cmsFileList.js new file mode 100644 index 0000000..5f3a266 --- /dev/null +++ b/conlite/scripts/cmsFileList.js @@ -0,0 +1,426 @@ +/** + * Project: + * Contenido Content Management System + * + * Description: + * JavaScript CMS Type File List + * + * + * @package Contenido Content Types + * @version 1.0.0 + * @author Dominik Ziegler + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.13 + * + * {@internal + * created 2009-10-01 + * + * $Id: cmsFileList.js 33 2012-01-09 17:43:55Z oldperl $: + * }} + * + */ + +/** @var $ jQuery */ + +/** + * Initial function which adds all javascript events to FileList edit box and coresponding + * input elements + * + * @param string sFrameId + * @param string sImageId + * @param string sPath + * @param string sSession + * @param integer iFileListIdArtLang + * @param integer iFileListId + */ +function addFileListEvents(sFrameId, sImageId, sPath, sSession, iFileListIdArtLang, iFileListId, aFileListData, bIgnoreState) { + cmsFileList_initialize(sFrameId); + cmsFileList_loadExternalScripts(sFrameId, sPath, iFileListId); + cmsFileList_addTabbingEvents(sFrameId); + cmsFileList_addFrameShowEvent(sFrameId, sImageId); + cmsFileList_addSaveEvent(sFrameId, iFileListIdArtLang, iFileListId, aFileListData); + cmsFileList_addFrameCloseEvents(sFrameId); + cmsFileList_addManualFileListEvent(sFrameId); + cmsFileList_addClickEvent(sFrameId, iFileListId); + cmsFileList_setIgnoreExtensions(sFrameId, bIgnoreState); +} + +/** + * Appends the passed node to the end of body tag. This is necessary to have more + * control during positioning. + * + * @param string sFrameId + */ +function cmsFileList_initialize(sFrameId) { + $(sFrameId).appendTo($('body')); +} + + +/** + * Function extracts an value from FileList form an adds it as hidden to editform for submitting to Contenido + * Function is called in store proccess of FileList + * + * @param string sName + * @param string sValue + */ +function cmsFileList_appendFileListValue(sName, sValue) { + $("form[name='editcontent']").append(''); +} + +/** + * Function adds event which fades edit form to visible when editbutton is clicked + * + * @param string sFrameId + * @param string sImageId + */ +function cmsFileList_addFrameShowEvent(sFrameId, sImageId) { + $(sImageId).css('cursor', 'pointer'); + $(sImageId).click(function () { + $(sFrameId).fadeIn("normal"); + $(sFrameId).css('top', $(sImageId).offset().top); + $(sFrameId).css('left', $(sImageId).offset().left+$(sImageId).width()+3); + }); +} + +/** + * Function adds tabbling events to menubar of FileList edit form + * which switchs between the tree tabbing views + * + * @param string sFrameId + */ +function cmsFileList_addTabbingEvents(sFrameId) { + $(sFrameId+" .menu li").css('cursor', 'pointer'); + //add layer click events + $(sFrameId+" .menu li").click(function(){ + var curAction = $(this); + + $(sFrameId+" .menu li").css('font-weight', 'normal'); + + $(sFrameId+" #manual").css("display", "none"); + $(sFrameId+" #general").css("display", "none"); + $(sFrameId+" #directories").css("display", "none"); + $(sFrameId+" #filter").css("display", "none"); + //add smooth animation + curAction.css('font-weight', 'bold'); + + if (curAction.attr('class') == 'manual') { + $(sFrameId).animate({ + height: "450px", + }, 250 , 'linear', function () { + $(sFrameId+" #"+curAction.attr('class')).css('height', '386px'); + $(sFrameId+" #"+curAction.attr('class')).fadeIn("normal"); + }); + } else { + $(sFrameId).animate({ + height: "320px", + }, 250 , 'linear', function () { + $(sFrameId+" #"+curAction.attr('class')).css('height', '256px'); + $(sFrameId+" #"+curAction.attr('class')).fadeIn("normal"); + }); + } + }); +} + +/** + * Function adds save event to save button of FileListedit form + * + * @param string sFrameId + * @param integer iFileListIdArtLang + * @param integer iFileListId + */ +function cmsFileList_addSaveEvent(sFrameId, iFileListIdArtLang, iFileListId, aFileListData) { + $(sFrameId+' .save_settings').css('cursor', 'pointer'); + $(sFrameId+' .save_settings').click(function() { + cmsFileList_addManualFileListEntry(sFrameId); + + var sValue = ''; + //iterate over all FileList properties + for (var i = 0; i < aFileListData.length; i++) { + if (aFileListData[i] == 'filelist_incl_subdirectories' || aFileListData[i] == 'filelist_manual' || aFileListData[i] == 'filelist_incl_metadata' ) { + //special behaviour for checkboxes + sValue = $(sFrameId+' #'+aFileListData[i]).attr('checked'); + } else if (aFileListData[i] == 'filelist_extensions') { + //in case of manual arts implode them use , as separator + sValue = ''; + $(sFrameId+' #filelist_extensions option').each(function() { + if ( $(this).attr("selected") != "" ) { + if (sValue == '') { + sValue = $(this).attr('value'); + } else { + sValue = sValue+';'+$(this).attr('value'); + } + } + }); + } else if (aFileListData[i] == 'filelist_manual_files') { + sValue = ''; + $(sFrameId+' #filelist_manual_files option').each(function() { + if (sValue == '') { + sValue = $(this).attr('value'); + } else { + sValue = sValue+';'+$(this).attr('value'); + } + }); + } else { + //default value for select boxes and text boxes + sValue = $(sFrameId + ' #'+aFileListData[i]).attr('value'); + } + cmsFileList_appendFileListValue(aFileListData[i], sValue); + } + + sValue = ''; + $(sFrameId + ' #directories #directoryList div[class="active"]').each(function () { + sValue = sValue+';'+$(this).find('a[class="on"]').attr('title'); + }); + cmsFileList_appendFileListValue('filelist_directories', sValue); + + if ( $(sFrameId + ' #filelist_extensions').attr("disabled") == true ) { + cmsFileList_appendFileListValue('filelist_ignore_extensions', 'on'); + } else { + cmsFileList_appendFileListValue('filelist_ignore_extensions', 'off'); + } + + cmsFileList_appendFileListValue('filelist_action', 'store'); + cmsFileList_appendFileListValue('filelist_id', iFileListId); + setcontent(iFileListIdArtLang,'0'); + }); +} + +/** + * Function adds event for closing FileList edit window and fades box out + * + * @param string sFrameId + */ +function cmsFileList_addFrameCloseEvents(sFrameId) { + //add cancel image event + $(sFrameId+' .close').css('cursor', 'pointer'); + $(sFrameId+' .close').click(function () { + $(sFrameId).fadeOut("normal"); + }); + + //add cancel button event + $(sFrameId+' .filelist_cancel').css('cursor', 'pointer'); + $(sFrameId+' .filelist_cancel').click(function () { + $(sFrameId).fadeOut("normal"); + }); +} + +/** + * Function loads external styles and jquery ui scripts for FileList dynamically so this scripts were only + * loaded into contenido whren this FileList is really used in this article + * + * @param string sFrameId + * @param string sPath + */ +function cmsFileList_loadExternalScripts(sFrameId, sPath, iFileListId) { + $('head').append(''); + /* + $('head').append(''); + + $.getScript(sPath+'scripts/jscalendar/calendar.js', function() { + $.getScript(sPath+'scripts/jscalendar/lang/calendar-de.js', function() { + $.getScript(sPath+'scripts/jscalendar/calendar-setup.js', function() { + for (i = 0; i < dateFields.length; i++) { + Calendar.setup({ + inputField : dateFields[i], + ifFormat : "%d.%m.%Y", + weekNumbers : true, + firstDay : 1, + showsTime : false, + contenidoPath : sPath + }); + } + }); + }); + }); + */ + + $.getScript(sPath+'scripts/jquery/jquery-ui.js', function() { + $(sFrameId).draggable({ + handle: '.head' + }); + $(sFrameId+' .head').css('cursor', 'move'); + }); +} + +/** + * Function adds event to add new article to multiple select box for articles + * Function also checks if article is already in that list + * + * @param string sFrameId + */ +function cmsFileList_addManualFileListEvent(sFrameId) { + $(sFrameId+' #add_file').css('cursor', 'pointer').click(function() { + cmsFileList_addManualFileListEntry(sFrameId); + }); + $(sFrameId+' #rm_file').css('cursor', 'pointer').click(function() { + cmsFileList_removeManualFileListEntry(sFrameId); + }); +} + +/** + * Function adds new article to multiple select box for articles + * Function also checks if article is already in that list + * + * @param string sFrameId + */ +function cmsFileList_addManualFileListEntry(sFrameId) { + var oArt = $(sFrameId+' #filelist_filename'); + var sFilename = oArt.attr('value'); + var sName = ''; + var bExists = 0; + + if (sFilename != '') { + $(sFrameId+' #filelist_manual_files option').each(function() { + if (sFilename == $(this).attr('value')) { + bExists = 1; + } + }); + + $(sFrameId+' #filelist_filename option').each(function() { + if (sFilename == $(this).attr('value')) { + sName = $(this).html(); + } + }); + + if (bExists == 0) { + $(sFrameId+' #filelist_manual_files').prepend(''); + } + } +} + +function cmsFileList_removeManualFileListEntry(sFrameId) { + $(sFrameId+' #filelist_manual_files').find('option:selected').remove(); +} + +function cmsFileList_addNaviActions(sFrameId, iFileListId) { + $(sFrameId+' #manual #directoryList a[class="on"]').parent('div').unbind('click'); + $(sFrameId+' #manual #directoryList a[class="on"]').parent('div').click(function () { + var dirname = $(this).children('a[class="on"]').attr('title'); + $.ajax({ + type: "POST", + url: sPath+"ajaxmain.php", + data: "ajax=filelist&dir=" + dirname + "&id=" + iFileListId + "&idartlang=" + iIdArtLang + "&contenido="+sSession, + success: function(msg){ + $(sFrameId+' #manual #filelist_filename').replaceWith(msg); + } + }); + + return false; + }); + + $(sFrameId+' #directories #directoryList a[class="on"]').parent('div').unbind('click'); + $(sFrameId+' #directories #directoryList a[class="on"]').parent('div').click(function () { + if ($(this).hasClass('active')) { + $(this).removeClass('active'); + } else { + $(this).addClass('active'); + } + + return false; + }); + + $(sFrameId+' #directoryList em a').unbind('click'); + $(sFrameId+' #directoryList em a').click(function () { + var divContainer = $(this).parent().parent(); + var dirname = $(this).parent('em').parent().find('a[class="on"]').attr('title'); + + if(divContainer.next('ul').length > 0) { + divContainer.next('ul').toggle(function () { + if (divContainer.next('ul').css('display') == 'none') { + divContainer.parent().addClass('collapsed'); + } else { + divContainer.parent().removeClass('collapsed'); + } + }); + + } else { + $.ajax({ + type: "POST", + url: sPath+"ajaxmain.php", + data: "ajax=dirlist&dir=" + dirname + "&id=" + iFileListId + "&idartlang=" + iIdArtLang + "&contenido="+sSession, + success: function(msg){ + divContainer.after(msg); + divContainer.parent('li').removeClass('collapsed'); + cmsFileList_addNaviActions(sFrameId, iFileListId); + } + }); + } + + return false; + }); +} + +/** + * Function adds double click events to all current listed articles for manual FileList + * in case of a double click this selected article is removed from list + * + * @param string sFrameId + */ +function cmsFileList_addClickEvent(sFrameId, iFileListId) { + cmsFileList_addNaviActions(sFrameId, iFileListId); + cmsFileList_addExtensionActions(sFrameId, iFileListId); + + if ( $(sFrameId+' #filelist_manual').attr('checked') == true ) { + $(sFrameId+' #manual_filelist_setting').css("display", "block"); + } else { + $(sFrameId+' #manual_filelist_setting').css("display", "none"); + } + + $(sFrameId+' #filelist_manual').click(function () { + $(sFrameId+' #manual_filelist_setting').slideToggle(); + }); + + if ( $(sFrameId+' #filelist_incl_metadata').attr('checked') == true ) { + $(sFrameId+' #metaDataList').css("display", "block"); + } else { + $(sFrameId+' #metaDataList').css("display", "none"); + } + + $(sFrameId+' #filelist_incl_metadata').click(function () { + $(sFrameId+' #metaDataList').slideToggle(); + }); + + $(sFrameId+' #filelist_manual_files').dblclick(function() { + $(sFrameId+' #filelist_manual_files option').each(function() { + if($(this).attr('selected')) { + $(this).remove(); + }; + }); + }); +} + +function cmsFileList_addExtensionActions(sFrameId, iFileListId) { + $(sFrameId+' #filelist_all_extensions').css('cursor', 'pointer'); + $(sFrameId+' #filelist_ignore_extensions').css('cursor', 'pointer'); + + $(sFrameId+' #filelist_ignore_extensions').click(function () { + if ( $(sFrameId+' #filelist_extensions').attr("disabled") == true ) { + cmsFileList_setIgnoreExtensions( sFrameId, 'false' ); + } else { + cmsFileList_setIgnoreExtensions( sFrameId, 'true' ); + } + + return false; + }); + + $(sFrameId+' #filelist_all_extensions').click(function () { + if ( $(sFrameId+' #filelist_extensions').attr("disabled") == false ) { + $(sFrameId+' #filelist_extensions option').each(function() { + $(this).attr("selected", "selected"); + }); + } + }); +} + +function cmsFileList_setIgnoreExtensions(sFrameId, bIgnoreState) { + if ( bIgnoreState == 'false' ) { + $(sFrameId+' #filelist_extensions').removeAttr("disabled"); + $(sFrameId+' #filelist_ignore_extensions').css("font-weight", "normal").html(sLabelIgnoreExtensionsOff); + } else { + $(sFrameId+' #filelist_extensions').attr("disabled", "disabled"); + $(sFrameId+' #filelist_ignore_extensions').css("font-weight", "bold").html(sLabelIgnoreExtensionsOn); + } +} \ No newline at end of file diff --git a/conlite/scripts/cmsTeaser.js b/conlite/scripts/cmsTeaser.js new file mode 100644 index 0000000..4832b32 --- /dev/null +++ b/conlite/scripts/cmsTeaser.js @@ -0,0 +1,268 @@ +/** + * Project: + * Contenido Content Management System + * + * Description: + * JavaScript CMS Type Teaser + * + * + * @package Contenido Content Types + * @version 1.0.0 + * @author Timo Trautmann + * @copyright four for business AG + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.12 + * + * {@internal + * created 2009-04-08 + * + * $Id: cmsTeaser.js 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + + +/** + * Initial function which adds all javascript events to teaser edit box and coresponding + * input elements + * + * @param string sFrameId + * @param string sImageId + * @param string sPath + * @param string sSession + * @param integer iIdArtLang + * @param integer iId + */ +function addTeaserEvents(sFrameId, sImageId, sPath, sSession, iIdArtLang, iId) { + cmsTeaser_initialize(sFrameId); + cmsTeaser_loadExternalScripts(sFrameId, sPath); + cmsTeaser_addTabbingEvents(sFrameId); + cmsTeaser_addFrameShowEvent(sFrameId, sImageId); + cmsTeaser_addSaveEvent(sFrameId, iIdArtLang, iId); + cmsTeaser_addFrameCloseEvents(sFrameId); + cmsTeaser_addAjaxGetArticleListEvent(sFrameId, sPath, sSession); + cmsTeaser_addManualTeaserEvent(sFrameId); + cmsTeaser_addClickEvent(sFrameId); +} + +/** + * Appends the passed node to the end of body tag. This is necessary to have more + * control during positioninig. + * + * @param string sFrameId + */ +function cmsTeaser_initialize(sFrameId) { + $(sFrameId).appendTo($('body')); +} + +/** + * Function extracts an value from teaser form an adds it as hidden to editform for submitting to Contenido + * Function is called in store proccess of teaser + * + * @param string sName + * @param string sValue + */ +function cmsTeaser_appendTeaserValue(sName, sValue) { + $("form[name='editcontent']").append(''); +} + +/** + * Function adds event which fades edit form to visible when editbutton is clicked + * + * @param string sFrameId + * @param string sImageId + */ +function cmsTeaser_addFrameShowEvent(sFrameId, sImageId) { + $(sImageId).css('cursor', 'pointer'); + $(sImageId).click(function () { + $(sFrameId).fadeIn("normal"); + $(sFrameId).css('top', $(sImageId).offset().top); + $(sFrameId).css('left', $(sImageId).offset().left+$(sImageId).width()+3); + }); +} + +/** + * Function adds tabbling events to menubar of teaser edit form + * which switchs between the tree tabbing views + * + * @param string sFrameId + */ +function cmsTeaser_addTabbingEvents(sFrameId) { + $(sFrameId+" .menu li").css('cursor', 'pointer'); + //add layer click events + $(sFrameId+" .menu li").click(function(){ + $(sFrameId+" .menu li").css('font-weight', 'normal'); + + $(sFrameId+" #manual").css("display", "none"); + $(sFrameId+" #advanced").css("display", "none"); + $(sFrameId+" #general").css("display", "none"); + //add smooth animation + $(sFrameId+" #"+$(this).attr('class')).fadeIn("normal"); + $(this).css('font-weight', 'bold'); + }); +} + +/** + * Function adds save event to save button of teaseredit form + * + * @param string sFrameId + * @param integer iIdArtLang + * @param integer iId + */ +function cmsTeaser_addSaveEvent(sFrameId, iIdArtLang, iId) { + $(sFrameId+' .save_settings').css('cursor', 'pointer'); + $(sFrameId+' .save_settings').click(function() { + cmsTeaser_addManualTeaserEntry(sFrameId); + var sValue = ''; + //iterate over all teaser properties + for (var i = 0; i < aData.length; i++) { + if (aData[i] == 'teaser_start' || aData[i] == 'teaser_manual') { + //special behaviour for checkboxes + sValue = $(sFrameId+' #'+aData[i]).attr('checked'); + } else if (aData[i] == 'teaser_manual_art') { + //in case of manual arts implode them use , as separator + sValue = ''; + $(sFrameId+' #teaser_manual_art option').each(function() { + if (sValue == '') { + sValue = $(this).attr('value'); + } else { + sValue = sValue+';'+$(this).attr('value'); + } + }); + } else { + //default value for select boxes and text boxes + sValue = $(sFrameId+' #'+aData[i]).attr('value'); + } + cmsTeaser_appendTeaserValue(aData[i], sValue); + } + cmsTeaser_appendTeaserValue('teaser_action', 'store'); + cmsTeaser_appendTeaserValue('teaser_id', iId); + setcontent(iIdArtLang,'0'); + }); +} + +/** + * Function adds event for closing teaser edit window and fades box out + * + * @param string sFrameId + */ +function cmsTeaser_addFrameCloseEvents(sFrameId) { + //add cancel image event + $(sFrameId+' .close').css('cursor', 'pointer'); + $(sFrameId+' .close').click(function () { + $(sFrameId).fadeOut("normal"); + }); + + //add cancel button event + $(sFrameId+' .teaser_cancel').css('cursor', 'pointer'); + $(sFrameId+' .teaser_cancel').click(function () { + $(sFrameId).fadeOut("normal"); + }); +} + +/** + * Function gets new list of articles from contenido via ajax + * is used in manual teaser when base category for article select + * is changed + * + * @param string sFrameId + * @param string sPath + * @param string sSession + */ +function cmsTeaser_addAjaxGetArticleListEvent(sFrameId, sPath, sSession) { + $(sFrameId+' #teaser_cat').change(function() { + //get new article select and replace it with default value + $.ajax({ + type: "POST", + url: sPath+"ajaxmain.php", + data: "ajax=artsel&name=teaser_art&contenido="+sSession+"&idcat="+$(this).attr('value'), + success: function(msg){ + $(sFrameId+' #teaser_art').replaceWith(msg); + } + }); + }); +} + +/** + * Function loads external styles and jquery ui scripts for teaser dynamically so this scripts were only + * loaded into contenido whren this teaser is really used in this article + * + * @param string sFrameId + * @param string sPath + */ +function cmsTeaser_loadExternalScripts(sFrameId, sPath) { + $('head').append(''); + + $.getScript(sPath+'scripts/jquery/jquery-ui.js', function() { + $(sFrameId).draggable({handle: '.head'}); + $(sFrameId+' .head').css('cursor', 'move'); + }); +} + +/** + * Function adds event to add new article to multiple select box for articles + * Function also checks if article is already in that list + * + * @param string sFrameId + */ +function cmsTeaser_addManualTeaserEvent(sFrameId) { + $(sFrameId+' #add_art').css('cursor', 'pointer'); + $(sFrameId+' #add_art').click(function() { + //call internal add function + cmsTeaser_addManualTeaserEntry(sFrameId); + }); +} + +/** + * Function adds new article to multiple select box for articles + * Function also checks if article is already in that list + * + * @param string sFrameId + */ +function cmsTeaser_addManualTeaserEntry(sFrameId) { + var oArt = $(sFrameId+' #teaser_art'); + var iIdArt = oArt.attr('value'); + var sName = ''; + var bExists = 0; + + //if an article was selected + if (iIdArt > 0) { + //check if article already exists in view list + $(sFrameId+' #teaser_manual_art option').each(function() { + if (iIdArt == $(this).attr('value')) { + bExists = 1; + } + }); + + //get name of selected article + $(sFrameId+' #teaser_art option').each(function() { + if (iIdArt == $(this).attr('value')) { + sName = $(this).html(); + } + }); + + //if it is not in list, add article to list + if (bExists == 0) { + $(sFrameId+' #teaser_manual_art').append(''); + } + } +} + +/** + * Function adds double click events to all current listed articles for manual teaser + * in case of a double click this selected article is removed from list + * + * @param string sFrameId + */ +function cmsTeaser_addClickEvent(sFrameId) { + $(sFrameId+' #teaser_manual_art').dblclick(function() { + $(sFrameId+' #teaser_manual_art option').each(function() { + if($(this).attr('selected')) { + $(this).remove(); + }; + }); + }); + +} \ No newline at end of file diff --git a/conlite/scripts/conFrameResize.js b/conlite/scripts/conFrameResize.js new file mode 100644 index 0000000..54408a5 --- /dev/null +++ b/conlite/scripts/conFrameResize.js @@ -0,0 +1,352 @@ +/** + * conFrameResize Class $Id: conFrameResize.js 2 2011-07-20 12:00:48Z oldperl $ + * + * Controls the Contenido frame toggling and resizing + * + * @author Jan Lengowski + * @copyright four for business AG + * @version 0.9 + * + * $Author: oldperl $ $Date: 2011-07-20 14:00:48 +0200 (Wed, 20 Jul 2011) $ + * $RCSfile: conFrameResize.js,v $ + */ +function conFrameResize(parentFrameId, frameOne, frameTwo, frameThree, frameFour) +{ + /* Class correctly initialized */ + this.ok = false; + + /* Is the user dragging the frame */ + this.drag = false; + + /* Mouse cursor position */ + this.x = 0; + + /* Cursor offset */ + this.dragDiff = 15; + + /* Actual size of the frame */ + this.size = 200; + + /* Default frame size */ + this.defaultSize = 200; + + /* Optimal size (Without scrollbars) */ + this.optimalSize = 200; + + /* Id of the frameset, contenido default + is 'contentFrame' */ + this.frameSetId = parentFrameId || 'contentFrame'; + + /* Object reference main frameset */ + this.frameSet = ''; + + /* References to the 4 Contenido frames */ + this.frames = []; + + /* Name of the frames + LeftTop, LeftBottom, RightTop, RightBottom */ + this.frameNames = []; + this.frameNames[1] = frameOne || 'left_top'; + this.frameNames[2] = frameTwo || 'left_bottom'; + this.frameNames[3] = frameThree || 'right_top'; + this.frameNames[4] = frameFour || 'right_bottom'; + + /* Object reference to the left image */ + this.imgLeft = document.getElementById( 'toggleImage' ); + + /* Left image source */ + this.imgLeftSrc = 'images/toggle_frame_left.gif'; + + /* Right image source */ + this.imgRightSrc = 'images/toggle_frame_right.gif'; + + /* Neutral image src */ + this.spacerImage = 'images/spacer.gif' + + /* Object reference to the right image */ + this.imgRight = ''; + + /* Status of the frame 'hidden', 'normal' or 'drag' */ + this.status = 'normal'; + + /* Value of the col attribute in normal pos */ + this.colValHidden = '*,100%'; + + /* Value of the col attribute in hidden pos */ + this.colValNormal = '200,100%'; + + /* Value of the col attribute in resizable pos */ + this.colValDrag = ',100%'; + + /* Value of the col attribute in resizable pos */ + this.colValPrevious = ''; + + /* Number of frames initialized */ + this.count = 0; + + /* Drag cell id - defaults to 'dragcell' */ + this.dragCellId = 'dragcell'; + + /* Object reference to the drag cell */ + this.dragObj = false; +} + +/** + * Toggle the status of the frame 'show', 'hidden' + * + * @param none + * @return none + */ +conFrameResize.prototype.toggle = function() +{ + if (this.ok) + { + if (this.status == 'normal') + { + this.size = 0; + this.colValPrevious = this.frameSet.cols; + this.frameSet.cols = this.colValHidden; + this.imgRight.src = this.imgRightSrc; + this.imgRight.style.cursor = "pointer"; + this.status = 'hidden'; + } + else if (this.status == 'hidden') + { + /* Change image sources */ + this.imgRight.src = this.spacerImage; + + /* Cursor style */ + this.imgRight.style.cursor = "default"; + + /* Resize frameset */ + this.frameSet.cols = this.colValPrevious; + + /* Set status to normal */ + this.status = 'normal'; + + /* Resetting drag size */ + this.dragSize = this.defaultSize; + } + else if (this.status == 'dragged') + { + /* Change image sources */ + this.imgRight.src = this.spacerImage; + + /* Cursor style */ + this.imgRight.style.cursor = "default"; + + /* Resize frameset */ + this.frameSet.cols = this.colValNormal; + + /* Set status to normal */ + this.status = 'normal'; + + /* Resetting drag size */ + this.size = this.defaultSize; + } + } +} + +/** + * Initialize the Class + * + * @param none + * @return void + */ +conFrameResize.prototype.init = function() +{ + /* Create reference to other frames with this + init method because of different load times */ + this.frameSet = document.getElementById(this.frameSetId); + + /* Reference to the "show" image */ + this.imgRight = window.frames["right"][this.frameNames[3]].document.getElementById('toggleimage'); + + // Class is correcty initialized + this.ok = true; +} + +/** + * Init a frame with all events + * @param none + * @return none + */ +conFrameResize.prototype.initFrame = function() +{ + this.count ++; + + if (this.count == 4) + { + for (i=2; i 0) + { + this.optimalSize = refs[0].offsetWidth; + } +} + + +/** + * Resize the layer while 'dragging' + * + * @param int Resize by this value in pixels + * @return void + */ +conFrameResize.prototype.dragTo = function(px) +{ + this.size = px; + this.status = 'dragged'; + + if (this.size < this.defaultSize) + { // Smallest size is default size + this.size = this.defaultSize; + } + + this.frameSet.cols = this.size + this.colValDrag; +} + +/** + * Set mouse position capturing for + * netscape and mozilla. + * + * @param none + * @return none + */ +conFrameResize.prototype.captureMousePosition = function() +{ + with (this.frames[1]) + { + // Capture events + document.captureEvents(Event.MOUSEMOVE); + + // Capture mouse position + document.onmousemove = function(e) + { + frameResize.x = e.pageX; + + if (frameResize.drag) + { + frameResize.dragTo(frameResize.dragDiff + frameResize.x); + } + + return true; + } + + // Leave drag mode + document.onmouseup = function() + { + frameResize.drag = false; + frameResize.dragPosX = 0; + } + } +} +/** + * Set the Drag events + * + * @param string Id of the Drag Element + * @return true + */ +conFrameResize.prototype.setDragEvents = function(id) +{ + if (is.NS) + { + this.dragObj = this.frames[1].document.getElementById(id); + + this.dragObj.onmouseover = function() + { + this.style.cursor = 'hand'; + } + + this.dragObj.onmousedown = function() + { + this.style.cursor = 'move'; + + frameResize.drag = true; + frameResize.dragPosX = frameResize.x; + frameResize.dragDiff = frameResize.size - frameResize.dragPosX; + } + + this.dragObj.onmouseup = function() + { + this.style.cursor = 'default'; + + frameResize.drag = false; + + if (frameResize.x == frameResize.dragPosX) + { + frameResize.toggle(); + } + } + } + + if (is.IE) + { + this.dragObj = window.frames[this.frameNames[1]].document.getElementById(id); + + this.dragObj.onmouseover = function() + { + this.style.cursor = 'hand'; + } + + this.dragObj.onclick = function() + { + frameResize.toggle(); + } + } +} + +/** + * Leave drag mode + * @param none + * @access private + */ +conFrameResize.prototype.stopDrag = function() +{ + this.drag = false; +} + +/** + * Calc total height of given objects + * + **/ +conFrameResize.prototype.totalHeight = function(elements) + { + var sum=0; + for(var i=0; i + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.9 + * + * {@internal + * created 2008-09-05 + * modified 2009-01-23, Ortwin Pinke, BUG-Fix in setFocus first parameter for execInstanceCommand has to be the Id of Tinyobject, not the object itself + * + * $Id: con_tiny.js 2 2011-07-20 12:00:48Z oldperl $: + * }} + * + */ + +var first = true; + +function myCustomSetupContent(editor_id, body, doc) { + tinyMCE.get(editor_id).setContent(tinyMCE.get(editor_id).getContent()); + //body.innerHTML = "my new content" + body.innerHTML; +} + + +/** + * Callback function for tiny which gets a selected image in Contenido + * image browser, close browser and set this selected image in tiny + */ +function updateImageFilebrowser () +{ + //error handling + if (!fb_handle.left) + { + return; + } + + if (!fb_handle.left.left_top) + { + return; + } + + if (!fb_handle.left.left_top.document.getElementById("selectedfile")) + { + return; + } + + + if (fb_handle.left.left_top.document.getElementById("selectedfile").value != "") + { + //get selected image from popup and close it + fb_win.document.forms[0].elements[fb_fieldname].value = fb_handle.left.left_top.document.getElementById("selectedfile").value; + + fb_handle.close(); + window.clearInterval(fb_intervalhandle); + + //set this selected image in tiny + if (fb_win.ImageDialog != null && fb_win.ImageDialog.showPreviewImage) + { + fb_win.ImageDialog.showPreviewImage(fb_win.document.forms[0].elements[fb_fieldname].value); + } + } +} + +/** + * Function converts a givenn url for use in contenido (callback of tiny) + * + * @param string url - url which should be converted + * @param object node - corresponding node object + * @param object on_save - event handler + * + * @return string - converted url + */ +function CustomURLConverter(url, node, on_save) { + var src = url; + + if (!src.match(/^https?:\/\//g)) { + url = frontend_path+src; + } + + return url; +} + +/** + * Function converts a given content string (callback of tiny) + * + * @param string type - type of content + * @param string value - string of content + * + * @return string - converted content + */ +function CustomCleanupContent(type, value) { + switch (type) { + case "get_from_editor": + case "insert_to_editor": + // Remove xhtml styled tags + value = value.replace(/[\s]*\/>/g,'>'); + break; + } + + return value; +} + +/** + * Function stores content of current opened tiny into global var aEditdata + * this content is later stored by submitting setcontent() + * Notice: Global js vars were defined in include.con_editcontent.php + */ +function storeCurrentTinyContent() { + //store last tiny changes if tiny is still open + if (tinyMCE.getInstanceById(active_object)) { + var content = tinyMCE.get(active_object).getContent(); + content = content.replace(frontend_path, ''); + aEditdata[active_id] = content; + } +} + +/** + * Function gets all content stored in aEditdata and sends it as string to server + * for storage it into database + * Notice: Global js vars were defined in include.con_editcontent.php + * + * @param integer idartlang - idartlang of article which is currently edited + * @param string act - actionurl of form (optional) + */ +function setcontent(idartlang, act) { + //do not ask user for storage + bCheckLeave = false; + //check if there is still a tiny open and get its content + storeCurrentTinyContent(); + + var str = ''; + //forach content in js array aEditdata + for (var sId in aEditdata) { + //check if content has changed, if it has serialize it to string + if (aEditdataOrig[sId] != aEditdata[sId]) { + var data = sId.split("_"); + + // data[0] is the fieldname * needed + // data[1] is the idtype + // data[2] is the typeid * needed + + // build the string which will be send + str += buildDataEntry(idartlang , data[0] , data[2] , prepareString(aEditdata[sId])); + } + } + + // set the string + document.forms.editcontent.data.value = str + document.forms.editcontent.data.value; + + // set the action string + if ( act != 0 ) { + document.forms.editcontent.action = act; + } + + // submit the form + document.forms.editcontent.submit(); +} + +/** + * Function escapes chars in content for inserting into submit string. + * An empty content   is replaced by %$%EMPTY%$% + * | were seperators in string and were replaced by %$%SEPERATOR%$% + * + * @param string aContent - content which should be escaped + * @return string - string with escaped chars + */ +function prepareString(aContent) { + if ( aContent == " " || aContent == "" ) { + aContent = "%$%EMPTY%$%"; + } else { + // if there is an | in the text set a replacement chr because we use it later as isolator + while( aContent.search(/\|/) != -1 ) { + aContent = aContent.replace(/\|/,"%$%SEPERATOR%$%"); + } + } + + return aContent; +} + +/** + * Function serializes given args to string and return it. Seperator is | + * + * @param integer idartlang - idartlang of article which is currently edited + * @param string type - type name of content (CMS_HTML) + * @param integer typeid - id of content (CMS_HTML[4] => 4) + * @param string value - value of content + * @return string - serialized vars + */ +function buildDataEntry(idartlang, type, typeid, value) { + return idartlang +'|'+ type +'|'+ typeid +'|'+ value +'||'; +} + +/** + * Function adds a custom content type to submit strings, adds all other content + * information and submits it to server using setcontent() + * + * @param integer idartlang - idartlang of article which is currently edited + * @param string type - type name of content (CMS_HTML) + * @param integer typeid - id of content (CMS_HTML[4] => 4) + * @param string value - value of content + */ +function addDataEntry(idartlang, type, typeid, value) { + document.forms.editcontent.data.value = (buildDataEntry(idartlang, type, typeid, prepareString(value) ) ); + + setcontent(idartlang,'0'); +} + +/** + * Function closses currently opened tiny + * + */ +function closeTiny() { + //check if tiny is currently open + if (tinyMCE.getInstanceById(active_object)) { + //save current tiny content to js var + storeCurrentTinyContent(); + + //if content was empty set div height. Empty divs were ignored by most browsers + if (aEditdata[active_id] == '') { + document.getElementById(active_id).style.height = '15px'; + } + //close current open tiny and set active vars to null + tinyMCE.execCommand('mceRemoveControl', false, active_object); + active_id = null; + active_object = null; + } +} + +/** + * Function swaps tiny to a content editable div. If tiny is already open on + * another div, this tiny was swapped to current div by closing it first + * tiny swaps on click + * Notice: Global js vars were defined in include.con_editcontent.php + * + * @param object obj - div object which was clicked + */ +function swapTiny(obj) { + //check if tiny is currently open + closeTiny(); + + //rest tinymce configs defined in include.con_editcontent.php + tinyMCE.settings = tinymceConfigs; + //set clicked object as active object + active_id = obj.id; + active_object = obj; + + //show thiny and focus it + tinyMCE.execCommand('mceAddControl', true, obj); + setFocus(); + + //remove height information of clicked div + document.getElementById(active_id).style.height = ''; +} + +/** + * Function sets focus on toggled editor if its loading proccess was completed + * + */ +function setFocus() { + var activeTinyId = tinyMCE.getInstanceById(active_object); + if (!activeTinyId) { + window.setTimeout('setFocus()', 50); + } else { + tinyMCE.execInstanceCommand(activeTinyId, 'mceFocus', false); + } +} + +/** + * Callback function of Tiny which opens contenido file browser in popup + * Notice: Global js vars were defined in include.con_editcontent.php + * (image_url, file_url, flash_url, media_url) + * + * @param string field_name - Name of relevant HTML field + * @param string url - Tiny default but not used in function + * @param string type - Type of content to add (image, file, ..) + * @param Object win - Corresponding window object + */ +function myCustomFileBrowser(field_name, url, type, win) { + switch (type) + { + case "image": + fb_handle = window.open(image_url, "filebrowser", "dialog=yes,resizable=yes"); + fb_fieldname = field_name; + fb_win = win; + fb_intervalhandle = window.setInterval("updateImageFilebrowser()", 250); + break; + case "file": + fb_handle = window.open(file_url, "filebrowser", "dialog=yes,resizable=yes"); + fb_fieldname = field_name; + fb_win = win; + fb_intervalhandle = window.setInterval("updateImageFilebrowser()", 250); + break; + case "flash": + fb_handle = window.open(flash_url, "filebrowser", "dialog=yes,resizable=yes"); + fb_fieldname = field_name; + fb_win = win; + fb_intervalhandle = window.setInterval("updateImageFilebrowser()", 250); + break; + case "media": + fb_handle = window.open(media_url, "filebrowser", "dialog=yes,resizable=yes"); + fb_fieldname = field_name; + fb_win = win; + fb_intervalhandle = window.setInterval("updateImageFilebrowser()", 250); + break; + default: + alert(type); + break; + } +} + +/** + * Function like storeCurrentTinyContent() which stores original content to + * global array aEditdataOrig for a later decision if content has changed + * + * @param string sContent - original content string + */ +function updateContent(sContent) { + //if original content was already set do not overwrite + //this happens if tiny is reopened on same content + if (aEditdataOrig[active_id] == undefined) { + sContent = sContent.replace(frontend_path, ''); + aEditdataOrig[active_id] = sContent; + } +} + +/** + * Function checks if content has changed if user leaves page. + * Then he has the possiblity to save this content. So there is no + * guess, that changes get lost. + * Notice: Global js vars were defined in include.con_editcontent.php + * (aEditdata, aEditdataOrig, sQuestion, iIdartlang) + */ +function leave_check() { + //If tiny is still open store its content + storeCurrentTinyContent(); + + //Check if any content in aEditdata was changed + var bAsk = false; + for (var sId in aEditdata) { + if (aEditdataOrig[sId] != aEditdata[sId]) { + bAsk = true; + } + } + + //If content was changed and global var bCheckLeave is set to true + //ask user if he wants to save content + //ex bCheckLeave is false when user clicks save button. This is also + //a case in which he leaves this page but by pressing save button he + //also saves all changes + if (bAsk && bCheckLeave) { + check = confirm(sQuestion); + //If he wants to save content call function setcontent(); + if (check == true) { + setcontent(iIdartlang, '0'); + } + } +} diff --git a/conlite/scripts/contenidoConfig.js b/conlite/scripts/contenidoConfig.js new file mode 100644 index 0000000..6fa38f2 --- /dev/null +++ b/conlite/scripts/contenidoConfig.js @@ -0,0 +1,305 @@ +/***************************************** +* +* $Id: contenidoConfig.js 2 2011-07-20 12:00:48Z oldperl $ +* +* File : $RCSfile: contenidoConfig.js,v $ +* Project : +* Descr : +* +* Author : $Author: oldperl $ +* Modified : $Date: 2011-07-20 14:00:48 +0200 (Wed, 20 Jul 2011) $ +* +* four for business AG, www.4fb.de +******************************************/ + +/** + * ContenidoConfig Class + * + * Contenido configuration object + * + * @author Jan Lengowski + * @copyright four for business AG + */ +function contenidoConfig( instanceName ,actionFrameName ) { + + /* Name of the Instance for external calls + or CallBacks. Defaults to 'cfg' */ + this.instanceName = instanceName || 'cfg'; + + /* Name of the Actionframe. Defaults to 'left_bottom' */ + this.actionFrameName = actionFrameName || 'left_bottom'; + + /* Reference to the Actionframe */ + this.actionFrame = parent.frames[this.actionFrameName]; + + /* Element references Array */ + this.objRef = []; + + /* Userright properties Array */ + this.hasRight = []; + this.hasRight['template'] = 0; + this.hasRight['template_cfg'] = 0; + this.hasRight['online'] = 0; + this.hasRight['public'] = 0; + this.hasRight['syncable'] = 0; + + /* Actionstatus */ + this.action = ''; + + /* Status */ + this.status = false; + + /* Template ID */ + this.tplId = 0; + + /* New template id */ + this.nTplId = null; + + /* Online flag */ + this.isOnline = 0; + + /* Public flag */ + this.isPublic = 0; + + /* Category ID */ + this.catId = 0; + + /* idString */ + this.idString = 0; + +} // end function + +/** + * Initializes the class. + * This method should be overwritten if the + * class is used in an other area beside 'con'. + * Stuff is HARDCODED for 'con' ATM + * + * @param string Id of the On-/offline image + * @param string Id of the Lock/Unlock image + * @param string Id of the Template select + */ +contenidoConfig.prototype.init = function( imgOnlineId, imgPublicId, imgSelectId, imgTemplateCfgId) { + + this.objRef = this.createRefs( imgOnlineId, imgPublicId, imgSelectId, imgTemplateCfgId); + + if ( this.objRef.length == 4 ) { + + this.status = true; + /* Set the object ID's */ + this.objRef[1].setId('online'); + this.objRef[2].setId('lock'); + this.objRef[3].setId('template_cfg'); + + // HARDCODED STUFF + this.objRef[1].setImgSrc( 'images/online.gif', 'images/offline.gif' ); + this.objRef[2].setImgSrc( 'images/folder_delock.gif', 'images/folder_lock.gif'); + this.objRef[3].setImgSrc( 'images/but_cat_conf2.gif', 'images/but_cat_conf2.gif' ); + return true; + } + +} // end function + +/** + * Loads a configuration and calls + * the updateScreen method + * + * @param int Contenido Template Id + * @param int Contenido Online flag + * @param int Contenido Public flag + */ +contenidoConfig.prototype.load = function( Idcat, Idtpl, Online, Public, RightTpl, RightOn, RightPublic, RightTemplateCfg, RightIsSyncable, idString ) { + this.catId = Idcat; + this.tplId = Idtpl; + this.isOnline = Online; + this.isPublic = Public; + this.idString = idString; + + this.hasRight['template'] = RightTpl; + this.hasRight['template_cfg'] = RightTemplateCfg; + this.hasRight['online'] = RightOn; + this.hasRight['public'] = RightPublic; + this.hasRight['syncable'] = RightIsSyncable; + + this.updateScreen(); + +} // end function + +/** + * Creates objects of class HTMLObj + * + * @param args string ID's of the objects + * @return array Array storing the objects + */ +contenidoConfig.prototype.createRefs = function() { + + var objects = new Array; + + for ( i = 0; i < arguments.length; i ++ ) { + objects[i] = new HTMLObj( arguments[i] ); + } + + return objects; + +} // end function + +/** + * Updates the screen with the + * given class cfg information + * @return void + */ +contenidoConfig.prototype.updateScreen = function() { + if ( this.status ) { + /* Template select dropdown */ + if ( this.hasRight['template'] == 1 ) { + + /* User has right to change + the template, enable dropdown, select template */ + this.objRef[0].obj.removeAttribute( "disabled" ); + this.objRef[0].select(this.tplId); + + } else { + + /* User has NO right to change + the template, disable the dropdown */ + this.objRef[0].obj.setAttribute( "disabled", "true" ); + this.objRef[0].select(this.tplId); + } + + /* On-/Offline */ + if ( 0 == this.isOnline && this.hasRight['online'] == 1 ) { + this.objRef[1].over(); + + } else if ( 1 == this.isOnline && this.hasRight['online'] == 1 ) { + this.objRef[1].out(); + + } else if ( 0 == this.hasRight['online'] ) { + this.objRef[1].lock(); + } + + /* Public / Non-Public */ + if ( 0 == this.isPublic && 1 == this.hasRight['public'] ) { + this.objRef[2].over(); + } else if ( 1 == this.isPublic && 1 == this.hasRight['public'] ) { + this.objRef[2].out() ; + } else { + this.objRef[2].lock(); + } + + /* Template Config button */ + if (this.hasRight['template_cfg'] == 1) { + this.objRef[3].out(); + } else { + this.objRef[3].lock(); + } + + } // end if this.status + +} // end function + +/** + * Set the action property and + * execute it + * @param string action + */ +contenidoConfig.prototype.setAction = function(action) { + + //this.actionFrame.location.href = action; + +} // end function + +/** + * Change template for a marked category + * + * @return void + * @author Jan Lengowski + * @copyright four for business AG + */ +contenidoConfig.prototype.changeTemplate = function() { + + if ( this.catId && this.hasRight['template'] == 1 ) { + + /* create action string */ + str = ""; + str += "main.php?area=con"; + str += "&action=con_changetemplate"; // action + str += "&frame=2"; // frame 2 + str += "&idcat=" + cfg.catId; // idcat of marked category + str += "&idtpl=" + this.objRef[0].getValue(); // id of selected template + str += "&contenido=" + sid; // contenido session id + + /* execute action */ + this.setAction(str); + + /* set flag for changed template */ + this.nTplId = this.objRef[0].getValue(); + this.tplId = this.objRef[0].getValue(); + } +} + +/** + * Return template changed status + * + * @return bool has template changed? + */ +contenidoConfig.prototype.templateChanged = function () { + + return ( this.nTplId != null ) ? true : false; + +} // end function + + + +/** + * Return the rowId String + * @return String RowId String + */ +contenidoConfig.prototype.getRowId = function() { + + /* Build the data string. + 0 -> category id + 1 -> category template id + 2 -> category online + 3 -> category public + 4 -> has right for: template + 5 -> has right for: online + 6 -> has right for: public + 7-> has right for template_cfg + 8-> category is syncable*/ + + var sRowId = ""; + + sRowId += this.catId + "-"; + sRowId += this.tplId + "-"; + sRowId += this.isOnline + "-"; + sRowId += this.isPublic + "-"; + sRowId += this.hasRight['template'] + "-"; + sRowId += this.hasRight['online'] + "-"; + sRowId += this.hasRight['public'] + "-"; + sRowId += this.hasRight['template_cfg'] + "-"; + sRowId += this.hasRight['syncable']; + + return sRowId; + +} // end function + +/** + * Reset the config object -> load default values; + * @return String RowId String + */ +contenidoConfig.prototype.reset = function() { + + this.catId = 0; + this.tplId = 0; + this.isOnline = 0; + this.isPublic = 0; + + this.hasRight['template_cfg'] = 0; + this.hasRight['template'] = 0; + this.hasRight['online'] = 0; + this.hasRight['public'] = 0; + + this.updateScreen(); + +} // end function + diff --git a/conlite/scripts/contextMenu.js b/conlite/scripts/contextMenu.js new file mode 100644 index 0000000..2a44f75 --- /dev/null +++ b/conlite/scripts/contextMenu.js @@ -0,0 +1,112 @@ +var display_url; + +function createMenu (menuname, items, links) +{ + document.writeln('
    '); + document.writeln('
    Context Menu
    '); + for (var i=0;i'); + } else { + document.writeln(''); + } + } + + document.writeln('
    '); + + document.getElementById(menuname).style.display=''; +} + +var ie5=document.all&&document.getElementById +var ns6=document.getElementById&&!document.all +if (ie5||ns6) +//var menuobj=document.getElementById("ie5menu") + +function showmenuie5(e){ + +if (ie5) +{ + menuobj = document.getElementById(window.event.srcElement.getAttribute("helpid")); +} else +{ + menuobj = document.getElementById(e.target.getAttribute("helpid")); +} + + +//Find out how close the mouse is to the corner of the window +var rightedge=ie5? document.body.clientWidth-event.clientX : window.innerWidth-e.clientX +var bottomedge=ie5? document.body.clientHeight-event.clientY : window.innerHeight-e.clientY + +//if the horizontal distance isn't enough to accomodate the width of the context menu +if (rightedge level ) { + preButton.src = sCollapseButton; + preButton.title = sCollapseString; + preButton.alt = sCollapseString; + preButton.parentNode.href = 'javascript:changeVisibility(\''+aStatrows[(i-1)].id+'\', '+(preAIds.length-1)+', '+aIds[preAIds.length-1]+');'; + } + preButton = oButton; + preAIds = aIds; + level = aIds.length; + } + } + } +} + +function changeVisibility (sIdClicked, iLevel, iIdCat) { + var sDisplay = ''; + var aIdsClicked = sIdClicked.split('_'); + + var oButton = document.getElementById (sIdClicked+'_img'); + + if (oButton.src.match(/open_all.gif/)) { + oButton.src = sCollapseButton; + oButton.title = sCollapseString; + oButton.alt = sCollapseString; + if (bMsie) { + sDisplay = 'block'; + } else { + sDisplay = 'table-row'; + } + } else { + oButton.src = sExpandButton; + oButton.title = sExpandString; + oButton.alt = sExpandString; + sDisplay = 'none'; + } + + var preButton = null; + var level = iLevel; + var aStatrows = document.getElementsByTagName('tr'); + + for (var i = 0; i < aStatrows.length; i++) { + var aIds = aStatrows[i].id.split('_'); + + if (aIds[iLevel] == iIdCat) { + if (sDisplay == 'none' && aIds.length > aIdsClicked.length) { + aStatrows[i].style.display = sDisplay; + + var oButton = aStatrows[i].getElementsByTagName('img')[1]; + if (oButton && oButton.id == aStatrows[i].id+'_img') { + if (aIds.length > level && preButton) { + preButton.src = sExpandButton; + preButton.title = sExpandString; + preButton.alt = sExpandString; + } + preButton = oButton; + level = aIds.length; + } + } else if ((aIdsClicked.length+1) == aIds.length) { + aStatrows[i].style.display = sDisplay; + } + } + } +} \ No newline at end of file diff --git a/conlite/scripts/general.js b/conlite/scripts/general.js new file mode 100644 index 0000000..7cec836 --- /dev/null +++ b/conlite/scripts/general.js @@ -0,0 +1,68 @@ +/****************************************** +* File : general.js +* Project : Contenido +* Descr : Defines general required +* javascript functions +* +* Author : Jan Lengowski +* Created : 25.03.2003 +* Modified : $Date: 2011-07-20 14:00:48 +0200 (Wed, 20 Jul 2011) $ +* +* $Id: general.js 2 2011-07-20 12:00:48Z oldperl $ + +* four for business AG +******************************************/ + +/** + * Javascript Multilink + * + * Example: + * + * conMultiLink ( + * "frame", + * "link", + * "frame", + * "link", + * ..., + * "simpleFrame" + * ) + * + * + * @param [arguments*] optional amount of arguments used pairwise for assigning URLs to frame names in Contenido. + * The last argument is optional but must (!) be "simpleFrame" if used to specify that the complete frame structure is not available. + * @return void + * + * @author Jan Lengowski + * @author Marco Jahn + * @author Frederic Schneider + * @copryright four for business AG + */ +function conMultiLink() +{ + // get last argument + var tmp = arguments[arguments.length-1]; + // check by last argument if reduced frame structure is used + var simpleFrame = (tmp == "simpleFrame") ? true : false ; + // change for-loop counter if last parameter is used to identify simple frame multilinks + var len = (simpleFrame) ? arguments.length - 1 : arguments.length; + + for (var i = 0; i < len; i += 2) { + f = arguments[i]; + l = arguments[i + 1]; + + if (f == "left_bottom" || f == "left_top") { + parent.parent.frames["left"].frames[f].location.href = l; + } else { + if (simpleFrame) { // use simple frame + parent.frames[f].location.href = l; + } else { // use classic multilink structure + parent.parent.frames["right"].frames[f].location.href = l; + } + } + } +} + +function handleErrors() { + + return true; +} \ No newline at end of file diff --git a/conlite/scripts/group_association.js b/conlite/scripts/group_association.js new file mode 100644 index 0000000..dc77b0f --- /dev/null +++ b/conlite/scripts/group_association.js @@ -0,0 +1,144 @@ +/***************************************** +* +* $Id: group_association.js 2 2011-07-20 12:00:48Z oldperl $ +* +* File : $RCSfile: group_association.js,v $ +* Project : Contenido +* Descr : File contains java script functions for filtering users in select areas, handling short keys and submitting form +* This functions are used in template template.grouprights_memberselect.html +* +* Author : $Author: timo.trautmann$ +* Modified : $Date: 2011-07-20 14:00:48 +0200 (Wed, 20 Jul 2011) $ +* +* four for business AG, www.4fb.de +******************************************/ + + +var keycode = 0; //last pressed key +var addAction = ''; //contenidoaction for adding user to group - (different fpr frontentgroups and backendgroups) +var deleteAction = ''; //contenidoaction for removing user from group - (different fpr frontentgroups and backendgroups) + +/** + * Initialization of previous defined variables + * + * @param string add - adding user contenido action + * @param string del - removing user contenido action + * + */ +function init(add, del) { + addAction = add; + deleteAction = del; +} + +/** + * Function submits form when users were added to group or removed from group + * + * @param string isAdded - contenido action string + * + */ +function setAction(isAdded) { + var selectId = null; + //case of adding new members + if (isAdded == addAction) { + selectId = 'newmember'; + document.group_properties.action.value = addAction; + //case of removing existing members + } else { + selectId = 'user_in_group'; + document.group_properties.action.value = deleteAction; + } + + var sSelectBox = document.getElementById(selectId); + //only submit form, if a user is selected + if (sSelectBox.selectedIndex != -1) { + document.group_properties.submit(); + } +} + +/** + * Function filters entries in select box and shows only relevant users for selection + * + * @param string id - id of textbox, which contains the search string + * + */ +function filter (id) { + //get search string ans buid regular expression + var sFilterValue = document.getElementById(id).value; + var oReg = new RegExp(sFilterValue,"gi"); + + //build id of corresponding select box + var sSelectId = id.replace(/_filter_value/, ''); + + //get select box and corresponding options + var sSelectBox = document.getElementById(sSelectId); + var oOptions = sSelectBox.getElementsByTagName('option'); + + //remove all options + var iLen = oOptions.length; + for (var i=0; i